opencloning 0.4.3__tar.gz → 0.4.5__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 (49) hide show
  1. {opencloning-0.4.3 → opencloning-0.4.5}/PKG-INFO +2 -2
  2. {opencloning-0.4.3 → opencloning-0.4.5}/pyproject.toml +2 -2
  3. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/app_settings.py +1 -0
  4. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/endpoints/external_import.py +20 -1
  5. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/endpoints/other.py +20 -1
  6. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/http_client.py +1 -1
  7. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/pydantic_models.py +5 -0
  8. {opencloning-0.4.3 → opencloning-0.4.5}/LICENSE +0 -0
  9. {opencloning-0.4.3 → opencloning-0.4.5}/README.md +0 -0
  10. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/__init__.py +0 -0
  11. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/_version.py +0 -0
  12. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/api_config_utils.py +0 -0
  13. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/EBIC/__init__.py +0 -0
  14. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/EBIC/barcode.gb +0 -0
  15. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/EBIC/common_plasmid.gb +0 -0
  16. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/EBIC/example.py +0 -0
  17. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/EBIC/primer_design_settings.py +0 -0
  18. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/__init__.py +0 -0
  19. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/index.html +0 -0
  20. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/pombe/__init__.py +0 -0
  21. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/pombe/index.html +0 -0
  22. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/pombe/pombe_clone.py +0 -0
  23. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/pombe/pombe_gather.py +0 -0
  24. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/pombe/pombe_get_primers.py +0 -0
  25. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/pombe/pombe_summary.py +0 -0
  26. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/ziqiang_et_al2024/__init__.py +0 -0
  27. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/ziqiang_et_al2024/index.html +0 -0
  28. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/batch_cloning/ziqiang_et_al2024/ziqiang_et_al2024.json +0 -0
  29. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/bug_fixing/README.md +0 -0
  30. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/bug_fixing/__init__.py +0 -0
  31. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/bug_fixing/backend_v0_3.py +0 -0
  32. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/cre_lox.py +0 -0
  33. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/dna_functions.py +0 -0
  34. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/dna_utils.py +0 -0
  35. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/ebic/__init__.py +0 -0
  36. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/ebic/primer_design.py +0 -0
  37. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/ebic/primer_design_settings.py +0 -0
  38. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/endpoints/annotation.py +0 -0
  39. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/endpoints/assembly.py +0 -0
  40. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/endpoints/no_assembly.py +0 -0
  41. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/endpoints/no_input.py +0 -0
  42. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/endpoints/primer_design.py +0 -0
  43. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/gateway.py +0 -0
  44. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/get_router.py +0 -0
  45. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/main.py +0 -0
  46. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/ncbi_requests.py +0 -0
  47. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/primer_design.py +0 -0
  48. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/request_examples.py +0 -0
  49. {opencloning-0.4.3 → opencloning-0.4.5}/src/opencloning/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencloning
3
- Version: 0.4.3
3
+ Version: 0.4.5
4
4
  Summary: Backend of OpenCloning, a web application to generate molecular cloning strategies in json format, and share them with others.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -17,7 +17,7 @@ Requires-Dist: beautifulsoup4 (>=4.11.1,<5.0.0)
17
17
  Requires-Dist: biopython (>=1.85,<2.0)
18
18
  Requires-Dist: fastapi
19
19
  Requires-Dist: httpx (>=0.28.1,<0.29.0)
20
- Requires-Dist: opencloning-linkml (==0.4.3)
20
+ Requires-Dist: opencloning-linkml (==0.4.4)
21
21
  Requires-Dist: openpyxl (>=3.1.5,<4.0.0)
22
22
  Requires-Dist: packaging (>=25.0,<26.0)
23
23
  Requires-Dist: pairwise-alignments-to-msa (>=0.1.1,<0.2.0)
@@ -8,7 +8,7 @@ authors = ["Manuel Lera-Ramirez <manulera14@gmail.com>"]
8
8
  description = "Backend of OpenCloning, a web application to generate molecular cloning strategies in json format, and share them with others."
9
9
  license = "MIT"
10
10
  name = "opencloning"
11
- version = "0.4.3"
11
+ version = "0.4.5"
12
12
  package-mode = true
13
13
  readme = "README.md"
14
14
  repository = "https://github.com/manulera/OpenCloning_backend"
@@ -26,7 +26,7 @@ pydantic = "^2.7.1"
26
26
  pandas = "^2.2.3"
27
27
  openpyxl = "^3.1.5"
28
28
  pyyaml = "^6.0.2"
29
- opencloning-linkml = "0.4.3"
29
+ opencloning-linkml = "0.4.4"
30
30
  primer3-py = "2.2.0"
31
31
  biopython = "^1.85"
32
32
  packaging = "^25.0"
@@ -44,6 +44,7 @@ default_allowed_urls = [
44
44
  'http://www.euroscarf.de/',
45
45
  'https://wekwikgene.wllsb.edu.cn',
46
46
  'http://bahlerweb.cs.ucl.ac.uk',
47
+ 'https://assets.opencloning.org/open-dna-collections',
47
48
  ]
48
49
 
49
50
  if os.environ.get('ALLOWED_EXTERNAL_URLS') is not None:
@@ -24,6 +24,7 @@ from ..pydantic_models import (
24
24
  SequenceFileFormat,
25
25
  SEVASource,
26
26
  SequenceLocationStr,
27
+ OpenDNACollectionsSource,
27
28
  )
28
29
  from ..dna_functions import (
29
30
  format_sequence_genbank,
@@ -234,7 +235,8 @@ def repository_id_http_error_handler(exception: HTTPError, source: RepositoryIdS
234
235
  | list[BenchlingUrlSource]
235
236
  | list[EuroscarfSource]
236
237
  | list[WekWikGeneIdSource]
237
- | list[SEVASource],
238
+ | list[SEVASource]
239
+ | list[OpenDNACollectionsSource],
238
240
  ...,
239
241
  ),
240
242
  sequences=(list[TextFileSequence], ...),
@@ -249,6 +251,7 @@ async def get_from_repository_id(
249
251
  | EuroscarfSource
250
252
  | WekWikGeneIdSource
251
253
  | SEVASource
254
+ | OpenDNACollectionsSource
252
255
  ),
253
256
  ):
254
257
  return RedirectResponse(f'/repository_id/{source.repository_name}', status_code=307)
@@ -384,6 +387,22 @@ async def get_from_repository_id_igem(source: IGEMSource):
384
387
  repository_id_http_error_handler(exception, source)
385
388
 
386
389
 
390
+ @router.post(
391
+ '/repository_id/open_dna_collections',
392
+ response_model=create_model(
393
+ 'OpenDNACollectionsResponse',
394
+ sources=(list[OpenDNACollectionsSource], ...),
395
+ sequences=(list[TextFileSequence], ...),
396
+ ),
397
+ )
398
+ async def get_from_repository_id_open_dna_collections(source: OpenDNACollectionsSource):
399
+ try:
400
+ dseq = (await get_sequences_from_file_url(source.sequence_file_url))[0]
401
+ return {'sequences': [format_sequence_genbank(dseq, source.output_name)], 'sources': [source]}
402
+ except HTTPError as exception:
403
+ repository_id_http_error_handler(exception, source)
404
+
405
+
387
406
  @router.post(
388
407
  '/genome_coordinates',
389
408
  response_model=create_model(
@@ -3,6 +3,7 @@ from Bio.Restriction.Restriction_Dictionary import rest_dict
3
3
  from pydantic import ValidationError
4
4
  from opencloning_linkml.migrations import migrate
5
5
  from opencloning_linkml._version import __version__ as schema_version
6
+ import os
6
7
 
7
8
  from ..bug_fixing.backend_v0_3 import fix_backend_v0_3
8
9
 
@@ -22,9 +23,27 @@ from .._version import __version__ as backend_version
22
23
  router = get_router()
23
24
 
24
25
 
26
+ def version_to_int(version: str | None) -> int | None:
27
+ if version is None:
28
+ return None
29
+ try:
30
+ version = version.replace('v', '')
31
+ # Pad to 2 digits
32
+ int_vals = [val.zfill(2) for val in version.split('.')]
33
+ return int(''.join(int_vals))
34
+ except ValueError:
35
+ return None
36
+
37
+
25
38
  @router.get('/version')
26
39
  async def get_version():
27
- return {'backend_version': backend_version, 'schema_version': schema_version}
40
+ opencloning_version = os.getenv('OPENCLONING_VERSION')
41
+ return {
42
+ 'backend_version': backend_version,
43
+ 'schema_version': schema_version,
44
+ 'opencloning_version': opencloning_version,
45
+ 'opencloning_version_int': version_to_int(opencloning_version),
46
+ }
28
47
 
29
48
 
30
49
  @router.get('/restriction_enzyme_list', response_model=dict[str, list[str]])
@@ -22,7 +22,7 @@ class AllowedExternalUrlsTransport(AsyncHTTPTransport):
22
22
  async def handle_async_request(self, request: Request) -> Response:
23
23
  if any(str(request.url).startswith(url) for url in allowed_external_urls):
24
24
  return await super().handle_async_request(request)
25
-
25
+ print('>>>', request.url)
26
26
  raise HTTPError(request.url, 403, f'Request to {request.url} is not allowed', None, None)
27
27
 
28
28
 
@@ -50,6 +50,7 @@ from opencloning_linkml.datamodel import (
50
50
  CreLoxRecombinationSource as _CreLoxRecombinationSource,
51
51
  InVivoAssemblySource as _InVivoAssemblySource,
52
52
  SourceInput as _SourceInput,
53
+ OpenDNACollectionsSource as _OpenDNACollectionsSource,
53
54
  )
54
55
  from pydna.assembly2 import (
55
56
  edge_representation2subfragment_representation,
@@ -183,6 +184,10 @@ class IGEMSource(SourceCommonClass, _IGEMSource):
183
184
  return self
184
185
 
185
186
 
187
+ class OpenDNACollectionsSource(SourceCommonClass, _OpenDNACollectionsSource):
188
+ pass
189
+
190
+
186
191
  class SEVASource(SourceCommonClass, _SEVASource):
187
192
  pass
188
193
 
File without changes
File without changes