add androscalpel crate

This commit is contained in:
Jean-Marie Mineau 2023-08-31 11:14:24 +02:00
parent 6562c3f6c0
commit 53a30fad23
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
10 changed files with 541 additions and 1 deletions

120
androscalpel/.github/workflows/CI.yml vendored Normal file
View file

@ -0,0 +1,120 @@
# This file is autogenerated by maturin v1.2.3
# To update, run
#
# maturin generate-ci github
#
name: CI
on:
push:
branches:
- main
- master
tags:
- '*'
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
linux:
runs-on: ubuntu-latest
strategy:
matrix:
target: [x86_64, x86, aarch64, armv7, s390x, ppc64le]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist --find-interpreter
sccache: 'true'
manylinux: auto
- name: Upload wheels
uses: actions/upload-artifact@v3
with:
name: wheels
path: dist
windows:
runs-on: windows-latest
strategy:
matrix:
target: [x64, x86]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.10'
architecture: ${{ matrix.target }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist --find-interpreter
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v3
with:
name: wheels
path: dist
macos:
runs-on: macos-latest
strategy:
matrix:
target: [x86_64, aarch64]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist --find-interpreter
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v3
with:
name: wheels
path: dist
sdist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
command: sdist
args: --out dist
- name: Upload sdist
uses: actions/upload-artifact@v3
with:
name: wheels
path: dist
release:
name: Release
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
needs: [linux, windows, macos, sdist]
steps:
- uses: actions/download-artifact@v3
with:
name: wheels
- name: Publish to PyPI
uses: PyO3/maturin-action@v1
env:
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
with:
command: upload
args: --non-interactive --skip-existing *

72
androscalpel/.gitignore vendored Normal file
View file

@ -0,0 +1,72 @@
/target
# Byte-compiled / optimized / DLL files
__pycache__/
.pytest_cache/
*.py[cod]
# C extensions
*.so
# Distribution / packaging
.Python
.venv/
env/
bin/
build/
develop-eggs/
dist/
eggs/
lib/
lib64/
parts/
sdist/
var/
include/
man/
venv/
*.egg-info/
.installed.cfg
*.egg
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
pip-selfcheck.json
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
# Rope
.ropeproject
# Django stuff:
*.log
*.pot
.DS_Store
# Sphinx documentation
docs/_build/
# PyCharm
.idea/
# VSCode
.vscode/
# Pyenv
.python-version

12
androscalpel/Cargo.toml Normal file
View file

@ -0,0 +1,12 @@
[package]
name = "androscalpel"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
name = "androscalpel"
crate-type = ["cdylib"]
[dependencies]
pyo3 = "0.19.0"

View file

@ -0,0 +1,16 @@
[build-system]
requires = ["maturin>=1.2,<2.0"]
build-backend = "maturin"
[project]
name = "androscalpel"
requires-python = ">=3.7"
classifiers = [
"Programming Language :: Rust",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
]
[tool.maturin]
features = ["pyo3/extension-module"]

28
androscalpel/src/apk.rs Normal file
View file

@ -0,0 +1,28 @@
//! Representation of an apk.
use crate::Class;
use pyo3::prelude::*;
/// Represent an apk.
#[pyclass]
#[derive(Debug, Clone)]
pub struct Apk {
#[pyo3(get, set)]
pub classes: Vec<Class>,
}
impl Apk {
/// Add the content of a dex file to the apk.
pub fn add_dex_file(&mut self) {
todo!()
}
}
#[pymethods]
impl Apk {
#[new]
fn new() -> Self {
Self { classes: vec![] }
}
}

29
androscalpel/src/class.rs Normal file
View file

@ -0,0 +1,29 @@
//! Representation of a class.
use pyo3::prelude::*;
/// Represent an apk
#[pyclass]
#[derive(Debug, Clone)]
pub struct Class {
#[pyo3(get, set)]
pub name: String,
}
#[pymethods]
impl Class {
#[new]
pub fn new() -> Self {
Self {
name: "plop".into(),
}
}
pub fn __str__(&self) -> String {
self.name.clone()
}
pub fn __repr__(&self) -> String {
self.name.clone()
}
}

15
androscalpel/src/lib.rs Normal file
View file

@ -0,0 +1,15 @@
use pyo3::prelude::*;
pub mod apk;
pub mod class;
pub use apk::*;
pub use class::*;
/// Androscalpel.
#[pymodule]
fn androscalpel(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_class::<Class>()?;
m.add_class::<Apk>()?;
Ok(())
}