cube-js / cube

📊 Cube — The Semantic Layer for Building Data Applications
https://cube.dev
Other
17.91k stars 1.77k forks source link

Allow to import Python files from `cube.py` #8443

Open drummerwolli opened 3 months ago

drummerwolli commented 3 months ago

Describe the bug I would like to move some code out of the cube.py file as it becomes very large and hard to maintain. But I fail to make it work in the cube docker container to import the outsourced files. also, unit testing my functions becomes impossible, because if i try to import the functions from cube.py the imports fail (there is no possibility to import this line: from cube import config).

To Reproduce

  1. create the following files in one repo:

cube.py

from cube import config
from cube_utils import test_function

@config('query_rewrite')
def query_rewrite(query: dict, ctx: dict) -> dict:
    query = test_function(query)
    return query

cube_utils.py

def test_function(query: dict) -> dict:
    # do something
    return query

Dockerfile

FROM cubejs/cube:v0.35.57

COPY cube.py /cube/conf/
COPY cube_utils.py /cube/conf/
  1. build the docker file:

docker build -f test.Dockerfile -t cube .

  1. run the docker container:
docker run -it cube                                         

Cube Error ---------------------------------------

Error: Python error: ModuleNotFoundError: No module named 'cube_utils'
Traceback (most recent call last):
  File "cube.py", line 2, in <module>
    from cube_utils import test_function

Expected behavior Cube API should start without a problem with the above setup.

Screenshots n/a, see above

Minimally reproducible Cube Schema

not needed, see above.

Version: v0.35.57

drummerwolli commented 3 months ago

one solution: add this line in your cube.py file before adding imports from other files:

sys.path.append(os.path.dirname(os.path.abspath(__file__)))