port-ocean 0.10.8__py3-none-any.whl → 0.10.10__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.

Potentially problematic release.


This version of port-ocean might be problematic. Click here for more details.

@@ -9,6 +9,17 @@ from port_ocean.cli.commands.main import cli_start, print_logo, console
9
9
  from port_ocean.cli.utils import cli_root_path
10
10
 
11
11
 
12
+ def symlink_makefile(result: str, name: str) -> None:
13
+ infra_make_file = os.path.join(
14
+ os.path.dirname(result), "../integrations/_infra/Makefile"
15
+ )
16
+ target_link_make_file = os.path.join(
17
+ os.path.dirname(result), f"../integrations/{name}/Makefile"
18
+ )
19
+
20
+ os.link(infra_make_file, target_link_make_file)
21
+
22
+
12
23
  def add_vscode_configuration(result: str, name: str) -> None:
13
24
  vscode_entry_root_path = "${workspaceFolder}/integrations/" + name
14
25
  new_vscode_entry = {
@@ -66,6 +77,7 @@ def new(path: str, is_private_integration: bool) -> None:
66
77
 
67
78
  if not is_private_integration:
68
79
  add_vscode_configuration(result, name)
80
+ symlink_makefile(result, name)
69
81
 
70
82
  console.print(
71
83
  "\n🌊 Ahoy, Captain! Your project is ready to set sail into the vast ocean of possibilities!",
@@ -64,7 +64,6 @@ class BlueprintClientMixin:
64
64
  f"Deleting blueprint with id: {identifier} with all entities: {delete_entities}"
65
65
  )
66
66
  headers = await self.auth.headers(user_agent_type)
67
- response = None
68
67
 
69
68
  if not delete_entities:
70
69
  response = await self.client.delete(
@@ -82,7 +81,9 @@ class BlueprintClientMixin:
82
81
  handle_status_code(response, should_raise)
83
82
  return response.json().get("migrationId", "")
84
83
 
85
- async def create_action(self, action: dict[str, Any]) -> None:
84
+ async def create_action(
85
+ self, action: dict[str, Any], should_log: bool = True
86
+ ) -> None:
86
87
  logger.info(f"Creating action: {action}")
87
88
  response = await self.client.post(
88
89
  f"{self.auth.api_url}/actions",
@@ -90,12 +91,13 @@ class BlueprintClientMixin:
90
91
  headers=await self.auth.headers(),
91
92
  )
92
93
 
93
- handle_status_code(response)
94
+ handle_status_code(response, should_log=should_log)
94
95
 
95
96
  async def create_scorecard(
96
97
  self,
97
98
  blueprint_identifier: str,
98
99
  scorecard: dict[str, Any],
100
+ should_log: bool = True,
99
101
  ) -> None:
100
102
  logger.info(f"Creating scorecard: {scorecard}")
101
103
  response = await self.client.post(
@@ -104,11 +106,10 @@ class BlueprintClientMixin:
104
106
  headers=await self.auth.headers(),
105
107
  )
106
108
 
107
- handle_status_code(response)
109
+ handle_status_code(response, should_log=should_log)
108
110
 
109
111
  async def create_page(
110
- self,
111
- page: dict[str, Any],
112
+ self, page: dict[str, Any], should_log: bool = True
112
113
  ) -> dict[str, Any]:
113
114
  logger.info(f"Creating page: {page}")
114
115
  response = await self.client.post(
@@ -117,7 +118,7 @@ class BlueprintClientMixin:
117
118
  headers=await self.auth.headers(),
118
119
  )
119
120
 
120
- handle_status_code(response)
121
+ handle_status_code(response, should_log=should_log)
121
122
  return page
122
123
 
123
124
  async def delete_page(
@@ -120,7 +120,7 @@ async def _create_resources(
120
120
  )
121
121
  return
122
122
 
123
- created_blueprints, errors = await gather_and_split_errors_from_results(
123
+ created_blueprints, blueprint_errors = await gather_and_split_errors_from_results(
124
124
  (
125
125
  port_client.create_blueprint(
126
126
  blueprint, user_agent_type=UserAgentType.exporter
@@ -131,15 +131,17 @@ async def _create_resources(
131
131
 
132
132
  created_blueprints_identifiers = [bp["identifier"] for bp in created_blueprints]
133
133
 
134
- if errors:
135
- for error in errors:
134
+ if blueprint_errors:
135
+ for error in blueprint_errors:
136
136
  if isinstance(error, httpx.HTTPStatusError):
137
137
  logger.warning(
138
138
  f"Failed to create resources: {error.response.text}. Rolling back changes..."
139
139
  )
140
140
 
141
- raise AbortDefaultCreationError(created_blueprints_identifiers, errors)
142
- created_pages_identifiers = []
141
+ raise AbortDefaultCreationError(
142
+ created_blueprints_identifiers, blueprint_errors
143
+ )
144
+
143
145
  try:
144
146
  for patch_stage in blueprint_patches:
145
147
  await asyncio.gather(
@@ -153,44 +155,43 @@ async def _create_resources(
153
155
  )
154
156
  )
155
157
 
156
- await asyncio.gather(
157
- *(port_client.create_action(action) for action in defaults.actions)
158
+ except httpx.HTTPStatusError as err:
159
+ logger.error(f"Failed to create resources: {err.response.text}. continuing...")
160
+ raise AbortDefaultCreationError(created_blueprints_identifiers, [err])
161
+ try:
162
+ created_actions, actions_errors = await gather_and_split_errors_from_results(
163
+ (
164
+ port_client.create_action(action, should_log=False)
165
+ for action in defaults.actions
166
+ )
158
167
  )
159
168
 
160
- await asyncio.gather(
161
- *(
162
- port_client.create_scorecard(blueprint_scorecards["blueprint"], action)
163
- for blueprint_scorecards in defaults.scorecards
164
- for action in blueprint_scorecards["data"]
169
+ created_scorecards, scorecards_errors = (
170
+ await gather_and_split_errors_from_results(
171
+ (
172
+ port_client.create_scorecard(
173
+ blueprint_scorecards["blueprint"], action, should_log=False
174
+ )
175
+ for blueprint_scorecards in defaults.scorecards
176
+ for action in blueprint_scorecards["data"]
177
+ )
165
178
  )
166
179
  )
167
180
 
168
181
  created_pages, pages_errors = await gather_and_split_errors_from_results(
169
- (port_client.create_page(page) for page in defaults.pages)
182
+ (port_client.create_page(page, should_log=False) for page in defaults.pages)
170
183
  )
171
- created_pages_identifiers = [
172
- page.get("identifier", "") for page in created_pages
173
- ]
174
184
 
175
- if pages_errors:
176
- for error in pages_errors:
185
+ errors = actions_errors + scorecards_errors + pages_errors
186
+ if errors:
187
+ for error in errors:
177
188
  if isinstance(error, httpx.HTTPStatusError):
178
189
  logger.warning(
179
- f"Failed to create resources: {error.response.text}. Rolling back changes..."
190
+ f"Failed to create resource: {error.response.text}. continuing..."
180
191
  )
181
192
 
182
- raise AbortDefaultCreationError(
183
- created_blueprints_identifiers,
184
- pages_errors,
185
- created_pages_identifiers,
186
- )
187
- except httpx.HTTPStatusError as err:
188
- logger.error(
189
- f"Failed to create resources: {err.response.text}. Rolling back changes..."
190
- )
191
- raise AbortDefaultCreationError(
192
- created_blueprints_identifiers, [err], created_pages_identifiers
193
- )
193
+ except Exception as err:
194
+ logger.error(f"Failed to create resources: {err}. continuing...")
194
195
 
195
196
 
196
197
  async def _initialize_defaults(
@@ -227,19 +228,6 @@ async def _initialize_defaults(
227
228
  for identifier in e.blueprints_to_rollback
228
229
  )
229
230
  )
230
- if e.pages_to_rollback:
231
- logger.warning(
232
- f"Failed to create resources. Rolling back pages : {e.pages_to_rollback}"
233
- )
234
- await asyncio.gather(
235
- *(
236
- port_client.delete_page(
237
- identifier,
238
- )
239
- for identifier in e.pages_to_rollback
240
- )
241
- )
242
-
243
231
  raise ExceptionGroup(str(e), e.errors)
244
232
 
245
233
 
@@ -6,10 +6,8 @@ class AbortDefaultCreationError(BaseOceanException):
6
6
  self,
7
7
  blueprints_to_rollback: list[str],
8
8
  errors: list[Exception],
9
- pages_to_rollback: list[str] | None = None,
10
9
  ):
11
10
  self.blueprints_to_rollback = blueprints_to_rollback
12
- self.pages_to_rollback = pages_to_rollback
13
11
  self.errors = errors
14
12
  super().__init__("Aborting defaults creation")
15
13
 
@@ -1,5 +1,6 @@
1
1
  import sys
2
2
  from inspect import getmembers
3
+ from pathlib import Path
3
4
  from typing import Dict, List, Set, Tuple, Union
4
5
 
5
6
  from yaml import safe_load
@@ -8,13 +9,17 @@ from port_ocean.bootstrap import create_default_app
8
9
  from port_ocean.core.handlers.port_app_config.models import ResourceConfig
9
10
  from port_ocean.core.ocean_types import RESYNC_RESULT
10
11
  from port_ocean.ocean import Ocean
11
- from port_ocean.utils.misc import load_module
12
+ from port_ocean.utils.misc import get_spec_file, load_module
12
13
 
13
14
 
14
15
  def get_integration_ocean_app(integration_path: str) -> Ocean:
16
+ spec_file = get_spec_file(Path(integration_path))
17
+
18
+ config_factory = None if not spec_file else spec_file.get("configurations", [])
19
+
15
20
  default_app = create_default_app(
16
21
  integration_path,
17
- None,
22
+ config_factory,
18
23
  {
19
24
  "port": {
20
25
  "client_id": "bla",
@@ -36,7 +36,7 @@ async def stream_async_iterators_tasks(
36
36
  :return: A stream of results
37
37
  """
38
38
  if not tasks:
39
- raise StopAsyncIteration("No tasks provided")
39
+ return
40
40
 
41
41
  if len(tasks) == 1:
42
42
  async for batch_items in tasks[0]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: port-ocean
3
- Version: 0.10.8
3
+ Version: 0.10.10
4
4
  Summary: Port Ocean is a CLI tool for managing your Port projects.
5
5
  Home-page: https://app.getport.io
6
6
  Keywords: ocean,port-ocean,port
@@ -9,7 +9,7 @@ port_ocean/cli/commands/defaults/dock.py,sha256=pFtHrU_LTvb5Ddrzj09Wxy-jg1Ym10wB
9
9
  port_ocean/cli/commands/defaults/group.py,sha256=hii_4CYoQ7jSMePbnP4AmruO_RKWCUcoV7dXXBlZafc,115
10
10
  port_ocean/cli/commands/list_integrations.py,sha256=DVVioFruGUE-_v6UUHlcemWNN6RlWwCrf1X4HmAXsf8,1134
11
11
  port_ocean/cli/commands/main.py,sha256=gj0lmuLep2XeLNuabB7Wk0UVYPT7_CD_rAw5AoUQWSE,1057
12
- port_ocean/cli/commands/new.py,sha256=3hefYQrFXJzwfoJgV8yHgnB0HYOVmk3-6XQeb694_Ao,3404
12
+ port_ocean/cli/commands/new.py,sha256=uNDzb2cmUdOHBGsBujWmlB9FrlJvB8CD9dnXY_btGUc,3777
13
13
  port_ocean/cli/commands/pull.py,sha256=VvrRjLNlfPuLIf7KzeIcbzzdi98Z0M9wCRpXC3QPxdI,2306
14
14
  port_ocean/cli/commands/sail.py,sha256=rY7rEMjfy_KXiWvtL0T72TTLgeQ3HW4SOzKkz9wL9nI,2282
15
15
  port_ocean/cli/commands/version.py,sha256=hEuIEIcm6Zkamz41Z9nxeSM_4g3oNlAgWwQyDGboh-E,536
@@ -27,7 +27,6 @@ port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml,sh
27
27
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md,sha256=XVSgyxfXJZoZmtwaGbQ8XmCapIthe4E7flfuJub-m_s,338
28
28
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md,sha256=ZQwD3K35q0wugHZmb1z5wnynmn0uuzwGFSpjm7GieZU,259
29
29
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/Dockerfile,sha256=LsH3vZqqEJkzeQG44cE7JkvPAuh_WPSqYam4YoMvG3M,328
30
- port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/Makefile,sha256=2eoJjrQj_zxapvuhX3ohVSgDGgWIF-VwgGvrWPfl5vw,1783
31
30
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md,sha256=5VZmgDRW9gO4d8UuzkujslOIDfIDBiAGL2Hd74HK770,468
32
31
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore,sha256=JAo-DTfS6GthQGP1NH6wLU-ZymwlTea4KHH_jZVTKn0,14
33
32
  port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py,sha256=_TRsA2s6GV2E3CTI8CHcsH-ZuH4_Eh5-juDXWaET0ho,65
@@ -43,7 +42,7 @@ port_ocean/clients/port/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
43
42
  port_ocean/clients/port/authentication.py,sha256=t3z6h4vld-Tzkpth15sstaMJg0rccX-pXXjNtOa-nCY,2949
44
43
  port_ocean/clients/port/client.py,sha256=Xd8Jk25Uh4WXY_WW-z1Qbv6F3ZTBFPoOolsxHMfozKw,3366
45
44
  port_ocean/clients/port/mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- port_ocean/clients/port/mixins/blueprints.py,sha256=8ZVC5i8K1WKQMJJiPqZmgcOlF3OyxWz1aAQ_WA5UW3c,4500
45
+ port_ocean/clients/port/mixins/blueprints.py,sha256=POBl4uDocrgJBw4rvCAzwRcD4jk-uBL6pDAuKMTajdg,4633
47
46
  port_ocean/clients/port/mixins/entities.py,sha256=WdqT1gyS81pByUl9xIfZz_xEHRaBfDuZ-ekKX53oBSE,8870
48
47
  port_ocean/clients/port/mixins/integrations.py,sha256=HnWXaJt41SUcha-bhvLdJW07j-l7xIo91GUzzwl2f_E,4859
49
48
  port_ocean/clients/port/mixins/migrations.py,sha256=A6896oJF6WbFL2WroyTkMzr12yhVyWqGoq9dtLNSKBY,1457
@@ -64,7 +63,7 @@ port_ocean/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
63
  port_ocean/core/defaults/__init__.py,sha256=8qCZg8n06WAdMu9s_FiRtDYLGPGHbOuS60vapeUoAks,142
65
64
  port_ocean/core/defaults/clean.py,sha256=S3UAfca-oU89WJKIB4OgGjGjPr0vxBQ2aRZsLTZhQ04,2185
66
65
  port_ocean/core/defaults/common.py,sha256=uVUg6VEn4RqtXQwLwMNGfkmT5zYRN_h5USfKw3poVyo,3561
67
- port_ocean/core/defaults/initialize.py,sha256=5po9QtZNIXwxH8c0QoTKp8ag4aHt4rmOsO5CKH7fft0,8713
66
+ port_ocean/core/defaults/initialize.py,sha256=qg4JLIWjp0c5-9w09X99muHRYX4k1cGZ_77vYo-tnpU,8422
68
67
  port_ocean/core/event_listener/__init__.py,sha256=mzJ33wRq0kh60fpVdOHVmvMTUQIvz3vxmifyBgwDn0E,889
69
68
  port_ocean/core/event_listener/base.py,sha256=1Nmpg00OfT2AD2L8eFm4VQEcdG2TClpSWJMhWhAjkEE,2356
70
69
  port_ocean/core/event_listener/factory.py,sha256=AYYfSHPAF7P5H-uQECXT0JVJjKDHrYkWJJBSL4mGkg8,3697
@@ -106,7 +105,7 @@ port_ocean/exceptions/base.py,sha256=uY4DX7fIITDFfemCJDWpaZi3bD51lcANc5swpoNvMJA
106
105
  port_ocean/exceptions/clients.py,sha256=LKLLs-Zy3caNG85rwxfOw2rMr8qqVV6SHUq4fRCZ99U,180
107
106
  port_ocean/exceptions/context.py,sha256=mA8HII6Rl4QxKUz98ppy1zX3kaziaen21h1ZWuU3ADc,372
108
107
  port_ocean/exceptions/core.py,sha256=Zmb1m6NnkSPWpAiQA5tgejm3zpDMt1WQEN47OJNo54A,856
109
- port_ocean/exceptions/port_defaults.py,sha256=pJ5im06ziDX2IVstSlYIjVHhs4JW-N0Vr0PqlDNhAb4,541
108
+ port_ocean/exceptions/port_defaults.py,sha256=45Bno5JEB-GXztvKsy8mw7TrydQmw13-4JAo2oQmXkE,438
110
109
  port_ocean/exceptions/utils.py,sha256=gjOqpi-HpY1l4WlMFsGA9yzhxDhajhoGGdDDyGbLnqI,197
111
110
  port_ocean/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
111
  port_ocean/helpers/async_client.py,sha256=SRlP6o7_FCSY3UHnRlZdezppePVxxOzZ0z861vE3K40,1783
@@ -122,11 +121,11 @@ port_ocean/run.py,sha256=rTxBlrQd4yyrtgErCFJCHCEHs7d1OXrRiJehUYmIbN0,2212
122
121
  port_ocean/sonar-project.properties,sha256=X_wLzDOkEVmpGLRMb2fg9Rb0DxWwUFSvESId8qpvrPI,73
123
122
  port_ocean/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
124
123
  port_ocean/tests/clients/port/mixins/test_entities.py,sha256=A9myrnkLhKSQrnOLv1Zz2wiOVSxW65Q9RIUIRbn_V7w,1586
125
- port_ocean/tests/helpers/__init__.py,sha256=XQBdAi54t9VavF11dGVLeS1jSoEKRjqRemKskLh-nSo,2377
124
+ port_ocean/tests/helpers/__init__.py,sha256=K-8wwjJz9N5F76P3NZZxe-g7nroMGjHl3semIjyuNog,2567
126
125
  port_ocean/tests/test_sample.py,sha256=Ew5LA_G1k6DC5a2ygU2FoyjZQa0fRmPy73N0bio0d14,46
127
126
  port_ocean/utils/__init__.py,sha256=KMGnCPXZJbNwtgxtyMycapkDz8tpSyw23MSYT3iVeHs,91
128
127
  port_ocean/utils/async_http.py,sha256=arnH458TExn2Dju_Sy6pHas_vF5RMWnOp-jBz5WAAcE,1226
129
- port_ocean/utils/async_iterators.py,sha256=buFBiPdsqkNMCk91h6ZG8hJa181j7RjgHajbfgeB8A8,1608
128
+ port_ocean/utils/async_iterators.py,sha256=iw3cUHxfQm3zUSPdw2FmSXDU8E1Ppnys4TGhswNuQ8s,1569
130
129
  port_ocean/utils/cache.py,sha256=3KItZDE2yVrbVDr-hoM8lNna8s2dlpxhP4ICdLjH4LQ,2231
131
130
  port_ocean/utils/misc.py,sha256=0q2cJ5psqxn_5u_56pT7vOVQ3shDM02iC1lzyWQ_zl0,2098
132
131
  port_ocean/utils/queue_utils.py,sha256=KWWl8YVnG-glcfIHhM6nefY-2sou_C6DVP1VynQwzB4,2762
@@ -134,8 +133,8 @@ port_ocean/utils/repeat.py,sha256=0EFWM9d8lLXAhZmAyczY20LAnijw6UbIECf5lpGbOas,32
134
133
  port_ocean/utils/signal.py,sha256=K-6kKFQTltcmKDhtyZAcn0IMa3sUpOHGOAUdWKgx0_E,1369
135
134
  port_ocean/utils/time.py,sha256=pufAOH5ZQI7gXvOvJoQXZXZJV-Dqktoj9Qp9eiRwmJ4,1939
136
135
  port_ocean/version.py,sha256=UsuJdvdQlazzKGD3Hd5-U7N69STh8Dq9ggJzQFnu9fU,177
137
- port_ocean-0.10.8.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
138
- port_ocean-0.10.8.dist-info/METADATA,sha256=RkH8PbV-aHXG36GanolJDtpHUZtdjtVn4_8cIId-St8,6616
139
- port_ocean-0.10.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
140
- port_ocean-0.10.8.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
141
- port_ocean-0.10.8.dist-info/RECORD,,
136
+ port_ocean-0.10.10.dist-info/LICENSE.md,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
137
+ port_ocean-0.10.10.dist-info/METADATA,sha256=TYp3Vs2UhjxUckbdD-qPXrmJONsIn94f66BHbsSmtxI,6617
138
+ port_ocean-0.10.10.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
139
+ port_ocean-0.10.10.dist-info/entry_points.txt,sha256=F_DNUmGZU2Kme-8NsWM5LLE8piGMafYZygRYhOVtcjA,54
140
+ port_ocean-0.10.10.dist-info/RECORD,,
@@ -1,74 +0,0 @@
1
- ACTIVATE := . .venv/bin/activate
2
-
3
- define run_checks
4
- exit_code=0; \
5
- cd $1; \
6
- poetry check || exit_code=$$?;\
7
- mypy . || exit_code=$$?; \
8
- ruff check . || exit_code=$$?; \
9
- black --check . || exit_code=$$?; \
10
- if [ $$exit_code -eq 1 ]; then \
11
- echo "\033[0;31mOne or more checks failed with exit code $$exit_code\033[0m"; \
12
- else \
13
- echo "\033[0;32mAll checks executed successfully.\033[0m"; \
14
- fi; \
15
- exit $$exit_code
16
- endef
17
-
18
- define install_poetry
19
- if ! command -v poetry &> /dev/null; then \
20
- pip install --upgrade pip; \
21
- pip install poetry; \
22
- else \
23
- echo "Poetry is already installed."; \
24
- fi
25
- endef
26
-
27
- define deactivate_virtualenv
28
- if [ -n "$$VIRTUAL_ENV" ]; then \
29
- unset VIRTUAL_ENV; \
30
- unset PYTHONHOME; \
31
- unset -f pydoc >/dev/null 2>&1; \
32
- OLD_PATH="$$PATH"; \
33
- PATH=$$(echo -n "$$PATH" | awk -v RS=: -v ORS=: '/\/virtualenv\/bin$$/ {next} {print}'); \
34
- export PATH; \
35
- hash -r; \
36
- echo "Deactivated the virtual environment."; \
37
- fi
38
- endef
39
-
40
- .SILENT: install install/prod lint run test clean
41
-
42
- install:
43
- $(call deactivate_virtualenv) && \
44
- $(call install_poetry) && \
45
- poetry install --with dev
46
-
47
- install/prod:
48
- $(call install_poetry) && \
49
- poetry install --without dev --no-root --no-interaction --no-ansi --no-cache
50
-
51
- lint:
52
- $(ACTIVATE) && \
53
- $(call run_checks,.)
54
-
55
- run:
56
- $(ACTIVATE) && ocean sail
57
-
58
- test:
59
- $(ACTIVATE) && poetry run pytest -n auto
60
-
61
- clean:
62
- @find . -name '.venv' -type d -exec rm -rf {} \;
63
- @find . -name '*.pyc' -exec rm -rf {} \;
64
- @find . -name '__pycache__' -exec rm -rf {} \;
65
- @find . -name 'Thumbs.db' -exec rm -rf {} \;
66
- @find . -name '*~' -exec rm -rf {} \;
67
- rm -rf .cache
68
- rm -rf build
69
- rm -rf dist
70
- rm -rf *.egg-info
71
- rm -rf htmlcov
72
- rm -rf .tox/
73
- rm -rf docs/_build
74
- rm -rf dist/