codeplain 0.1.1__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. codeplain-0.2.1/.flake8 +28 -0
  2. codeplain-0.2.1/.github/workflows/lint-and-test.yml +126 -0
  3. codeplain-0.2.1/.github/workflows/nofity-slack-on-main-merge.yml +22 -0
  4. codeplain-0.2.1/.github/workflows/publish-to-pypi.yml +86 -0
  5. codeplain-0.2.1/.gitignore +30 -0
  6. codeplain-0.2.1/.vscode/launch.json +21 -0
  7. codeplain-0.2.1/.vscode/settings.json +32 -0
  8. {codeplain-0.1.1 → codeplain-0.2.1}/PKG-INFO +14 -33
  9. {codeplain-0.1.1 → codeplain-0.2.1}/codeplain_REST_api.py +111 -35
  10. codeplain-0.2.1/concept_utils.py +216 -0
  11. {codeplain-0.1.1 → codeplain-0.2.1}/config/__init__.py +0 -1
  12. codeplain-0.2.1/diff_utils.py +32 -0
  13. codeplain-0.2.1/docs/generate_cli.py +20 -0
  14. codeplain-0.2.1/docs/plain2code_cli.md +66 -0
  15. codeplain-0.2.1/docs/plain_language_specification.md +250 -0
  16. codeplain-0.2.1/docs/starting_a_plain_project_from_scratch.md +94 -0
  17. codeplain-0.2.1/event_bus.py +45 -0
  18. codeplain-0.2.1/examples/example_hello_world_golang/config.yaml +3 -0
  19. codeplain-0.2.1/examples/example_hello_world_golang/harness_tests/hello_world_test.go +30 -0
  20. codeplain-0.2.1/examples/example_hello_world_golang/hello_world_golang.plain +13 -0
  21. codeplain-0.2.1/examples/example_hello_world_golang/run.sh +35 -0
  22. codeplain-0.2.1/examples/example_hello_world_python/config.yaml +3 -0
  23. codeplain-0.2.1/examples/example_hello_world_python/harness_tests/hello_world_display/test_hello_world.py +17 -0
  24. codeplain-0.2.1/examples/example_hello_world_python/hello_world_python.plain +19 -0
  25. codeplain-0.2.1/examples/example_hello_world_python/run.sh +20 -0
  26. codeplain-0.2.1/examples/example_hello_world_react/harness_tests/hello_world_display/cypress/e2e/hello_world.cy.ts +6 -0
  27. codeplain-0.2.1/examples/example_hello_world_react/harness_tests/hello_world_display/cypress/support/e2e.ts +8 -0
  28. codeplain-0.2.1/examples/example_hello_world_react/harness_tests/hello_world_display/cypress.config.ts +12 -0
  29. codeplain-0.2.1/examples/example_hello_world_react/harness_tests/hello_world_display/package.json +44 -0
  30. codeplain-0.2.1/examples/example_hello_world_react/harness_tests/hello_world_display/tsconfig.json +10 -0
  31. codeplain-0.2.1/examples/example_hello_world_react/hello_world_react.plain +11 -0
  32. codeplain-0.2.1/examples/example_hello_world_react/run.sh +29 -0
  33. codeplain-0.2.1/examples/run.sh +39 -0
  34. {codeplain-0.1.1 → codeplain-0.2.1}/file_utils.py +34 -24
  35. {codeplain-0.1.1 → codeplain-0.2.1}/git_utils.py +84 -19
  36. codeplain-0.2.1/install.sh +217 -0
  37. codeplain-0.2.1/memory_management.py +97 -0
  38. codeplain-0.2.1/module_renderer.py +149 -0
  39. codeplain-0.2.1/plain2code.py +248 -0
  40. {codeplain-0.1.1 → codeplain-0.2.1}/plain2code_arguments.py +30 -4
  41. {codeplain-0.1.1 → codeplain-0.2.1}/plain2code_console.py +12 -3
  42. codeplain-0.2.1/plain2code_events.py +62 -0
  43. codeplain-0.2.1/plain2code_logger.py +127 -0
  44. codeplain-0.2.1/plain2code_state.py +39 -0
  45. {codeplain-0.1.1 → codeplain-0.2.1}/plain2code_utils.py +8 -26
  46. codeplain-0.2.1/plain_file.py +703 -0
  47. codeplain-0.2.1/plain_modules.py +135 -0
  48. {codeplain-0.1.1 → codeplain-0.2.1}/plain_spec.py +7 -5
  49. codeplain-0.2.1/pyproject.toml +115 -0
  50. codeplain-0.2.1/pytest.ini +7 -0
  51. codeplain-0.2.1/render_machine/__init__.py +0 -0
  52. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/analyze_specification_ambiguity.py +9 -7
  53. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/commit_conformance_tests_changes.py +11 -5
  54. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/commit_implementation_code_changes.py +2 -1
  55. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/create_dist.py +6 -6
  56. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/exit_with_error.py +6 -1
  57. codeplain-0.2.1/render_machine/actions/finish_functional_requirement.py +18 -0
  58. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/fix_conformance_test.py +48 -38
  59. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/fix_unit_tests.py +10 -8
  60. codeplain-0.2.1/render_machine/actions/prepare_repositories.py +73 -0
  61. codeplain-0.2.1/render_machine/actions/prepare_testing_environment.py +40 -0
  62. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/refactor_code.py +12 -10
  63. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/render_conformance_tests.py +42 -29
  64. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/render_functional_requirement.py +29 -12
  65. codeplain-0.2.1/render_machine/actions/run_conformance_tests.py +73 -0
  66. codeplain-0.2.1/render_machine/actions/run_unit_tests.py +46 -0
  67. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/summarize_conformance_tests.py +10 -6
  68. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/code_renderer.py +21 -3
  69. codeplain-0.2.1/render_machine/conformance_tests.py +169 -0
  70. codeplain-0.2.1/render_machine/implementation_code_helpers.py +26 -0
  71. codeplain-0.2.1/render_machine/render_context.py +448 -0
  72. codeplain-0.2.1/render_machine/render_types.py +186 -0
  73. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/render_utils.py +17 -9
  74. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/state_machine_config.py +50 -18
  75. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/states.py +1 -1
  76. codeplain-0.2.1/requirements.txt +19 -0
  77. codeplain-0.2.1/resources/codeplain_overview.png +0 -0
  78. codeplain-0.2.1/resources/plain_example.png +0 -0
  79. codeplain-0.2.1/spinner.py +88 -0
  80. codeplain-0.2.1/standard_template_library/golang-console-app-template.plain +29 -0
  81. codeplain-0.2.1/standard_template_library/python-console-app-template.plain +24 -0
  82. codeplain-0.2.1/standard_template_library/typescript-react-app-boilerplate.plain +8 -0
  83. {codeplain-0.1.1 → codeplain-0.2.1}/standard_template_library/typescript-react-app-template.plain +5 -10
  84. codeplain-0.2.1/test_scripts/run_conformance_tests_cypress.sh +255 -0
  85. codeplain-0.2.1/test_scripts/run_conformance_tests_golang.sh +87 -0
  86. codeplain-0.2.1/test_scripts/run_conformance_tests_python.sh +79 -0
  87. codeplain-0.2.1/test_scripts/run_unittests_golang.sh +49 -0
  88. codeplain-0.2.1/test_scripts/run_unittests_python.sh +73 -0
  89. codeplain-0.2.1/test_scripts/run_unittests_react.sh +66 -0
  90. codeplain-0.2.1/tests/__init__.py +1 -0
  91. codeplain-0.2.1/tests/conftest.py +34 -0
  92. codeplain-0.2.1/tests/data/imports/circular_imports_1.plain +8 -0
  93. codeplain-0.2.1/tests/data/imports/circular_imports_2.plain +8 -0
  94. codeplain-0.2.1/tests/data/imports/circular_imports_main.plain +12 -0
  95. codeplain-0.2.1/tests/data/imports/diamond_import_1.plain +16 -0
  96. codeplain-0.2.1/tests/data/imports/diamond_import_2.plain +16 -0
  97. codeplain-0.2.1/tests/data/imports/diamond_import_common.plain +11 -0
  98. codeplain-0.2.1/tests/data/imports/diamond_imports_main.plain +13 -0
  99. codeplain-0.2.1/tests/data/imports/non_existent_import.plain +12 -0
  100. codeplain-0.2.1/tests/data/plainfile/duplicate_specification_heading.plain +7 -0
  101. codeplain-0.2.1/tests/data/plainfile/invalid_specification_order.plain +7 -0
  102. codeplain-0.2.1/tests/data/plainfile/missing_non_functional_requirements.plain +5 -0
  103. codeplain-0.2.1/tests/data/plainfile/plain_source_with_absolute_link.plain +9 -0
  104. codeplain-0.2.1/tests/data/plainfile/plain_source_with_url_link.plain +9 -0
  105. codeplain-0.2.1/tests/data/plainfile/task_manager_with_reference_links.plain +40 -0
  106. codeplain-0.2.1/tests/data/plainfile/without_non_functional_requirement.plain +5 -0
  107. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_acceptance_tests.plain +20 -0
  108. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_acceptance_tests_nondefined.plain +20 -0
  109. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_defined_nondefined.plain +18 -0
  110. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_defined_nondefined_2.plain +18 -0
  111. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_definition.plain +16 -0
  112. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_noconcepts.plain +18 -0
  113. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_nonconcept.plain +15 -0
  114. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_nondefined.plain +18 -0
  115. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_redefinition.plain +19 -0
  116. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_several_concepts.plain +13 -0
  117. codeplain-0.2.1/tests/data/plainfileparser/concept_validation_valid.plain +16 -0
  118. codeplain-0.2.1/tests/data/plainfileparser/exported_concepts.plain +13 -0
  119. codeplain-0.2.1/tests/data/plainfileparser/exported_concepts_base.plain +2 -0
  120. codeplain-0.2.1/tests/data/plainfileparser/exported_concepts_example.plain +13 -0
  121. codeplain-0.2.1/tests/data/plainfileparser/exported_concepts_missing.plain +8 -0
  122. codeplain-0.2.1/tests/data/plainfileparser/exported_concepts_missing_example.plain +13 -0
  123. codeplain-0.2.1/tests/data/plainfileparser/exported_concepts_nested.plain +15 -0
  124. codeplain-0.2.1/tests/data/plainfileparser/exported_concepts_nested_example.plain +13 -0
  125. codeplain-0.2.1/tests/data/plainfileparser/exported_concepts_transitive_example.plain +13 -0
  126. codeplain-0.2.1/tests/data/plainfileparser/exported_concepts_transitive_l1.plain +13 -0
  127. codeplain-0.2.1/tests/data/plainfileparser/exported_concepts_transitive_l2.plain +13 -0
  128. codeplain-0.2.1/tests/data/plainfileparser/plain_file_parser_with_comments.plain +8 -0
  129. codeplain-0.2.1/tests/data/plainfileparser/plain_file_with_comments_indented.plain +10 -0
  130. codeplain-0.2.1/tests/data/plainfileparser/regular_plain_source.plain +11 -0
  131. codeplain-0.2.1/tests/data/plainfileparser/required_concepts.plain +7 -0
  132. codeplain-0.2.1/tests/data/plainfileparser/required_concepts_defs.plain +2 -0
  133. codeplain-0.2.1/tests/data/plainfileparser/required_concepts_example.plain +13 -0
  134. codeplain-0.2.1/tests/data/plainfileparser/required_concepts_l1.plain +7 -0
  135. codeplain-0.2.1/tests/data/plainfileparser/required_concepts_l2.plain +5 -0
  136. codeplain-0.2.1/tests/data/plainfileparser/required_concepts_missing.plain +10 -0
  137. codeplain-0.2.1/tests/data/plainfileparser/required_concepts_module.plain +11 -0
  138. codeplain-0.2.1/tests/data/plainfileparser/required_concepts_partial.plain +13 -0
  139. codeplain-0.2.1/tests/data/plainfileparser/required_concepts_partial_duplicate.plain +14 -0
  140. codeplain-0.2.1/tests/data/plainfileparser/topological_sort.plain +14 -0
  141. codeplain-0.2.1/tests/data/plainfileparser/topological_sort_not_referenced.plain +22 -0
  142. codeplain-0.2.1/tests/data/requires/circular_requires_main.plain +18 -0
  143. codeplain-0.2.1/tests/data/requires/circular_requires_sub.plain +12 -0
  144. codeplain-0.2.1/tests/data/requires/diamond_requires_1.plain +12 -0
  145. codeplain-0.2.1/tests/data/requires/diamond_requires_2.plain +12 -0
  146. codeplain-0.2.1/tests/data/requires/diamond_requires_common.plain +7 -0
  147. codeplain-0.2.1/tests/data/requires/diamond_requires_main.plain +19 -0
  148. codeplain-0.2.1/tests/data/requires/independent_requires_1.plain +7 -0
  149. codeplain-0.2.1/tests/data/requires/independent_requires_2.plain +7 -0
  150. codeplain-0.2.1/tests/data/requires/independent_requires_main.plain +19 -0
  151. codeplain-0.2.1/tests/data/requires/non_existent_require.plain +18 -0
  152. codeplain-0.2.1/tests/data/requires/normal_requires_1.plain +12 -0
  153. codeplain-0.2.1/tests/data/requires/normal_requires_2.plain +12 -0
  154. codeplain-0.2.1/tests/data/requires/normal_requires_common.plain +7 -0
  155. codeplain-0.2.1/tests/data/requires/normal_requires_main.plain +19 -0
  156. codeplain-0.2.1/tests/data/simple.plain +7 -0
  157. codeplain-0.2.1/tests/data/templates/block_level_include.plain +12 -0
  158. codeplain-0.2.1/tests/data/templates/code_variables.plain +10 -0
  159. codeplain-0.2.1/tests/data/templates/header.plain +7 -0
  160. codeplain-0.2.1/tests/data/templates/implement.plain +3 -0
  161. codeplain-0.2.1/tests/data/templates/implement_2.plain +3 -0
  162. codeplain-0.2.1/tests/data/templates/template_include.plain +4 -0
  163. codeplain-0.2.1/tests/data/templates/test_hardest_problem.plain +2 -0
  164. codeplain-0.2.1/tests/test_git_utils.py +458 -0
  165. codeplain-0.2.1/tests/test_imports.py +42 -0
  166. codeplain-0.2.1/tests/test_plainfile.py +271 -0
  167. codeplain-0.2.1/tests/test_plainfileparser.py +532 -0
  168. codeplain-0.2.1/tests/test_plainspec.py +67 -0
  169. codeplain-0.2.1/tests/test_requires.py +27 -0
  170. codeplain-0.2.1/tui/__init__.py +1 -0
  171. codeplain-0.2.1/tui/components.py +372 -0
  172. codeplain-0.2.1/tui/models.py +56 -0
  173. codeplain-0.2.1/tui/plain2code_tui.py +268 -0
  174. codeplain-0.2.1/tui/state_handlers.py +307 -0
  175. codeplain-0.2.1/tui/styles.css +213 -0
  176. codeplain-0.2.1/tui/widget_helpers.py +159 -0
  177. codeplain-0.1.1/codeplain.egg-info/PKG-INFO +0 -141
  178. codeplain-0.1.1/codeplain.egg-info/SOURCES.txt +0 -54
  179. codeplain-0.1.1/codeplain.egg-info/dependency_links.txt +0 -1
  180. codeplain-0.1.1/codeplain.egg-info/entry_points.txt +0 -2
  181. codeplain-0.1.1/codeplain.egg-info/requires.txt +0 -34
  182. codeplain-0.1.1/codeplain.egg-info/top_level.txt +0 -36
  183. codeplain-0.1.1/plain2code.py +0 -218
  184. codeplain-0.1.1/plain2code_state.py +0 -75
  185. codeplain-0.1.1/pyproject.toml +0 -163
  186. codeplain-0.1.1/render_machine/actions/prepare_repositories.py +0 -50
  187. codeplain-0.1.1/render_machine/actions/prepare_testing_environment.py +0 -30
  188. codeplain-0.1.1/render_machine/actions/run_conformance_tests.py +0 -44
  189. codeplain-0.1.1/render_machine/actions/run_unit_tests.py +0 -38
  190. codeplain-0.1.1/render_machine/implementation_code_helpers.py +0 -20
  191. codeplain-0.1.1/render_machine/render_context.py +0 -280
  192. codeplain-0.1.1/render_machine/render_types.py +0 -36
  193. codeplain-0.1.1/setup.cfg +0 -4
  194. codeplain-0.1.1/standard_template_library/golang-console-app-template.plain +0 -36
  195. codeplain-0.1.1/standard_template_library/python-console-app-template.plain +0 -32
  196. {codeplain-0.1.1 → codeplain-0.2.1}/LICENSE +0 -0
  197. {codeplain-0.1.1 → codeplain-0.2.1}/README.md +0 -0
  198. {codeplain-0.1.1 → codeplain-0.2.1}/config/system_config.yaml +0 -0
  199. {codeplain-0.1.1 → codeplain-0.2.1}/hash_key.py +0 -0
  200. {codeplain-0.1.1 → codeplain-0.2.1}/plain2code_exceptions.py +0 -0
  201. {codeplain-0.1.1 → codeplain-0.2.1}/plain2code_nodes.py +0 -0
  202. {codeplain-0.1.1 → codeplain-0.2.1}/plain2code_read_config.py +0 -0
  203. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/actions/base_action.py +0 -0
  204. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/conformance_test_helpers.py +0 -0
  205. {codeplain-0.1.1 → codeplain-0.2.1}/render_machine/triggers.py +0 -0
  206. {codeplain-0.1.1 → codeplain-0.2.1}/standard_template_library/__init__.py +0 -0
  207. {codeplain-0.1.1 → codeplain-0.2.1}/system_config.py +0 -0
@@ -0,0 +1,28 @@
1
+ [flake8]
2
+ max-line-length = 120
3
+ # E203 is ignored because it conflicts with Black's formatting of slice notation
4
+ # Black formats slices like `a[1 : 2]` but flake8 expects `a[1:2]`
5
+ # E501 is ignored because we handle line length with Black's formatter
6
+ # B001 is ignored because we also check it with check E722
7
+ # N... is ignored because it's just naming conventions
8
+ # U101 is ignored because leading underscores signal that the argument is not used
9
+ extend-ignore = E203, E501, B001, N803, N806, N813, U101, U101
10
+ exclude =
11
+ .git,
12
+ __pycache__,
13
+ .venv,
14
+ .env,
15
+ .conda,
16
+ build,
17
+ dist,
18
+ tests,
19
+ examples
20
+ per-file-ignores =
21
+ __init__.py: F401
22
+ tests/*: U100
23
+ max-complexity = 15
24
+ enable-extensions = U100
25
+ # Plugin-specific configuration
26
+ unused-arguments-ignore-args = self,cls,_
27
+ # don't show warnings for unused *args and **kwargs.
28
+ unused-arguments-ignore-variadic-names = True
@@ -0,0 +1,126 @@
1
+ name: Code Quality & Tests
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ env:
8
+ PYTHON_VERSION: "3.11"
9
+
10
+ jobs:
11
+ black:
12
+ name: Black Formatting
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: ${{ env.PYTHON_VERSION }}
20
+ - name: Cache pip
21
+ uses: actions/cache@v4
22
+ with:
23
+ path: ~/.cache/pip
24
+ key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
25
+ - name: Install dependencies
26
+ run: |
27
+ python -m pip install --upgrade pip
28
+ pip install -r requirements.txt
29
+ - name: Check formatting with Black
30
+ run: black . --check
31
+
32
+ isort:
33
+ name: Import Sorting
34
+ runs-on: ubuntu-latest
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+ - name: Set up Python
38
+ uses: actions/setup-python@v5
39
+ with:
40
+ python-version: ${{ env.PYTHON_VERSION }}
41
+ - name: Cache pip
42
+ uses: actions/cache@v4
43
+ with:
44
+ path: ~/.cache/pip
45
+ key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
46
+ - name: Install dependencies
47
+ run: |
48
+ python -m pip install --upgrade pip
49
+ pip install isort
50
+ - name: Sort imports with isort
51
+ run: isort . --check-only --diff
52
+
53
+ flake8:
54
+ name: Flake8 Linting
55
+ runs-on: ubuntu-latest
56
+ steps:
57
+ - uses: actions/checkout@v4
58
+ - name: Set up Python
59
+ uses: actions/setup-python@v5
60
+ with:
61
+ python-version: ${{ env.PYTHON_VERSION }}
62
+ - name: Cache pip
63
+ uses: actions/cache@v4
64
+ with:
65
+ path: ~/.cache/pip
66
+ key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
67
+ - name: Install dependencies
68
+ run: |
69
+ python -m pip install --upgrade pip
70
+ pip install flake8
71
+ - name: Lint with flake8
72
+ run: flake8 .
73
+
74
+ mypy:
75
+ name: MyPy Type Checking
76
+ runs-on: ubuntu-latest
77
+ steps:
78
+ - uses: actions/checkout@v4
79
+ - name: Set up Python
80
+ uses: actions/setup-python@v5
81
+ with:
82
+ python-version: ${{ env.PYTHON_VERSION }}
83
+ - name: Cache pip
84
+ uses: actions/cache@v4
85
+ with:
86
+ path: ~/.cache/pip
87
+ key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
88
+ - name: Install dependencies
89
+ run: |
90
+ python -m pip install --upgrade pip
91
+ pip install -r requirements.txt
92
+ - name: Type check with mypy
93
+ run: mypy . --check-untyped-defs
94
+
95
+ tests:
96
+ name: Run Tests
97
+ runs-on: ubuntu-latest
98
+ steps:
99
+ - uses: actions/checkout@v4
100
+ - name: Set up Python
101
+ uses: actions/setup-python@v5
102
+ with:
103
+ python-version: ${{ env.PYTHON_VERSION }}
104
+ - name: Configure git for tests
105
+ run: |
106
+ git config --global user.email "test@example.com"
107
+ git config --global user.name "Test Runner"
108
+ git config --global init.defaultBranch main
109
+ - name: Cache pip
110
+ uses: actions/cache@v4
111
+ with:
112
+ path: ~/.cache/pip
113
+ key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
114
+ - name: Install dependencies
115
+ run: |
116
+ python -m pip install --upgrade pip
117
+ pip install -r requirements.txt
118
+ pip install coverage
119
+ - name: Run tests with coverage
120
+ run: |
121
+ export $(cat .env.dev.example | xargs)
122
+ coverage run -m pytest tests/ -v
123
+ coverage xml
124
+ coverage report
125
+ - name: Upload coverage reports
126
+ uses: codecov/codecov-action@v3
@@ -0,0 +1,22 @@
1
+ name: Notify Slack on Merge to Main
2
+
3
+ on:
4
+ pull_request:
5
+ types: [closed]
6
+ branches:
7
+ - main
8
+
9
+ jobs:
10
+ notify:
11
+ runs-on: ubuntu-latest
12
+ if: github.event.pull_request.merged == true
13
+ steps:
14
+ - name: Send notification to Slack
15
+ uses: slackapi/slack-github-action@v1.24.0
16
+ with:
17
+ payload: |
18
+ {
19
+ "text": ${{ toJSON(format('[Codeplain Client] PR <{0}|#{1}: {2}> was merged to main by `{3}`.', github.event.pull_request.html_url, github.event.pull_request.number, github.event.pull_request.title, github.actor)) }}
20
+ }
21
+ env:
22
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
@@ -0,0 +1,86 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ build:
9
+ name: Build distribution
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: write
13
+
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ - name: Set up Python
18
+ uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.11"
21
+
22
+ - name: Extract version from tag
23
+ id: get_version
24
+ run: |
25
+ # Strip 'v' prefix from tag (v0.2.1 -> 0.2.1)
26
+ VERSION=${GITHUB_REF_NAME#v}
27
+ echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
28
+ echo "Extracted version: $VERSION"
29
+
30
+ - name: Update version in pyproject.toml
31
+ run: |
32
+ sed -i "s/^version = .*/version = \"${{ steps.get_version.outputs.VERSION }}\"/" pyproject.toml
33
+ echo "Updated pyproject.toml:"
34
+ grep "^version" pyproject.toml
35
+
36
+ - name: Commit version update to repo
37
+ run: |
38
+ git config user.name "github-actions[bot]"
39
+ git config user.email "github-actions[bot]@users.noreply.github.com"
40
+ git add pyproject.toml
41
+ git commit -m "Bump version to ${{ steps.get_version.outputs.VERSION }}"
42
+ git push origin HEAD:main
43
+
44
+ - name: Install build dependencies
45
+ run: |
46
+ python -m pip install --upgrade pip
47
+ pip install build
48
+
49
+ - name: Build package
50
+ run: python -m build
51
+
52
+ - name: Store the distribution packages
53
+ uses: actions/upload-artifact@v4
54
+ with:
55
+ name: python-package-distributions
56
+ path: dist/
57
+
58
+ - name: Upload assets to GitHub Release
59
+ env:
60
+ GH_TOKEN: ${{ github.token }}
61
+ run: |
62
+ gh release upload ${{ github.ref_name }} dist/* --clobber
63
+
64
+ publish-to-pypi:
65
+ name: Publish to PyPI
66
+ needs: build
67
+ runs-on: ubuntu-latest
68
+ environment:
69
+ name: pypi
70
+ url: https://pypi.org/p/codeplain
71
+
72
+ steps:
73
+ - name: Download distribution packages
74
+ uses: actions/download-artifact@v4
75
+ with:
76
+ name: python-package-distributions
77
+ path: dist/
78
+
79
+ - name: Install twine
80
+ run: pip install twine
81
+
82
+ - name: Publish to PyPI
83
+ env:
84
+ TWINE_USERNAME: __token__
85
+ TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
86
+ run: twine upload dist/*
@@ -0,0 +1,30 @@
1
+ __pycache__
2
+ .DS_Store
3
+
4
+ # Plain
5
+ examples/**/build*/
6
+ examples/**/conformance_tests/
7
+ examples/**/conformance_tests.backup/
8
+ examples/**/node_build/
9
+ examples/**/node_conformance_tests/
10
+ examples/**/package-lock.json
11
+ examples/**/node_modules/
12
+ examples/**/node_harness_tests/
13
+ examples/**/plain_modules/
14
+
15
+ examples/**/go_build/
16
+ examples/**/python_build/
17
+
18
+ examples/**/go_plain_modules/
19
+ examples/**/python_plain_modules/
20
+ examples/**/node_plain_modules/
21
+
22
+
23
+ *.log
24
+
25
+ .venv
26
+ build
27
+ dist
28
+ *.egg-info
29
+
30
+ .env
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": "0.2.0",
3
+ "configurations": [
4
+ {
5
+ "name": "Debug plain2code.py for file hello_world_python.plain",
6
+ "type": "debugpy",
7
+ "request": "launch",
8
+ "program": "${workspaceFolder}/plain2code.py",
9
+ "args": [
10
+ "${workspaceFolder}/examples/example_hello_world_python/hello_world_python.plain",
11
+ ],
12
+ "subProcess": false,
13
+ "cwd": "${workspaceFolder}/examples/example_hello_world_python",
14
+ "console": "integratedTerminal",
15
+ "justMyCode": false,
16
+ "env": {
17
+ "PYTHONPATH": "${workspaceFolder}"
18
+ }
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "editor.formatOnSave": true,
3
+ "editor.insertSpaces": true,
4
+ "editor.detectIndentation": false,
5
+ "editor.codeActionsOnSave": {
6
+ "source.organizeImports": "explicit"
7
+ },
8
+ "[python]": {
9
+ "editor.defaultFormatter": "ms-python.black-formatter",
10
+ "editor.formatOnSave": true,
11
+ "editor.rulers": [120],
12
+ "editor.insertSpaces": true,
13
+ "editor.tabSize": 4
14
+ },
15
+ "editor.defaultFormatter": "ms-python.black-formatter",
16
+ "notebook.defaultFormatter": "ms-python.black-formatter",
17
+ "python.testing.unittestEnabled": true,
18
+ "python.testing.pytestEnabled": false,
19
+ "python.testing.unittestArgs": [
20
+ "-v",
21
+ "-p",
22
+ "test_*.py",
23
+ "-t",
24
+ "${workspaceFolder}"
25
+ ],
26
+ "python.analysis.extraPaths": [
27
+ "${workspaceFolder}"
28
+ ],
29
+ "files.associations": {
30
+ "**/tests/data/*": "text"
31
+ }
32
+ }
@@ -1,50 +1,31 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codeplain
3
- Version: 0.1.1
3
+ Version: 0.2.1
4
4
  Summary: Transform plain language specifications into working code
5
+ License-File: LICENSE
5
6
  Classifier: Environment :: Console
6
7
  Classifier: Intended Audience :: Developers
7
- Classifier: License :: OSI Approved :: MIT License
8
8
  Classifier: Operating System :: OS Independent
9
- Classifier: Programming Language :: Python :: 3.11
10
9
  Classifier: Topic :: Software Development :: Code Generators
11
10
  Requires-Python: >=3.11
12
- Description-Content-Type: text/markdown
13
- License-File: LICENSE
14
- Requires-Dist: python-liquid2==0.3.0
11
+ Requires-Dist: gitpython==3.1.42
15
12
  Requires-Dist: mistletoe==1.3.0
16
- Requires-Dist: langchain==1.0.8
17
- Requires-Dist: langchain-core==1.2.3
18
- Requires-Dist: langchain-openai==1.0.3
19
- Requires-Dist: langchain-anthropic==1.1.0
20
- Requires-Dist: langchain-aws==1.0.0
21
- Requires-Dist: langchain-cerebras==0.8.0
22
- Requires-Dist: langchain-google-genai==4.1.2
23
- Requires-Dist: langchain-ollama==1.0.0
13
+ Requires-Dist: networkx==3.6.1
14
+ Requires-Dist: python-frontmatter==1.1.0
15
+ Requires-Dist: python-liquid2==0.3.0
16
+ Requires-Dist: pyyaml==6.0.2
24
17
  Requires-Dist: requests==2.32.3
25
- Requires-Dist: langsmith==0.4.4
26
18
  Requires-Dist: rich==14.2.0
27
- Requires-Dist: tiktoken==0.12.0
28
- Requires-Dist: PyYAML==6.0.2
29
- Requires-Dist: gitpython==3.1.42
30
- Requires-Dist: lizard==1.18.0
31
19
  Requires-Dist: textual==1.0.0
32
- Requires-Dist: SQLAlchemy==2.0.36
33
- Requires-Dist: psycopg2==2.9.10
34
- Requires-Dist: python-dotenv==1.1.0
20
+ Requires-Dist: tiktoken==0.12.0
35
21
  Requires-Dist: transitions==0.9.3
36
- Requires-Dist: cryptography==46.0.1
37
22
  Provides-Extra: dev
38
- Requires-Dist: pytest==8.3.5; extra == "dev"
39
- Requires-Dist: flake8==7.0.0; extra == "dev"
40
- Requires-Dist: black==24.2.0; extra == "dev"
41
- Requires-Dist: isort==5.13.2; extra == "dev"
42
- Requires-Dist: flake8-bugbear==24.12.12; extra == "dev"
43
- Requires-Dist: flake8-unused-arguments==0.0.13; extra == "dev"
44
- Requires-Dist: flake8-eradicate==1.5.0; extra == "dev"
45
- Requires-Dist: pep8-naming==0.15.1; extra == "dev"
46
- Requires-Dist: mypy==1.11.2; extra == "dev"
47
- Dynamic: license-file
23
+ Requires-Dist: black==24.2.0; extra == 'dev'
24
+ Requires-Dist: flake8==7.0.0; extra == 'dev'
25
+ Requires-Dist: isort==5.13.2; extra == 'dev'
26
+ Requires-Dist: mypy==1.11.2; extra == 'dev'
27
+ Requires-Dist: pytest==8.3.5; extra == 'dev'
28
+ Description-Content-Type: text/markdown
48
29
 
49
30
  # Codeplain plain2code renderer
50
31