Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

boa convert doesn't work with outputs (multiple packages in one build) #358

Open
raybellwaves opened this issue Jul 6, 2023 · 2 comments

Comments

@raybellwaves
Copy link

I'm guess outputs may be the issues and i'm not sure what the desired recipe.yaml would look like if someone converts it by hand.

Take the rich meta.yaml (https://github.com/conda-forge/rich-feedstock/blob/main/recipe/meta.yaml)

if you run boa convert meta.yaml -> recipe.yaml it outputs

OrderedDict([('package', {'name': 'rich'}), ('build', {}), ('requirements', {'host': ['pip', 'poetry-core >=1.0.0', 'python {{ min_python }}'], 'run': ['markdown-it-py >=2.2.0', 'pygments >=2.13.0,<3.0.0', 'python {{ min_python }}', 'typing_extensions >=4.0.0,<5.0.0']}), ('test', {'imports': ['rich'], 'commands': ['pip check'], 'requires': ['pip']})])
OrderedDict([('package', {'name': 'rich-with-jupyter'}), ('build', {}), ('requirements', {'host': ['python {{ min_python }}'], 'run': ['{{ pin_subpackage("rich", max_pin="x.x.x") }}', 'ipywidgets >=7.5.1,<9.0.0', 'python {{ min_python }}']}), ('test', {'imports': ['rich'], 'commands': ['pip check'], 'requires': ['pip']})])
OrderedDict([('package', {'name': '_rich-with-tests'}), ('build', {}), ('requirements', {'host': ['python {{ min_python }}'], 'run': ['{{ pin_subpackage("rich", max_pin="x.x.x") }}', '{{ pin_subpackage("rich-with-jupyter", max_pin="x.x.x") }}', 'python {{ min_python }}']}), ('test', {'source_files': ['src/tests'], 'imports': ['rich'], 'commands': ['pip check', 'pytest src/tests -vv --cov=rich --cov-branch --cov-report=term-missing:skip-covered --no-cov-on-fail --cov-fail-under=91'], 'requires': ['attrs', 'pip', 'pytest >=7.0.0,<8.0.0', 'pytest-cov >=3.0.0,<4.0.0']})])
context:
  min_python: '>=3.7.0'
  version: 13.4.2

package:
  name: rich-split
  version: '{{ version }}'

source:
  - folder: dist
    url: https://pypi.io/packages/source/r/rich/rich-{{ version }}.tar.gz
    sha256: d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898
  - folder: src
    url: https://github.com/Textualize/rich/archive/refs/tags/v{{ version }}.tar.gz
    sha256: 12840a1eb0400792d2d12a57c7ede779b6eacf8f27718618127adbc1749c1a91

build:
  noarch: python
  number: 0

requirements:
  host:
    - python {{ min_python }}
  run:
    - python {{ min_python }}

outputs:
  - package:
      name: rich
    build: {}
    requirements:
      host:
        - pip
        - poetry-core >=1.0.0
        - python {{ min_python }}
      run:
        # sync with normalized deps from poetry-generated setup.py
        - markdown-it-py >=2.2.0
        - pygments >=2.13.0,<3.0.0
        - python {{ min_python }}
        - typing_extensions >=4.0.0,<5.0.0
    test:
      imports:
        - rich
      commands:
        - pip check
      requires:
        - pip

  - package:
      name: rich-with-jupyter
    build: {}
    requirements:
      host:
        - python {{ min_python }}
      run:
        - '{{ pin_subpackage("rich", max_pin="x.x.x") }}'
        - ipywidgets >=7.5.1,<9.0.0
        - python {{ min_python }}
    test:
      imports:
        - rich
      commands:
        - pip check
      requires:
        - pip

  - package:
      name: _rich-with-tests
    build: {}
    requirements:
      host:
        - python {{ min_python }}
      run:
        - '{{ pin_subpackage("rich", max_pin="x.x.x") }}'
        - '{{ pin_subpackage("rich-with-jupyter", max_pin="x.x.x") }}'
        - python {{ min_python }}
    test:
      source_files:
        - src/tests
      imports:
        - rich
      commands:
        - pip check
        - pytest src/tests -vv --cov=rich --cov-branch --cov-report=term-missing:skip-covered --no-cov-on-fail --cov-fail-under=91
      requires:
        - attrs
        - pip
        - pytest >=7.0.0,<8.0.0
        - pytest-cov >=3.0.0,<4.0.0

about:
  home: https://github.com/Textualize/rich
  license: MIT
  license_family: MIT
  license_file: dist/LICENSE
  summary: Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal

  description: |
    Rich is a Python library for rich text and beautiful formatting in the terminal.

    The Rich API makes it easy to add color and style to terminal output. Rich
    can also render pretty tables, progress bars, markdown, syntax highlighted
    source code, tracebacks, and more — out of the box.

  doc_url: https://rich.readthedocs.io
  dev_url: https://github.com/Textualize/rich

extra:
  feedstock-name: rich
  recipe-maintainers:
    - jan-janssen
    - willmcgugan
    - bollwyvl

I don't think the OrderedDict at the top is valid yaml?

If I try and use this recipe I get

boa build test --output-folder /tmp/boa:

❯ boa build test --output-folder /tmp/boa

           _
          | |__   ___   __ _
          | '_ \ / _ \ / _` |
          | |_) | (_) | (_| |
          |_.__/ \___/ \__,_|


Loading config files:

Updating build index: /tmp/boa

Traceback (most recent call last):
  File "/Users/ray/miniforge3/envs/main/bin/boa", line 10, in <module>
    sys.exit(main())
  File "/Users/ray/miniforge3/envs/main/lib/python3.10/site-packages/boa/cli/boa.py", line 244, in main
    run_build(args)
  File "/Users/ray/miniforge3/envs/main/lib/python3.10/site-packages/boa/core/run_build.py", line 502, in run_build
    all_recipes = find_all_recipes(args.target, config, is_pyproject_recipe)  # [noqa]
  File "/Users/ray/miniforge3/envs/main/lib/python3.10/site-packages/boa/core/run_build.py", line 53, in find_all_recipes
    yml = render(fn, config=config, is_pyproject_recipe=is_pyproject_recipe)
  File "/Users/ray/miniforge3/envs/main/lib/python3.10/site-packages/boa/core/render.py", line 184, in render
    ydoc = loader.load(fi)
  File "/Users/ray/miniforge3/envs/main/lib/python3.10/site-packages/ruamel/yaml/main.py", line 426, in load
    return constructor.get_single_data()
  File "/Users/ray/miniforge3/envs/main/lib/python3.10/site-packages/ruamel/yaml/constructor.py", line 111, in get_single_data
    node = self.composer.get_single_node()
  File "_ruamel_yaml.pyx", line 706, in _ruamel_yaml.CParser.get_single_node
  File "_ruamel_yaml.pyx", line 724, in _ruamel_yaml.CParser._compose_document
  File "_ruamel_yaml.pyx", line 775, in _ruamel_yaml.CParser._compose_node
  File "_ruamel_yaml.pyx", line 891, in _ruamel_yaml.CParser._compose_mapping_node
  File "_ruamel_yaml.pyx", line 904, in _ruamel_yaml.CParser._parse_next_event
ruamel.yaml.parser.ParserError: while parsing a block mapping
  in "test/recipe.yaml", line 1, column 1
did not find expected key
  in "test/recipe.yaml", line 1, column 41
@wolfv
Copy link
Member

wolfv commented Jul 7, 2023

Hi @raybellwaves,

indeed, the convert command only works for really simple cases.

There are some differences with outputs (there is no notion of a "top-level" recipe in boa).

Maybe you can convert your recipe manually? I am also happy to help

@raybellwaves
Copy link
Author

Thanks for the offer. I kept it simple and just did boa-base-recipe and boa-recipe. One is no deps and the other is full deps and I didn't do pinning of subpackages

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants