Git Product home page Git Product logo

freecad-stubs's Introduction

freecad-stubs

PyPI version GitHub license PyPI pyversions

Python stubs generated from FreeCAD source code.

Install stubs

You can install all stubs for freeCAD packages by running:

python -m pip install freecad-stubs 

If you installed this package, then you probably develop some FreeCAD components/scripts. You should remember to set up your IDE by adding path to the real FreeCAD libraries, especially for modules written mainly in python (ex. Draft), because this package does not provide stubs for that module ๐Ÿ˜• (yet - you may contribute).

Also note that App or Gui are only aliases available in FreeCAD. To fully use advantage of stubs you should always import a module you are referencing (ex. import FreeCADGui as Gui).

Generating stubs manually

Package on pypi always has stubs generated for the newest freecad (master branch). If you need older version you may try to install specific version from pypi or manually run a tool from this repository to generate stubs.

Stub source

Stubs are generated based on several available info:

  • *Py.xml files - mainly docstrings, argument names, properties.
  • corresponding *PyImp.cpp file - argument types are extracted from C code.
  • other *.cpp files - functions or modules.

Unfortunately not all typing information may be generated. For example some objects are added dynamically. There are also many special cases therefore not all object are correctly mapped. Moreover, some of C function has errors - invalid types, missing arguments (you can see more these errors if you change logger flag in configuration file freecad-stubs/lib/freecad_stub_gen/config.py)

Stub Generation

  1. Clone freecad repository.

    git clone https://github.com/FreeCAD/FreeCAD.git

    Warning: FreeCAD repository has over 1.29 GB

    You may download only these required folders:

    • /src/App
    • /src/Base
    • /src/Gui
    • /src/Main
    • /src/Mod
  2. Clone this repository

    git clone https://github.com/ostr00000/freecad-stubs
  3. Configure paths
    In the file freecad-stubs/lib/freecad_stub_gen/config.py set desired configuration:

    • SOURCE_DIR - src folder from FreeCAD repository,
    • TARGET_DIR - target folder where stubs should be generated.

      Warning: TARGET_DIR folder and its content may be removed when generating stubs.

  4. Run the main file from this project in Python

    pytohn freecad-stubs/lib/freecad_stub_gen/__main__.py

    Required python version: >=3.10.

Adding stubs to python path

At this point stubs must be already generated. There are a lot of possible methods. This is only example:

  1. Copy stubs from TARGET_DIR to location of your choice. For example:.

    cp -r ./freecad_stubs "$HOME/.local/lib/python3.9/freecad_stubs" 
  2. Add location with stubs to python search path. For example:

    echo "$HOME/.local/lib/python3.9/freecad_stubs" > "$HOME/.local/lib/python3.9/site-packages/freecad_stubs.pth" 

Implementation progress

Stub source

  • generate class stub (xml files):
    • property in xml,
    • dynamic property added in cpp,
    • method (+ static/class method),
    • rich comparison (ex. __eq__ method),
    • number protocol (ex. __add__ method),
  • generate class stub (cpp files):
    • dynamically added in init_type(),
  • generate functions stub (cpp files):
    • declared in PyMethodDef array,
    • dynamically added in module constructor (subclass Py::ExtensionModule),

Stub quality

  • found class/function/method name,
  • copy docstring (+ generate property docstring),
  • guess argument names from docstrings,
  • found function/method argument types based on c-api,
  • function/method return type,
  • raised exception in docstrings,
  • property getter type,
  • property setter type,
  • add comment "This class can be imported" for importable classes,
  • dynamically generated exceptions,

freecad-stubs's People

Contributors

ostr00000 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.