okdata-cli 4.2.0__py3-none-any.whl → 4.3.0__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.
@@ -6,7 +6,10 @@ from okdata.sdk.data.upload import Upload
6
6
  from requests.exceptions import HTTPError
7
7
 
8
8
  from okdata.cli.command import BaseCommand, BASE_COMMAND_OPTIONS
9
- from okdata.cli.commands.datasets.wizards import DatasetCreateWizard
9
+ from okdata.cli.commands.datasets.wizards import (
10
+ DatasetCreateWizard,
11
+ PipelineCreateWizard,
12
+ )
10
13
  from okdata.cli.io import read_json, resolve_output_filepath
11
14
  from okdata.cli.output import create_output
12
15
 
@@ -22,6 +25,7 @@ Usage:
22
25
  okdata datasets create-version <datasetid> [options]
23
26
  okdata datasets create-edition <datasetid> [<versionid>] [options]
24
27
  okdata datasets create-distribution <datasetid> [<versionid> <editionid>] [options]
28
+ okdata datasets create-pipeline <datasetid> [options]
25
29
 
26
30
  Examples:
27
31
  okdata datasets ls
@@ -32,6 +36,7 @@ Examples:
32
36
  okdata datasets ls my-dataset/1/20240101T102030 --format=json
33
37
  okdata datasets create --file=dataset.json
34
38
  okdata datasets cp /tmp/file.csv ds:my-dataset-id
39
+ okdata datasets create-pipeline my-dataset
35
40
 
36
41
  Options:{BASE_COMMAND_OPTIONS}
37
42
  --file=<file> # Use this file for configuration or upload
@@ -60,6 +65,8 @@ Options:{BASE_COMMAND_OPTIONS}
60
65
  self.create_edition()
61
66
  elif self.cmd("create-distribution"):
62
67
  self.create_distribution()
68
+ elif self.cmd("create-pipeline"):
69
+ PipelineCreateWizard(self, self.arg("datasetid")).start()
63
70
  else:
64
71
  self.help()
65
72
 
@@ -261,9 +268,9 @@ Options:{BASE_COMMAND_OPTIONS}
261
268
  )
262
269
 
263
270
  def _dataset_components_from_uri(
264
- self, dataset_uri, create_edition=False, auto_resolve=True
271
+ self, uri, create_edition=False, auto_resolve=True
265
272
  ):
266
- """Return an ID/version/edition tuple given a dataset URI.
273
+ """Return a dataset ID/version/edition tuple given a URI.
267
274
 
268
275
  Four different URI formats are supported:
269
276
 
@@ -289,8 +296,15 @@ Options:{BASE_COMMAND_OPTIONS}
289
296
 
290
297
  Otherwise `None` is returned for missing parts.
291
298
  """
292
- parts = dataset_uri.split("/")
293
- dataset_id, version, edition = parts + [None] * (3 - len(parts))
299
+ parts = uri.split("/")
300
+
301
+ try:
302
+ dataset_id, version, edition = parts + [None] * (3 - len(parts))
303
+ except ValueError:
304
+ sys.exit(
305
+ "URI must be on the format 'dataset_id', "
306
+ "'dataset_id/version', or 'dataset_id/version/edition'."
307
+ )
294
308
 
295
309
  # First verify that the dataset exists; `get_dataset` raises an error
296
310
  # if not.
@@ -26,7 +26,7 @@ available_pipelines = [
26
26
  ]
27
27
 
28
28
 
29
- def qs_create():
29
+ def qs_create_dataset():
30
30
  return [
31
31
  {
32
32
  **required_style,
@@ -35,7 +35,7 @@ def qs_create():
35
35
  "message": "Datakilde",
36
36
  "choices": [
37
37
  Choice("Fil", "file"),
38
- Choice("Database (krever eget databaseoppsett)", "database"),
38
+ Choice("Punktmålinger", "event"),
39
39
  Choice("Ingen (datasettet skal ikke inneholde data direkte)", "none"),
40
40
  ],
41
41
  },
@@ -114,3 +114,15 @@ def qs_create():
114
114
  "when": lambda x: x["sourceType"] in pipeline_choices,
115
115
  },
116
116
  ]
117
+
118
+
119
+ def qs_create_pipeline():
120
+ return [
121
+ {
122
+ **required_style,
123
+ "type": "select",
124
+ "name": "pipeline",
125
+ "message": "Prosessering",
126
+ "choices": pipeline_choices["file"],
127
+ },
128
+ ]
@@ -1,11 +1,45 @@
1
+ import sys
2
+
1
3
  from okdata.sdk.data.dataset import Dataset
2
4
  from okdata.sdk.pipelines.client import PipelineApiClient
5
+ from requests import HTTPError
3
6
 
4
7
  from okdata.cli.command import confirm_to_continue
5
- from okdata.cli.commands.datasets.questions import qs_create
8
+ from okdata.cli.commands.datasets.questions import qs_create_dataset, qs_create_pipeline
6
9
  from okdata.cli.commands.wizard import run_questionnaire
7
10
 
8
11
 
12
+ def _pipeline_config(pipeline_processor_id, dataset_id, version):
13
+ return {
14
+ "pipelineProcessorId": pipeline_processor_id,
15
+ "id": dataset_id,
16
+ "datasetUri": f"output/{dataset_id}/{version}",
17
+ }
18
+
19
+
20
+ def _pipeline_input_config(pipeline_id, dataset_id, version):
21
+ return {
22
+ "pipelineInstanceId": pipeline_id,
23
+ "datasetUri": f"input/{dataset_id}/{version}",
24
+ "stage": "raw",
25
+ }
26
+
27
+
28
+ def _create_pipeline(command, env, dataset_id, pipeline):
29
+ command.print("Creating pipeline...")
30
+ pipeline_client = PipelineApiClient(env=env)
31
+ pipeline_config = _pipeline_config(pipeline, dataset_id, "1")
32
+ pipeline_id = pipeline_client.create_pipeline_instance(pipeline_config)
33
+ pipeline_id = pipeline_id.strip('"') # What's up with these?
34
+ command.print(f"Created pipeline with ID: {pipeline_id}")
35
+
36
+ command.print("Creating pipeline input...")
37
+ pipeline_input_config = _pipeline_input_config(pipeline_id, dataset_id, "1")
38
+ pipeline_input_id = pipeline_client.create_pipeline_input(pipeline_input_config)
39
+ pipeline_input_id = pipeline_input_id.strip('"') # What's up with these?
40
+ command.print(f"Created pipeline input with ID: {pipeline_input_id}")
41
+
42
+
9
43
  class DatasetCreateWizard:
10
44
  """Wizard for the `datasets create` command.
11
45
 
@@ -39,23 +73,9 @@ class DatasetCreateWizard:
39
73
 
40
74
  return config
41
75
 
42
- def pipeline_config(self, pipeline_processor_id, dataset_id, version):
43
- return {
44
- "pipelineProcessorId": pipeline_processor_id,
45
- "id": dataset_id,
46
- "datasetUri": f"output/{dataset_id}/{version}",
47
- }
48
-
49
- def pipeline_input_config(self, pipeline_id, dataset_id, version):
50
- return {
51
- "pipelineInstanceId": pipeline_id,
52
- "datasetUri": f"input/{dataset_id}/{version}",
53
- "stage": "raw",
54
- }
55
-
56
76
  def start(self):
57
77
  env = self.command.opt("env")
58
- choices = run_questionnaire(*qs_create())
78
+ choices = run_questionnaire(*qs_create_dataset())
59
79
 
60
80
  confirm_to_continue(
61
81
  "Will create a new dataset '{}'.{}".format(
@@ -76,22 +96,7 @@ class DatasetCreateWizard:
76
96
  self.command.print(f"Created dataset with ID: {dataset_id}")
77
97
 
78
98
  if choices.get("pipeline"):
79
- self.command.print("Creating pipeline...")
80
- pipeline_client = PipelineApiClient(env=env)
81
- pipeline_config = self.pipeline_config(choices["pipeline"], dataset_id, "1")
82
- pipeline_id = pipeline_client.create_pipeline_instance(pipeline_config)
83
- pipeline_id = pipeline_id.strip('"') # What's up with these?
84
- self.command.print(f"Created pipeline with ID: {pipeline_id}")
85
-
86
- self.command.print("Creating pipeline input...")
87
- pipeline_input_config = self.pipeline_input_config(
88
- pipeline_id, dataset_id, "1"
89
- )
90
- pipeline_input_id = pipeline_client.create_pipeline_input(
91
- pipeline_input_config
92
- )
93
- pipeline_input_id = pipeline_input_id.strip('"') # What's up with these?
94
- self.command.print(f"Created pipeline input with ID: {pipeline_input_id}")
99
+ _create_pipeline(self.command, env, dataset_id, choices["pipeline"])
95
100
 
96
101
  if choices["sourceType"] == "file":
97
102
  self.command.print(
@@ -102,3 +107,25 @@ class DatasetCreateWizard:
102
107
  )
103
108
  else:
104
109
  self.command.print("Done!")
110
+
111
+
112
+ class PipelineCreateWizard:
113
+ """Wizard for the `datasets create-pipeline` command."""
114
+
115
+ def __init__(self, command, dataset_id):
116
+ self.command = command
117
+ self.dataset_id = dataset_id
118
+
119
+ def start(self):
120
+ choices = run_questionnaire(*qs_create_pipeline())
121
+ try:
122
+ _create_pipeline(
123
+ self.command,
124
+ self.command.opt("env"),
125
+ self.dataset_id,
126
+ choices["pipeline"],
127
+ )
128
+ except HTTPError as e:
129
+ if e.response.status_code == 409:
130
+ sys.exit("This dataset already has a pipeline set up.")
131
+ raise
@@ -216,6 +216,7 @@ def q_delete_from_aws():
216
216
  "name": "delete_from_aws",
217
217
  "message": "Delete key from AWS Parameter Store?",
218
218
  "auto_enter": False,
219
+ "default": False,
219
220
  }
220
221
 
221
222
 
@@ -0,0 +1 @@
1
+ import sys, types, os;p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('okdata',));importlib = __import__('importlib.util');__import__('importlib.machinery');m = sys.modules.setdefault('okdata', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('okdata', [os.path.dirname(p)])));m = m or sys.modules.setdefault('okdata', types.ModuleType('okdata'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: okdata-cli
3
- Version: 4.2.0
3
+ Version: 4.3.0
4
4
  Summary: CLI for services provided by Oslo Origo
5
5
  Home-page: https://github.com/oslokommune/okdata-cli/
6
6
  Author: Oslo Origo
@@ -19,9 +19,19 @@ Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  Requires-Dist: PrettyTable
21
21
  Requires-Dist: docopt
22
- Requires-Dist: okdata-sdk <4,>=3.1.1
23
- Requires-Dist: questionary <2.0.0,>=1.10.0
22
+ Requires-Dist: okdata-sdk<4,>=3.1.1
23
+ Requires-Dist: questionary<2.0.0,>=1.10.0
24
24
  Requires-Dist: requests
25
+ Dynamic: author
26
+ Dynamic: author-email
27
+ Dynamic: classifier
28
+ Dynamic: description
29
+ Dynamic: description-content-type
30
+ Dynamic: home-page
31
+ Dynamic: license
32
+ Dynamic: requires-dist
33
+ Dynamic: requires-python
34
+ Dynamic: summary
25
35
 
26
36
  # `okdata-cli`: Oslo Origo data services CLI
27
37
 
@@ -1,4 +1,4 @@
1
- okdata_cli-4.2.0-nspkg.pth,sha256=4nrP4RXuGOCDLZ0px0sO63KvnhR4W_t4MWel1CEdd2U,539
1
+ okdata_cli-4.3.0-py3.12-nspkg.pth,sha256=LUsqeDUhjJQmFBD_9BYoicNcghGruF4e2xXxq0Ftwmc,467
2
2
  okdata/cli/__init__.py,sha256=72PLqW3-JGeKxQGusk3AX78ITwcn7DDawEMNLlsurz4,27
3
3
  okdata/cli/__main__.py,sha256=_jPIZ0MVIgtf6x-RzbodSihOa-oHvKBfwM8JO8-oQYo,2771
4
4
  okdata/cli/command.py,sha256=3Mo0e4OfPM7hI1QZ8HRpJVb5K3DRLPGYfOouzOhO1tc,4427
@@ -10,13 +10,13 @@ okdata/cli/commands/status.py,sha256=NkAuNEUWVumDsU-axFSOrX7AAJ-XV0fevsBbxpbl5CU
10
10
  okdata/cli/commands/validators.py,sha256=lkLo4UPmwXkKzEIFs0jucPVBV4jOPTZjzefpAvP1vdU,3882
11
11
  okdata/cli/commands/wizard.py,sha256=FFNK6h50atWh0Tl7lOx1lSU0jC6QNRz0SqDuv5OcRew,541
12
12
  okdata/cli/commands/datasets/__init__.py,sha256=kS1uB6u_0VI1jm_TQjaCvTMqPFHnKSQITPUuPB_SY00,69
13
- okdata/cli/commands/datasets/datasets.py,sha256=vt5MnhkLOAv-TFCcz4MkapBsDYwimXPV6TkoF5KFb3A,14045
14
- okdata/cli/commands/datasets/questions.py,sha256=izwCe2mimMl-K43YGlh-w5_Nqh-0WLDhUqpm8dCyaik,4006
15
- okdata/cli/commands/datasets/wizards.py,sha256=jfOLXgqf6FvG5EMDPXeDpKmnatVFClpFJe2ZSuR3L0M,3755
13
+ okdata/cli/commands/datasets/datasets.py,sha256=qZ-JnPduIVta0HkRwaesUWFkrK4fC0hmj_Ipw7VXNxk,14489
14
+ okdata/cli/commands/datasets/questions.py,sha256=UW4_oOscUVRyVvKsNJwqbKnGfMGMu-O80aKQVp8vVRs,4235
15
+ okdata/cli/commands/datasets/wizards.py,sha256=yAh_PyWX1gkz9RshWj8sFs6RWbXatN7228fh7TBfytI,4383
16
16
  okdata/cli/commands/pubs/__init__.py,sha256=T105M_46YzyZ2Cici48QKNyjfJTIQJ1uyMFlo91rIZ4,81
17
17
  okdata/cli/commands/pubs/client.py,sha256=dOabTkeZKPvHFbgwZC4SX4DyvnvEezpeSiLQ1EY1hlo,3223
18
18
  okdata/cli/commands/pubs/pubs.py,sha256=zDYy7pJkeYI5h-vvO5bICCvUaw3RdFrqTHCZ6T_pf9U,11981
19
- okdata/cli/commands/pubs/questions.py,sha256=0UwZ87Zcx5eAWLO3FI4aoLGvY3lQuLqEcYa6kUT8OLo,7020
19
+ okdata/cli/commands/pubs/questions.py,sha256=B0Iusq-8725DgaTVLa9MDhsO0AzgezlfNYLdySolAZE,7046
20
20
  okdata/cli/commands/pubs/wizards.py,sha256=fNhj-7G7ePEYVLrhmdXdNzRSdD-9BzVAcJxujuz7LwQ,3613
21
21
  okdata/cli/commands/teams/questions.py,sha256=UqfHK2bwl6retyYYC-IywG_39aRDC-WbKYpMIQ83gfE,2997
22
22
  okdata/cli/commands/teams/teams.py,sha256=g33g8AS5UQnYdgDXdr4v5BVEtNQ5_XeQ9bc3ojhqNPc,5617
@@ -40,10 +40,10 @@ okdata/cli/data/output-format/status_config.json,sha256=oq9uYZbPZrM2ksWrQDd9-VWO
40
40
  okdata/cli/data/output-format/status_history_config.json,sha256=Gh-l8w9688P0hdp_DtJ9cxMc1bdv5DuNp5QBftOnb9M,721
41
41
  okdata/cli/data/output-format/team_members_config.json,sha256=CYzlVLU3f41kpxBbovXYDYRYOvhScfYU2yxtwHFMcuQ,183
42
42
  okdata/cli/data/output-format/teams_config.json,sha256=z49y_7m3b9W02guXXcSdlX9XDAaIj0rRBDcqU68m9i0,124
43
- okdata_cli-4.2.0.dist-info/LICENSE,sha256=K5ut_rTozMMIoz2xdUWdkFZ5f51oYtMNd13-rJ38pTs,1082
44
- okdata_cli-4.2.0.dist-info/METADATA,sha256=9OmNNoDu8aC7AI94WifIIa10zGafJu0E1V4uRnaR_VY,1194
45
- okdata_cli-4.2.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
46
- okdata_cli-4.2.0.dist-info/entry_points.txt,sha256=OyY5saQTVah33LZ9ixM40rsMPgsOKErioZA8rtVjgKo,52
47
- okdata_cli-4.2.0.dist-info/namespace_packages.txt,sha256=Pdf-ZpWHLtLL295sDedsbAP3f6H189730mXrfVAVCcY,7
48
- okdata_cli-4.2.0.dist-info/top_level.txt,sha256=cS1IEDv6oxHgvQHrGSxFxjHTv5CNc9dLowH1vpCqF_k,11
49
- okdata_cli-4.2.0.dist-info/RECORD,,
43
+ okdata_cli-4.3.0.dist-info/LICENSE,sha256=K5ut_rTozMMIoz2xdUWdkFZ5f51oYtMNd13-rJ38pTs,1082
44
+ okdata_cli-4.3.0.dist-info/METADATA,sha256=ZGyG7FRkpLrJwJX_gul0bpgiDPENpUTFpfHdHpxq1jg,1406
45
+ okdata_cli-4.3.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
46
+ okdata_cli-4.3.0.dist-info/entry_points.txt,sha256=OyY5saQTVah33LZ9ixM40rsMPgsOKErioZA8rtVjgKo,52
47
+ okdata_cli-4.3.0.dist-info/namespace_packages.txt,sha256=Pdf-ZpWHLtLL295sDedsbAP3f6H189730mXrfVAVCcY,7
48
+ okdata_cli-4.3.0.dist-info/top_level.txt,sha256=cS1IEDv6oxHgvQHrGSxFxjHTv5CNc9dLowH1vpCqF_k,11
49
+ okdata_cli-4.3.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1 +0,0 @@
1
- import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('okdata',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('okdata', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('okdata', [os.path.dirname(p)])));m = m or sys.modules.setdefault('okdata', types.ModuleType('okdata'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)