pybiolib 0.2.951__py3-none-any.whl → 1.2.1890__py3-none-any.whl

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 (262) hide show
  1. biolib/__init__.py +357 -11
  2. biolib/_data_record/data_record.py +380 -0
  3. biolib/_index/__init__.py +0 -0
  4. biolib/_index/index.py +55 -0
  5. biolib/_index/query_result.py +103 -0
  6. biolib/_internal/__init__.py +0 -0
  7. biolib/_internal/add_copilot_prompts.py +58 -0
  8. biolib/_internal/add_gui_files.py +81 -0
  9. biolib/_internal/data_record/__init__.py +1 -0
  10. biolib/_internal/data_record/data_record.py +85 -0
  11. biolib/_internal/data_record/push_data.py +116 -0
  12. biolib/_internal/data_record/remote_storage_endpoint.py +43 -0
  13. biolib/_internal/errors.py +5 -0
  14. biolib/_internal/file_utils.py +125 -0
  15. biolib/_internal/fuse_mount/__init__.py +1 -0
  16. biolib/_internal/fuse_mount/experiment_fuse_mount.py +209 -0
  17. biolib/_internal/http_client.py +159 -0
  18. biolib/_internal/lfs/__init__.py +1 -0
  19. biolib/_internal/lfs/cache.py +51 -0
  20. biolib/_internal/libs/__init__.py +1 -0
  21. biolib/_internal/libs/fusepy/__init__.py +1257 -0
  22. biolib/_internal/push_application.py +488 -0
  23. biolib/_internal/runtime.py +22 -0
  24. biolib/_internal/string_utils.py +13 -0
  25. biolib/_internal/templates/__init__.py +1 -0
  26. biolib/_internal/templates/copilot_template/.github/instructions/general-app-knowledge.instructions.md +10 -0
  27. biolib/_internal/templates/copilot_template/.github/instructions/style-general.instructions.md +20 -0
  28. biolib/_internal/templates/copilot_template/.github/instructions/style-python.instructions.md +16 -0
  29. biolib/_internal/templates/copilot_template/.github/instructions/style-react-ts.instructions.md +47 -0
  30. biolib/_internal/templates/copilot_template/.github/prompts/biolib_app_inputs.prompt.md +11 -0
  31. biolib/_internal/templates/copilot_template/.github/prompts/biolib_onboard_repo.prompt.md +19 -0
  32. biolib/_internal/templates/copilot_template/.github/prompts/biolib_run_apps.prompt.md +12 -0
  33. biolib/_internal/templates/dashboard_template/.biolib/config.yml +5 -0
  34. biolib/_internal/templates/github_workflow_template/.github/workflows/biolib.yml +21 -0
  35. biolib/_internal/templates/gitignore_template/.gitignore +10 -0
  36. biolib/_internal/templates/gui_template/.yarnrc.yml +1 -0
  37. biolib/_internal/templates/gui_template/App.tsx +53 -0
  38. biolib/_internal/templates/gui_template/Dockerfile +27 -0
  39. biolib/_internal/templates/gui_template/biolib-sdk.ts +82 -0
  40. biolib/_internal/templates/gui_template/dev-data/output.json +7 -0
  41. biolib/_internal/templates/gui_template/index.css +5 -0
  42. biolib/_internal/templates/gui_template/index.html +13 -0
  43. biolib/_internal/templates/gui_template/index.tsx +10 -0
  44. biolib/_internal/templates/gui_template/package.json +27 -0
  45. biolib/_internal/templates/gui_template/tsconfig.json +24 -0
  46. biolib/_internal/templates/gui_template/vite-plugin-dev-data.ts +50 -0
  47. biolib/_internal/templates/gui_template/vite.config.mts +10 -0
  48. biolib/_internal/templates/init_template/.biolib/config.yml +19 -0
  49. biolib/_internal/templates/init_template/Dockerfile +14 -0
  50. biolib/_internal/templates/init_template/requirements.txt +1 -0
  51. biolib/_internal/templates/init_template/run.py +12 -0
  52. biolib/_internal/templates/init_template/run.sh +4 -0
  53. biolib/_internal/templates/templates.py +25 -0
  54. biolib/_internal/tree_utils.py +106 -0
  55. biolib/_internal/utils/__init__.py +65 -0
  56. biolib/_internal/utils/auth.py +46 -0
  57. biolib/_internal/utils/job_url.py +33 -0
  58. biolib/_internal/utils/multinode.py +263 -0
  59. biolib/_runtime/runtime.py +157 -0
  60. biolib/_session/session.py +44 -0
  61. biolib/_shared/__init__.py +0 -0
  62. biolib/_shared/types/__init__.py +74 -0
  63. biolib/_shared/types/account.py +12 -0
  64. biolib/_shared/types/account_member.py +8 -0
  65. biolib/_shared/types/app.py +9 -0
  66. biolib/_shared/types/data_record.py +40 -0
  67. biolib/_shared/types/experiment.py +32 -0
  68. biolib/_shared/types/file_node.py +17 -0
  69. biolib/_shared/types/push.py +6 -0
  70. biolib/_shared/types/resource.py +37 -0
  71. biolib/_shared/types/resource_deploy_key.py +11 -0
  72. biolib/_shared/types/resource_permission.py +14 -0
  73. biolib/_shared/types/resource_version.py +19 -0
  74. biolib/_shared/types/result.py +14 -0
  75. biolib/_shared/types/typing.py +10 -0
  76. biolib/_shared/types/user.py +19 -0
  77. biolib/_shared/utils/__init__.py +7 -0
  78. biolib/_shared/utils/resource_uri.py +75 -0
  79. biolib/api/__init__.py +6 -0
  80. biolib/api/client.py +168 -0
  81. biolib/app/app.py +252 -49
  82. biolib/app/search_apps.py +45 -0
  83. biolib/biolib_api_client/api_client.py +126 -31
  84. biolib/biolib_api_client/app_types.py +24 -4
  85. biolib/biolib_api_client/auth.py +31 -8
  86. biolib/biolib_api_client/biolib_app_api.py +147 -52
  87. biolib/biolib_api_client/biolib_job_api.py +161 -141
  88. biolib/biolib_api_client/job_types.py +21 -5
  89. biolib/biolib_api_client/lfs_types.py +7 -23
  90. biolib/biolib_api_client/user_state.py +56 -0
  91. biolib/biolib_binary_format/__init__.py +1 -4
  92. biolib/biolib_binary_format/file_in_container.py +105 -0
  93. biolib/biolib_binary_format/module_input.py +24 -7
  94. biolib/biolib_binary_format/module_output_v2.py +149 -0
  95. biolib/biolib_binary_format/remote_endpoints.py +34 -0
  96. biolib/biolib_binary_format/remote_stream_seeker.py +59 -0
  97. biolib/biolib_binary_format/saved_job.py +3 -2
  98. biolib/biolib_binary_format/{attestation_document.py → stdout_and_stderr.py} +8 -8
  99. biolib/biolib_binary_format/system_status_update.py +3 -2
  100. biolib/biolib_binary_format/utils.py +175 -0
  101. biolib/biolib_docker_client/__init__.py +11 -2
  102. biolib/biolib_errors.py +36 -0
  103. biolib/biolib_logging.py +27 -10
  104. biolib/cli/__init__.py +38 -0
  105. biolib/cli/auth.py +46 -0
  106. biolib/cli/data_record.py +164 -0
  107. biolib/cli/index.py +32 -0
  108. biolib/cli/init.py +421 -0
  109. biolib/cli/lfs.py +101 -0
  110. biolib/cli/push.py +50 -0
  111. biolib/cli/run.py +63 -0
  112. biolib/cli/runtime.py +14 -0
  113. biolib/cli/sdk.py +16 -0
  114. biolib/cli/start.py +56 -0
  115. biolib/compute_node/cloud_utils/cloud_utils.py +110 -161
  116. biolib/compute_node/job_worker/cache_state.py +66 -88
  117. biolib/compute_node/job_worker/cache_types.py +1 -6
  118. biolib/compute_node/job_worker/docker_image_cache.py +112 -37
  119. biolib/compute_node/job_worker/executors/__init__.py +0 -3
  120. biolib/compute_node/job_worker/executors/docker_executor.py +532 -199
  121. biolib/compute_node/job_worker/executors/docker_types.py +9 -1
  122. biolib/compute_node/job_worker/executors/types.py +19 -9
  123. biolib/compute_node/job_worker/job_legacy_input_wait_timeout_thread.py +30 -0
  124. biolib/compute_node/job_worker/job_max_runtime_timer_thread.py +3 -5
  125. biolib/compute_node/job_worker/job_storage.py +108 -0
  126. biolib/compute_node/job_worker/job_worker.py +397 -212
  127. biolib/compute_node/job_worker/large_file_system.py +87 -38
  128. biolib/compute_node/job_worker/network_alloc.py +99 -0
  129. biolib/compute_node/job_worker/network_buffer.py +240 -0
  130. biolib/compute_node/job_worker/utilization_reporter_thread.py +197 -0
  131. biolib/compute_node/job_worker/utils.py +9 -24
  132. biolib/compute_node/remote_host_proxy.py +400 -98
  133. biolib/compute_node/utils.py +31 -9
  134. biolib/compute_node/webserver/compute_node_results_proxy.py +189 -0
  135. biolib/compute_node/webserver/proxy_utils.py +28 -0
  136. biolib/compute_node/webserver/webserver.py +130 -44
  137. biolib/compute_node/webserver/webserver_types.py +2 -6
  138. biolib/compute_node/webserver/webserver_utils.py +77 -12
  139. biolib/compute_node/webserver/worker_thread.py +183 -42
  140. biolib/experiments/__init__.py +0 -0
  141. biolib/experiments/experiment.py +356 -0
  142. biolib/jobs/__init__.py +1 -0
  143. biolib/jobs/job.py +741 -0
  144. biolib/jobs/job_result.py +185 -0
  145. biolib/jobs/types.py +50 -0
  146. biolib/py.typed +0 -0
  147. biolib/runtime/__init__.py +14 -0
  148. biolib/sdk/__init__.py +91 -0
  149. biolib/tables.py +34 -0
  150. biolib/typing_utils.py +2 -7
  151. biolib/user/__init__.py +1 -0
  152. biolib/user/sign_in.py +54 -0
  153. biolib/utils/__init__.py +162 -0
  154. biolib/utils/cache_state.py +94 -0
  155. biolib/utils/multipart_uploader.py +194 -0
  156. biolib/utils/seq_util.py +150 -0
  157. biolib/utils/zip/remote_zip.py +640 -0
  158. pybiolib-1.2.1890.dist-info/METADATA +41 -0
  159. pybiolib-1.2.1890.dist-info/RECORD +177 -0
  160. {pybiolib-0.2.951.dist-info → pybiolib-1.2.1890.dist-info}/WHEEL +1 -1
  161. pybiolib-1.2.1890.dist-info/entry_points.txt +2 -0
  162. README.md +0 -17
  163. biolib/app/app_result.py +0 -68
  164. biolib/app/utils.py +0 -62
  165. biolib/biolib-js/0-biolib.worker.js +0 -1
  166. biolib/biolib-js/1-biolib.worker.js +0 -1
  167. biolib/biolib-js/2-biolib.worker.js +0 -1
  168. biolib/biolib-js/3-biolib.worker.js +0 -1
  169. biolib/biolib-js/4-biolib.worker.js +0 -1
  170. biolib/biolib-js/5-biolib.worker.js +0 -1
  171. biolib/biolib-js/6-biolib.worker.js +0 -1
  172. biolib/biolib-js/index.html +0 -10
  173. biolib/biolib-js/main-biolib.js +0 -1
  174. biolib/biolib_api_client/biolib_account_api.py +0 -21
  175. biolib/biolib_api_client/biolib_large_file_system_api.py +0 -108
  176. biolib/biolib_binary_format/aes_encrypted_package.py +0 -42
  177. biolib/biolib_binary_format/module_output.py +0 -58
  178. biolib/biolib_binary_format/rsa_encrypted_aes_package.py +0 -57
  179. biolib/biolib_push.py +0 -114
  180. biolib/cli.py +0 -203
  181. biolib/cli_utils.py +0 -273
  182. biolib/compute_node/cloud_utils/enclave_parent_types.py +0 -7
  183. biolib/compute_node/enclave/__init__.py +0 -2
  184. biolib/compute_node/enclave/enclave_remote_hosts.py +0 -53
  185. biolib/compute_node/enclave/nitro_secure_module_utils.py +0 -64
  186. biolib/compute_node/job_worker/executors/base_executor.py +0 -18
  187. biolib/compute_node/job_worker/executors/pyppeteer_executor.py +0 -173
  188. biolib/compute_node/job_worker/executors/remote/__init__.py +0 -1
  189. biolib/compute_node/job_worker/executors/remote/nitro_enclave_utils.py +0 -81
  190. biolib/compute_node/job_worker/executors/remote/remote_executor.py +0 -51
  191. biolib/lfs.py +0 -196
  192. biolib/pyppeteer/.circleci/config.yml +0 -100
  193. biolib/pyppeteer/.coveragerc +0 -3
  194. biolib/pyppeteer/.gitignore +0 -89
  195. biolib/pyppeteer/.pre-commit-config.yaml +0 -28
  196. biolib/pyppeteer/CHANGES.md +0 -253
  197. biolib/pyppeteer/CONTRIBUTING.md +0 -26
  198. biolib/pyppeteer/LICENSE +0 -12
  199. biolib/pyppeteer/README.md +0 -137
  200. biolib/pyppeteer/docs/Makefile +0 -177
  201. biolib/pyppeteer/docs/_static/custom.css +0 -28
  202. biolib/pyppeteer/docs/_templates/layout.html +0 -10
  203. biolib/pyppeteer/docs/changes.md +0 -1
  204. biolib/pyppeteer/docs/conf.py +0 -299
  205. biolib/pyppeteer/docs/index.md +0 -21
  206. biolib/pyppeteer/docs/make.bat +0 -242
  207. biolib/pyppeteer/docs/reference.md +0 -211
  208. biolib/pyppeteer/docs/server.py +0 -60
  209. biolib/pyppeteer/poetry.lock +0 -1699
  210. biolib/pyppeteer/pyppeteer/__init__.py +0 -135
  211. biolib/pyppeteer/pyppeteer/accessibility.py +0 -286
  212. biolib/pyppeteer/pyppeteer/browser.py +0 -401
  213. biolib/pyppeteer/pyppeteer/browser_fetcher.py +0 -194
  214. biolib/pyppeteer/pyppeteer/command.py +0 -22
  215. biolib/pyppeteer/pyppeteer/connection/__init__.py +0 -242
  216. biolib/pyppeteer/pyppeteer/connection/cdpsession.py +0 -101
  217. biolib/pyppeteer/pyppeteer/coverage.py +0 -346
  218. biolib/pyppeteer/pyppeteer/device_descriptors.py +0 -787
  219. biolib/pyppeteer/pyppeteer/dialog.py +0 -79
  220. biolib/pyppeteer/pyppeteer/domworld.py +0 -597
  221. biolib/pyppeteer/pyppeteer/emulation_manager.py +0 -53
  222. biolib/pyppeteer/pyppeteer/errors.py +0 -48
  223. biolib/pyppeteer/pyppeteer/events.py +0 -63
  224. biolib/pyppeteer/pyppeteer/execution_context.py +0 -156
  225. biolib/pyppeteer/pyppeteer/frame/__init__.py +0 -299
  226. biolib/pyppeteer/pyppeteer/frame/frame_manager.py +0 -306
  227. biolib/pyppeteer/pyppeteer/helpers.py +0 -245
  228. biolib/pyppeteer/pyppeteer/input.py +0 -371
  229. biolib/pyppeteer/pyppeteer/jshandle.py +0 -598
  230. biolib/pyppeteer/pyppeteer/launcher.py +0 -683
  231. biolib/pyppeteer/pyppeteer/lifecycle_watcher.py +0 -169
  232. biolib/pyppeteer/pyppeteer/models/__init__.py +0 -103
  233. biolib/pyppeteer/pyppeteer/models/_protocol.py +0 -12460
  234. biolib/pyppeteer/pyppeteer/multimap.py +0 -82
  235. biolib/pyppeteer/pyppeteer/network_manager.py +0 -678
  236. biolib/pyppeteer/pyppeteer/options.py +0 -8
  237. biolib/pyppeteer/pyppeteer/page.py +0 -1728
  238. biolib/pyppeteer/pyppeteer/pipe_transport.py +0 -59
  239. biolib/pyppeteer/pyppeteer/target.py +0 -147
  240. biolib/pyppeteer/pyppeteer/task_queue.py +0 -24
  241. biolib/pyppeteer/pyppeteer/timeout_settings.py +0 -36
  242. biolib/pyppeteer/pyppeteer/tracing.py +0 -93
  243. biolib/pyppeteer/pyppeteer/us_keyboard_layout.py +0 -305
  244. biolib/pyppeteer/pyppeteer/util.py +0 -18
  245. biolib/pyppeteer/pyppeteer/websocket_transport.py +0 -47
  246. biolib/pyppeteer/pyppeteer/worker.py +0 -101
  247. biolib/pyppeteer/pyproject.toml +0 -97
  248. biolib/pyppeteer/spell.txt +0 -137
  249. biolib/pyppeteer/tox.ini +0 -72
  250. biolib/pyppeteer/utils/generate_protocol_types.py +0 -603
  251. biolib/start_cli.py +0 -7
  252. biolib/utils.py +0 -47
  253. biolib/validators/validate_app_version.py +0 -183
  254. biolib/validators/validate_argument.py +0 -134
  255. biolib/validators/validate_module.py +0 -323
  256. biolib/validators/validate_zip_file.py +0 -40
  257. biolib/validators/validator_utils.py +0 -103
  258. pybiolib-0.2.951.dist-info/LICENSE +0 -21
  259. pybiolib-0.2.951.dist-info/METADATA +0 -61
  260. pybiolib-0.2.951.dist-info/RECORD +0 -153
  261. pybiolib-0.2.951.dist-info/entry_points.txt +0 -3
  262. /LICENSE → /pybiolib-1.2.1890.dist-info/licenses/LICENSE +0 -0
@@ -1,253 +0,0 @@
1
- History
2
- =======
3
-
4
- ## Version 0.0.26 (next version)
5
-
6
- * Add `$PYPPETEER_NO_PROGRESS_BAR` environment variable
7
- * `pyppeteer.defaultArgs` now accepts that help infer chromium command-line flags.
8
- * `pyppeteer.launch()` argument `ignoreDefaultArgs` now accepts a list of flags to ignore.
9
- * `Page.type()` now supports typing emoji
10
- * `Page.pdf()` accepts a new argument `preferCSSPageSize`
11
- * Add new option `defaultViewport` to `launch()` and `connect()`
12
- * Add `BrowserContext.pages()` method
13
-
14
- ## Version 0.0.25 (2018-09-27)
15
-
16
- * Fix miss-spelled methods and functions
17
- * Change `Browser.isIncognite` to `Browser.isIncognito`
18
- * Change `Browser.createIncogniteBrowserContext` to `Browser.createIncognitoBrowserContext`
19
- * Change `chromium_excutable` to `chromium_executable`
20
- * Remove `craete` function in `page.py`
21
-
22
- ## Version 0.0.24 (2018-09-12)
23
-
24
- Catch up puppeteer v1.6.0
25
-
26
- * Add `ElementHandle.isIntersectingViewport()`
27
- * Add `reportAnonymousScript` option to `Coverage.startJSCoverage()`
28
- * Add `Page.waitForRequest` and `Page.waitForResponse` methods
29
- * Now possible to attach to extension background pages with `Target.page()`
30
- * Improved reliability of clicking with `Page.click()` and `ElementHandle.click()`
31
-
32
- ## Version 0.0.23 (2018-09-10)
33
-
34
- Catch up puppeteer v1.5.0
35
-
36
- * Add `BrowserContext` class
37
- * Add `Worker` class
38
- * Change `CDPSession.send` to a normal function which returns awaitable value
39
- * Add `Page.isClosed` method
40
- * Add `ElementHandle.querySelectorAllEval` and `ElementHandle.JJeval`
41
- * Add `Target.opener`
42
- * Add `Request.isNavigationRequest`
43
-
44
- ## Version 0.0.22 (2018-09-06)
45
-
46
- Catch up puppeteer v1.4.0
47
-
48
- * Add `pyppeteer.DEBUG` variable
49
- * Add `Page.browser`
50
- * Add `Target.browser`
51
- * Add `ElementHandle.querySelectorEval` and `ElementHandle.Jeval`
52
- * Add `runBeforeUnload` option to `Page.close` method
53
- * Change `Page.querySelectorEval` to raise `ElementHandleError` when element which matches `selector` is not found
54
- * Report 'Log' domain entries as 'console' events
55
- * Fix `Page.goto` to return response when page pushes new state
56
- * (OS X) Suppress long log when extracting chromium
57
-
58
-
59
- ## Version 0.0.21 (2018-08-21)
60
-
61
- Catch up puppeteer v1.3.0
62
-
63
- * Add `pyppeteer-install` command
64
- * Add `autoClose` option to `launch` function
65
- * Add `loop` option to `launch` function (experimental)
66
- * Add `Page.setBypassCSP` method
67
- * `Page.tracing.stop` returns result data
68
- * Rename `documentloaded` to `domcontentloaded` on `waitUntil` option
69
- * Fix `slowMo` option
70
- * Fix anchor navigation
71
- * Fix to return response via redirects
72
- * Continue to find WS URL while process is alive
73
-
74
-
75
- ## Version 0.0.20 (2018-08-11)
76
-
77
- * Run on msys/cygwin, anyway
78
- * Raise error correctly when connection failed (PR#91)
79
- * Change browser download location and temporary user data directory to:
80
- * If `$PYPPETEER_HOME` environment variable is defined, use this location
81
- * Otherwise, use platform dependent locations, based on [appdirs](https://pypi.org/project/appdirs/):
82
- * `'C:\Users\<username>\AppData\Local\pyppeteer'` (Windows)
83
- * `'/Users/<username>/Library/Application Support/pyppeteer'` (OS X)
84
- * `'/home/<username>/.local/share/pyppeteer'` (Linux)
85
- * or in `'$XDG_DATA_HOME/pyppeteer'` if `$XDG_DATA_HOME` is defined
86
-
87
- * Introduce `$PYPPETEER_CHROMIUM_REVISION`
88
- * Introduce `$PYPPETEER_HOME`
89
- * Add `logLevel` option to `launch` and `connect` functions
90
- * Add page `close` event
91
- * Add `ElementHandle.boxModel` method
92
- * Add an option to disable timeout for `waitFor` functions
93
-
94
-
95
- ## Version 0.0.19 (2018-07-05)
96
-
97
- Catch up puppeteer v1.2.0
98
-
99
- * Add `ElementHandle.contentFrame` method
100
- * Add `Request.redirectChain` method
101
- * `Page.addScriptTag` accepts a new option `type`
102
-
103
-
104
- ## Version 0.0.18 (2018-07-04)
105
-
106
- Catch up puppeteer v1.1.1
107
-
108
- * Add `Page.waitForXPath` and `Frame.waitForXPath`
109
- * `Page.waitFor` accepts xpath string which starts with `//`
110
- * Add `Response.fromCache` and `Response.fromServiceWorker`
111
- * Add `SecurityDetails` class and `response.securityDetails`
112
- * Add `Page.setCacheEnabled` method
113
- * Add `ExecutionContext.frame`
114
- * Add `dumpio` option to `launch` function
115
- * Add `slowMo` option to `connect` function
116
- * `launcher.connect` can be access from package top
117
- * `from pyppeteer import connect` is now valid
118
- * Add `Frame.evaluateHandle`
119
- * Add `Page.Events.DOMContentLoaded`
120
-
121
-
122
- ## Version 0.0.17 (2018-04-02)
123
-
124
- * Mark as alpha
125
-
126
- * Gracefully terminate browser process
127
- * `Request.method` and `Request.postData` return `None` if no data
128
- * Change `Target.url` and `Target.type` to properties
129
- * Change `Dialog.message` and `Dialog.defaultValue` to properties
130
- * Fix: properly emit `Browser.targetChanged` events
131
- * Fix: properly emit `Browser.targetDestroyed` events
132
-
133
-
134
- ## Version 0.0.16 (2018-03-23)
135
-
136
- * BugFix: Skip SIGHUP option on windows (windows does not support this signal)
137
-
138
-
139
- ## Version 0.0.15 (2018-03-22)
140
-
141
- Catch up puppeteer v1.0.0
142
-
143
- * Support `raf` and `mutation` polling for `waitFor*` methods
144
- * Add `Page.coverage` to support JS and CSS coverage
145
- * Add XPath support with `Page.xpath`, `Frame.xpath`, and `ElementHandle.xpath`
146
- * Add `Target.createCDPSession` to work with raw Devtools Protocol
147
- * Change `Frame.executionContext` from property to coroutine
148
- * Add `ignoreDefaultArgs` option to `pyppeteer.launch`
149
- * Add `handleSIGINT`/`handleSIGTERM`/`handleSIGHUP` options to `pyppeteer.launch`
150
- * Add `Page.setDefaultNavigationTimeout` method
151
- * `Page.waitFor*` methods accept `JSHandle` as argument
152
- * Implement `Frame.content` and `Frame.setContent` methods
153
- * `page.tracing.start` accepts custom tracing categories option
154
- * Add `Browser.process` property
155
- * Add `Request.frame` property
156
-
157
-
158
- ## Version 0.0.14 (2018-03-14)
159
-
160
- * Read WS endpoint from web interface instead of stdout
161
- * Pass environment variables of python process to chrome by default
162
- * Do not limit size of websocket frames
163
-
164
- * BugFix:
165
- * `Keyboard.type`
166
- * `Page.Events.Metrics`
167
-
168
- ## Version 0.0.13 (2018-03-10)
169
-
170
- Catch up puppeteer v0.13.0
171
-
172
- * `pyppeteer.launch()` is now **coroutine**
173
- * Implement `connect` function
174
- * `PYPPETEER_DOWNLOAD_HOST` env variable specifies host part of URL to download chromium
175
- * Rename `setRequestInterceptionEnable` to `setRequestInterception`
176
- * Rename `Page.getMetrics` to `Page.metrics`
177
- * Implement `Browser.pages` to access all pages
178
- * Add `Target` class and some new method on Browser
179
- * Add `ElementHandle.querySelector` and `ElementHandle.querySelectorAll`
180
- * Refactor NavigatorWatcher
181
- * add `documentloaded`, `networkidle0`, and `networkidle2` options
182
- * `Request.abort` accepts error code
183
- * `addScriptTag` and `addStyleTag` return `ElementHandle`
184
- * Add `force_expr` option to `evaluate` method
185
- * `Page.select` returns selected values
186
- * Add `pyppeteer.version` and `pyppeteer.version_info`
187
-
188
- * BugFix:
189
- * Do not change original options dictionary
190
- * `Page.frames`
191
- * `Page.queryObjects`
192
- * `Page.exposeFunction`
193
- * Request interception
194
- * Console API
195
- * websocket error on closing browser (#24)
196
-
197
- ## Version 0.0.12 (2018-03-01)
198
-
199
- * BugFix (#33)
200
-
201
- ## Version 0.0.11 (2018-03-01)
202
-
203
- Catch up puppeteer v0.12.0
204
-
205
- * Remove `ElementHandle.evaluate`
206
- * Remove `ElementHandle.attribute`
207
- * Deprecate `Page.plainText`
208
- * Deprecate `Page.injectFile`
209
- * Add `Page.querySelectorAllEval`
210
- * Add `Page.select` and `Page.type`
211
- * Add `ElementHandle.boundingBox` and `ElementHandle.screenshot`
212
- * Add `ElementHandle.focus`, `ElementHandle.type`, and `ElementHandle.press`
213
- * Add `getMetrics` method
214
- * Add `offlineMode`
215
-
216
- ## Version 0.0.10 (2018-02-27)
217
-
218
- * Enable to import `launch` from package root
219
- * Change `browser.close` to coroutine function
220
- * Catch up puppeteer v0.11.0
221
-
222
- ### Version 0.0.9 (2017-09-09)
223
-
224
- * Delete temporary user data directory when browser closed
225
- * Fix bug to fail extracting zip on mac
226
-
227
- ### Version 0.0.8 (2017-09-03)
228
-
229
- * Change chromium revision
230
- * Support steps option of `Mouse.move()`
231
- * Experimentally supports python 3.5 by py-backwards
232
-
233
- ### Version 0.0.7 (2017-09-03)
234
-
235
- * Catch up puppeteer v0.10.2
236
- * Add `Page.querySelectorEval` (`Page.$eval` in puppeteer)
237
- * Deprecate `ElementHandle.attribute`
238
- * Add `Touchscreen` class and implement `Page.tap` and `ElementHandle.tap`
239
-
240
- ### Version 0.0.6 (2017-09-02)
241
-
242
- * Accept keyword arguments for options
243
- * Faster polling on `waitFor*` functions
244
- * Fix bugs
245
-
246
- ### Version 0.0.5 (2017-08-30)
247
-
248
- * Implement pdf printing
249
- * Implement `waitFor*` functions
250
-
251
- ### Version 0.0.4 (2017-08-30)
252
-
253
- * Register PyPI
@@ -1,26 +0,0 @@
1
- # Contribution Guidelines
2
-
3
- Contributions are welcome as long as they follow core rule of this project:
4
-
5
- The API of pyppeteer should __match the API of puppeteer__[1] as closely as possible without sacrificing Python too much.
6
- - For public API items such as method names, property names, class names, an effort should be made to mirror the API
7
- if puppeteer. Where this is not possible, use a suitable substitute (eg `page.$eval` -> `page.Jeval`)
8
- - For function arguments, most arguments can be translated 1:1, however there is a special case where puppeteer uses a
9
- single argument, `options` to workaround JS' lack of keyword arguments. In this case, `options` should be expanded
10
- appropriately based on the puppeteer source typings. For example:
11
- ```js
12
- /**
13
- * @param {number} x
14
- * @param {number} y
15
- * @param {!{delay?: number, button?: "left"|"right"|"middle", clickCount?: number}=} options
16
- */
17
- async click(x, y, options = {})
18
- ```
19
- Would become:
20
- ```py
21
- async def click(x, y, delay: float = None, button: str = None, clickCount: int = 1)
22
- ```
23
- Pull requests should focus on one specific area where practical to aid in quick review. [pre-commit hooks](https://pre-commit.com/)
24
- should be installed with `pre-commit install` to keep your code tidy.
25
-
26
- 1 - https://github.com/puppeteer/puppeteer
biolib/pyppeteer/LICENSE DELETED
@@ -1,12 +0,0 @@
1
-
2
- MIT License
3
-
4
- Copyright (c) 2017, Hiroyuki Takagi
5
-
6
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7
-
8
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9
-
10
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11
-
12
- This software includes the work that is distributed in the Apache License 2.0.
@@ -1,137 +0,0 @@
1
- pyppeteer
2
- ==========
3
-
4
- [![PyPI](https://img.shields.io/pypi/v/pyppeteer.svg)](https://pypi.python.org/pypi/pyppeteer)
5
- [![PyPI version](https://img.shields.io/pypi/pyversions/pyppeteer.svg)](https://pypi.python.org/pypi/pyppeteer)
6
- [![Documentation](https://img.shields.io/badge/docs-latest-brightgreen.svg)](https://pyppeteer.github.io/pyppeteer/)
7
- [![CircleCI](https://circleci.com/gh/pyppeteer/pyppeteer.svg?style=shield)](https://circleci.com/gh/pyppeteer/pyppeteer)
8
- [![codecov](https://codecov.io/gh/pyppeteer/pyppeteer/branch/dev/graph/badge.svg)](https://codecov.io/gh/pyppeteer/pyppeteer)
9
-
10
- _Note: this is a continuation of the [pyppeteer project](https://github.com/miyakogi/pyppeteer)_
11
-
12
- Unofficial Python port of [puppeteer](https://github.com/GoogleChrome/puppeteer) JavaScript (headless) chrome/chromium browser automation library.
13
-
14
- * Free software: MIT license (including the work distributed under the Apache 2.0 license)
15
- * Documentation: https://pyppeteer.github.io/pyppeteer/
16
-
17
- ## Installation
18
-
19
- pyppeteer requires Python >= 3.6
20
-
21
- Install with `pip` from PyPI:
22
-
23
- ```
24
- pip install pyppeteer
25
- ```
26
-
27
- Or install the latest version from [this github repo](https://github.com/pyppeteer/pyppeteer/):
28
-
29
- ```
30
- pip install -U git+https://github.com/pyppeteer/pyppeteer@dev
31
- ```
32
-
33
- ## Usage
34
-
35
- > **Note**: When you run pyppeteer for the first time, it downloads the latest version of Chromium (~150MB) if it is not found on your system. If you don't prefer this behavior, ensure that a suitable Chrome binary is installed. One way to do this is to run `pyppeteer-install` command before prior to using this library.
36
-
37
- Full documentation can be found [here](https://pyppeteer.github.io/pyppeteer/reference.html). [Puppeteer's documentation](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#) and [its troubleshooting guide](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md) are also great resources for pyppeteer users.
38
-
39
- ### Examples
40
-
41
- Open web page and take a screenshot:
42
- ```py
43
- import asyncio
44
- from pyppeteer import launch
45
-
46
- async def main():
47
- browser = await launch()
48
- page = await browser.newPage()
49
- await page.goto('https://example.com')
50
- await page.screenshot({'path': 'example.png'})
51
- await browser.close()
52
-
53
- asyncio.get_event_loop().run_until_complete(main())
54
- ```
55
-
56
- Evaluate javascript on a page:
57
- ```py
58
- import asyncio
59
- from pyppeteer import launch
60
-
61
- async def main():
62
- browser = await launch()
63
- page = await browser.newPage()
64
- await page.goto('https://example.com')
65
- await page.screenshot({'path': 'example.png'})
66
-
67
- dimensions = await page.evaluate('''() => {
68
- return {
69
- width: document.documentElement.clientWidth,
70
- height: document.documentElement.clientHeight,
71
- deviceScaleFactor: window.devicePixelRatio,
72
- }
73
- }''')
74
-
75
- print(dimensions)
76
- # >>> {'width': 800, 'height': 600, 'deviceScaleFactor': 1}
77
- await browser.close()
78
-
79
- asyncio.get_event_loop().run_until_complete(main())
80
- ```
81
-
82
- ## Differences between puppeteer and pyppeteer
83
-
84
- pyppeteer strives to replicate the puppeteer API as close as possible, however, fundamental differences between Javascript and Python make this difficult to do precisely. More information on specifics can be found in the [documentation](https://pyppeteer.github.io/pyppeteer/reference.html).
85
-
86
- ### Keyword arguments for options
87
-
88
- puppeteer uses an object for passing options to functions/methods. pyppeteer methods/functions accept both dictionary (python equivalent to JavaScript's objects) and keyword arguments for options.
89
-
90
- Dictionary style options (similar to puppeteer):
91
-
92
- ```python
93
- browser = await launch({'headless': True})
94
- ```
95
-
96
- Keyword argument style options (more pythonic, isn't it?):
97
-
98
- ```python
99
- browser = await launch(headless=True)
100
- ```
101
-
102
- ### Element selector method names
103
-
104
- In python, `$` is not a valid identifier. The equivalent methods to Puppeteer's `$`, `$$`, and `$x` methods are listed below, along with some shorthand methods for your convenience:
105
-
106
- | puppeteer | pyppeteer | pyppeteer shorthand |
107
- |-----------|-------------------------|----------------------|
108
- | Page.$() | Page.querySelector() | Page.J() |
109
- | Page.$$() | Page.querySelectorAll() | Page.JJ() |
110
- | Page.$x() | Page.xpath() | Page.Jx() |
111
-
112
- ### Arguments of `Page.evaluate()` and `Page.querySelectorEval()`
113
-
114
- puppeteer's version of `evaluate()` takes a JavaScript function or a string representation of a JavaScript expression. pyppeteer takes string representation of JavaScript expression or function. pyppeteer will try to automatically detect if the string is function or expression, but it will fail sometimes. If an expression is erroneously treated as function and an error is raised, try setting `force_expr` to `True`, to force pyppeteer to treat the string as expression.
115
-
116
- ### Examples:
117
-
118
- Get a page's `textContent`:
119
-
120
- ```python
121
- content = await page.evaluate('document.body.textContent', force_expr=True)
122
- ```
123
-
124
- Get an element's `textContent`:
125
-
126
- ```python
127
- element = await page.querySelector('h1')
128
- title = await page.evaluate('(element) => element.textContent', element)
129
- ```
130
-
131
- ## Roadmap
132
-
133
- See [projects](https://github.com/pyppeteer/pyppeteer/projects)
134
-
135
- ## Credits
136
-
137
- ###### This package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter) and the [audreyr/cookiecutter-pypackage](https://github.com/audreyr/cookiecutter-pypackage) project template.
@@ -1,177 +0,0 @@
1
- # Makefile for Sphinx documentation
2
- #
3
-
4
- # You can set these variables from the command line.
5
- SPHINXOPTS =
6
- SPHINXBUILD = sphinx-build
7
- PAPER =
8
- BUILDDIR = _build
9
-
10
- # User-friendly check for sphinx-build
11
- ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
12
- $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
13
- endif
14
-
15
- # Internal variables.
16
- PAPEROPT_a4 = -D latex_paper_size=a4
17
- PAPEROPT_letter = -D latex_paper_size=letter
18
- ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
19
- # the i18n builder cannot share the environment and doctrees with the others
20
- I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
21
-
22
- .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
23
-
24
- help:
25
- @echo "Please use \`make <target>' where <target> is one of"
26
- @echo " html to make standalone HTML files"
27
- @echo " dirhtml to make HTML files named index.html in directories"
28
- @echo " singlehtml to make a single large HTML file"
29
- @echo " pickle to make pickle files"
30
- @echo " json to make JSON files"
31
- @echo " htmlhelp to make HTML files and a HTML help project"
32
- @echo " qthelp to make HTML files and a qthelp project"
33
- @echo " devhelp to make HTML files and a Devhelp project"
34
- @echo " epub to make an epub"
35
- @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
36
- @echo " latexpdf to make LaTeX files and run them through pdflatex"
37
- @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
38
- @echo " text to make text files"
39
- @echo " man to make manual pages"
40
- @echo " texinfo to make Texinfo files"
41
- @echo " info to make Texinfo files and run them through makeinfo"
42
- @echo " gettext to make PO message catalogs"
43
- @echo " changes to make an overview of all changed/added/deprecated items"
44
- @echo " xml to make Docutils-native XML files"
45
- @echo " pseudoxml to make pseudoxml-XML files for display purposes"
46
- @echo " linkcheck to check all external links for integrity"
47
- @echo " doctest to run all doctests embedded in the documentation (if enabled)"
48
-
49
- clean:
50
- rm -rf $(BUILDDIR)/*
51
-
52
- html:
53
- $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
54
- @echo
55
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
56
-
57
- dirhtml:
58
- $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
59
- @echo
60
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
61
-
62
- singlehtml:
63
- $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
64
- @echo
65
- @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
66
-
67
- pickle:
68
- $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
69
- @echo
70
- @echo "Build finished; now you can process the pickle files."
71
-
72
- json:
73
- $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
74
- @echo
75
- @echo "Build finished; now you can process the JSON files."
76
-
77
- htmlhelp:
78
- $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
79
- @echo
80
- @echo "Build finished; now you can run HTML Help Workshop with the" \
81
- ".hhp project file in $(BUILDDIR)/htmlhelp."
82
-
83
- qthelp:
84
- $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
85
- @echo
86
- @echo "Build finished; now you can run "qcollectiongenerator" with the" \
87
- ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
88
- @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pyppeteer.qhcp"
89
- @echo "To view the help file:"
90
- @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pyppeteer.qhc"
91
-
92
- devhelp:
93
- $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
94
- @echo
95
- @echo "Build finished."
96
- @echo "To view the help file:"
97
- @echo "# mkdir -p $$HOME/.local/share/devhelp/pyppeteer"
98
- @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pyppeteer"
99
- @echo "# devhelp"
100
-
101
- epub:
102
- $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
103
- @echo
104
- @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
105
-
106
- latex:
107
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
108
- @echo
109
- @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
110
- @echo "Run \`make' in that directory to run these through (pdf)latex" \
111
- "(use \`make latexpdf' here to do that automatically)."
112
-
113
- latexpdf:
114
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
115
- @echo "Running LaTeX files through pdflatex..."
116
- $(MAKE) -C $(BUILDDIR)/latex all-pdf
117
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
118
-
119
- latexpdfja:
120
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
121
- @echo "Running LaTeX files through platex and dvipdfmx..."
122
- $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
123
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
124
-
125
- text:
126
- $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
127
- @echo
128
- @echo "Build finished. The text files are in $(BUILDDIR)/text."
129
-
130
- man:
131
- $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
132
- @echo
133
- @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
134
-
135
- texinfo:
136
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
137
- @echo
138
- @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
139
- @echo "Run \`make' in that directory to run these through makeinfo" \
140
- "(use \`make info' here to do that automatically)."
141
-
142
- info:
143
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
144
- @echo "Running Texinfo files through makeinfo..."
145
- make -C $(BUILDDIR)/texinfo info
146
- @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
147
-
148
- gettext:
149
- $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
150
- @echo
151
- @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
152
-
153
- changes:
154
- $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
155
- @echo
156
- @echo "The overview file is in $(BUILDDIR)/changes."
157
-
158
- linkcheck:
159
- $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
160
- @echo
161
- @echo "Link check complete; look for any errors in the above output " \
162
- "or in $(BUILDDIR)/linkcheck/output.txt."
163
-
164
- doctest:
165
- $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
166
- @echo "Testing of doctests in the sources finished, look at the " \
167
- "results in $(BUILDDIR)/doctest/output.txt."
168
-
169
- xml:
170
- $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
171
- @echo
172
- @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
173
-
174
- pseudoxml:
175
- $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
176
- @echo
177
- @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
@@ -1,28 +0,0 @@
1
- h1.logo {
2
- font-family: "Raleway";
3
- font-weight: 500;
4
- }
5
-
6
- a.headerlink {
7
- color: rgba(0, 0, 0, 0.1);
8
- }
9
-
10
- div.sphinxsidebarwrapper p.blurb {
11
- font-family: Lato, sans-serif;
12
- }
13
-
14
- div.sphinxsidebar li.toctree-l1 {
15
- font-family: Lato, sans-serif;
16
- }
17
-
18
- body {
19
- background-color: #fafafa
20
- }
21
-
22
- .search-btn {
23
- padding: 0 1em;
24
- font-family: Lato, sans-serif;
25
- font-weight: normal;
26
- line-height: normal;
27
- align-self: stretch;
28
- }
@@ -1,10 +0,0 @@
1
- {% extends 'alabaster/layout.html' %}
2
- {% block extrahead %}
3
- <!-- font -->
4
- <link href='https://fonts.googleapis.com/css?family=Raleway:500' rel='stylesheet' type='text/css'>
5
- <link href='https://fonts.googleapis.com/css?family=Lato:400,400italic' rel='stylesheet' type='text/css'>
6
- <link href='https://fonts.googleapis.com/css?family=Noto+Serif:400,400italic,700,700italic' rel='stylesheet' type='text/css'>
7
- <link href='https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,400italic,700,700italic' rel='stylesheet' type='text/css'>
8
- <!-- Style -->
9
- {{ super() }}
10
- {% endblock %}
@@ -1 +0,0 @@
1
- .. mdinclude:: ../CHANGES.md