dsw-tdk 4.16.0__tar.gz → 4.17.0__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 (38) hide show
  1. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/CHANGELOG.md +11 -0
  2. {dsw_tdk-4.16.0/dsw_tdk.egg-info → dsw_tdk-4.17.0}/PKG-INFO +3 -2
  3. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/build_info.py +4 -4
  4. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/consts.py +5 -4
  5. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/core.py +15 -3
  6. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/model.py +4 -1
  7. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/validation.py +9 -5
  8. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0/dsw_tdk.egg-info}/PKG-INFO +3 -2
  9. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/pyproject.toml +1 -1
  10. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/tests/test_cmd_verify.py +2 -2
  11. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/LICENSE +0 -0
  12. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/MANIFEST.in +0 -0
  13. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/README.md +0 -0
  14. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/__init__.py +0 -0
  15. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/__main__.py +0 -0
  16. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/api_client.py +0 -0
  17. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/cli.py +0 -0
  18. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/templates/LICENSE.j2 +0 -0
  19. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/templates/README.md.j2 +0 -0
  20. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/templates/env.j2 +0 -0
  21. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/templates/starter.j2 +0 -0
  22. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw/tdk/utils.py +0 -0
  23. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw_tdk.egg-info/SOURCES.txt +0 -0
  24. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw_tdk.egg-info/dependency_links.txt +0 -0
  25. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw_tdk.egg-info/entry_points.txt +0 -0
  26. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw_tdk.egg-info/not-zip-safe +0 -0
  27. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw_tdk.egg-info/requires.txt +0 -0
  28. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/dsw_tdk.egg-info/top_level.txt +0 -0
  29. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/setup.cfg +0 -0
  30. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/setup.py +0 -0
  31. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/tests/test_basic.py +0 -0
  32. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/tests/test_cmd_dot-env.py +0 -0
  33. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/tests/test_cmd_get.py +0 -0
  34. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/tests/test_cmd_list.py +0 -0
  35. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/tests/test_cmd_new.py +0 -0
  36. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/tests/test_cmd_package.py +0 -0
  37. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/tests/test_cmd_put.py +0 -0
  38. {dsw_tdk-4.16.0 → dsw_tdk-4.17.0}/tests/test_cmd_unpackage.py +0 -0
@@ -8,6 +8,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
  ## [Unreleased]
9
9
 
10
10
 
11
+ ## [4.17.0]
12
+
13
+ ### Added
14
+
15
+ - Add check for no matching files (warning and use of defaults)
16
+
17
+ ### Changed
18
+
19
+ - Unified IDs (organization, document template, knowledge model)
20
+
11
21
  ## [4.16.0]
12
22
 
13
23
  Released for version consistency with other DSW tools.
@@ -529,3 +539,4 @@ Initial DSW Template Development Kit (versioned as part of the [DSW platform](ht
529
539
  [4.14.0]: /../../tree/v4.14.0
530
540
  [4.15.0]: /../../tree/v4.15.0
531
541
  [4.16.0]: /../../tree/v4.16.0
542
+ [4.17.0]: /../../tree/v4.17.0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: dsw-tdk
3
- Version: 4.16.0
3
+ Version: 4.17.0
4
4
  Summary: Data Stewardship Wizard Template Development Toolkit
5
5
  Author-email: Marek Suchánek <marek.suchanek@ds-wizard.org>
6
6
  License: Apache License 2.0
@@ -32,6 +32,7 @@ Requires-Dist: python-slugify
32
32
  Requires-Dist: watchfiles
33
33
  Provides-Extra: test
34
34
  Requires-Dist: pytest; extra == "test"
35
+ Dynamic: license-file
35
36
 
36
37
  # dsw-tdk
37
38
 
@@ -9,9 +9,9 @@ BuildInfo = namedtuple(
9
9
  )
10
10
 
11
11
  BUILD_INFO = BuildInfo(
12
- version='v4.16.0~ed2a8b4',
13
- built_at='2025-03-06 15:23:41Z',
14
- sha='ed2a8b48c8a350de3dc428124cecbd38fa9b865c',
12
+ version='v4.17.0~ac8947f',
13
+ built_at='2025-04-01 06:47:55Z',
14
+ sha='ac8947fd0b7824e803d28f8d15215263a810aee8',
15
15
  branch='HEAD',
16
- tag='v4.16.0',
16
+ tag='v4.17.0',
17
17
  )
@@ -4,13 +4,14 @@ import re
4
4
  import pathspec
5
5
 
6
6
  APP = 'dsw-tdk'
7
- VERSION = '4.16.0'
7
+ VERSION = '4.17.0'
8
8
  METAMODEL_VERSION = 16
9
9
 
10
10
  REGEX_SEMVER = re.compile(r'^[0-9]+\.[0-9]+\.[0-9]+$')
11
- REGEX_ORGANIZATION_ID = re.compile(r'^(?![.])(?!.*[.]$)[a-zA-Z0-9.]+$')
12
- REGEX_TEMPLATE_ID = re.compile(r'^(?![-])(?!.*[-]$)[a-zA-Z0-9-]+$')
13
- REGEX_KM_ID = REGEX_TEMPLATE_ID
11
+ REGEX_WIZARD_ID = re.compile(r'^[a-zA-Z0-9-_.]+$')
12
+ REGEX_ORGANIZATION_ID = REGEX_WIZARD_ID
13
+ REGEX_TEMPLATE_ID = REGEX_WIZARD_ID
14
+ REGEX_KM_ID = REGEX_WIZARD_ID
14
15
  REGEX_MIME_TYPE = re.compile(r'^(?![-])(?!.*[-]$)[-\w.]+/[-\w.]+$')
15
16
 
16
17
  DEFAULT_LIST_FORMAT = '{template.id:<50} {template.name:<30}'
@@ -165,6 +165,10 @@ class TDKCore:
165
165
  if self.project is None:
166
166
  raise RuntimeError('No template project is initialized')
167
167
  self.project.template = self.safe_template
168
+ if len(self.project.template.tdk_config.files) == 0:
169
+ self.project.template.tdk_config.use_default_files()
170
+ self.logger.warning('Using default _tdk.files in template.json, you may want '
171
+ 'to change it to include relevant files')
168
172
  self.logger.debug('Initiating storing local template project (force=%s)', force)
169
173
  self.project.store(force=force)
170
174
 
@@ -301,6 +305,9 @@ class TDKCore:
301
305
  tfile.remote_type.value, tfile.filename.as_posix(), e)
302
306
 
303
307
  async def store_remote_files(self):
308
+ if len(self.safe_project.safe_template.files) == 0:
309
+ self.logger.warning('No files to store, maybe you forgot to '
310
+ 'update _tdk.files patterns in template.json?')
304
311
  for tfile in self.safe_project.safe_template.files.values():
305
312
  tfile.remote_id = None
306
313
  tfile.remote_type = TemplateFileType.FILE if tfile.is_text else TemplateFileType.ASSET
@@ -333,6 +340,9 @@ class TDKCore:
333
340
  pkg.writestr(f'template/assets/{tfile.filename.as_posix()}', tfile.content)
334
341
  descriptor['files'] = files
335
342
  descriptor['assets'] = assets
343
+ if len(files) == 0 and len(assets) == 0:
344
+ self.logger.warning('No files or assets found in the template, maybe you forgot '
345
+ 'to update _tdk.files patterns in template.json?')
336
346
  timestamp = datetime.datetime.now(tz=datetime.UTC).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
337
347
  descriptor['createdAt'] = timestamp
338
348
  descriptor['updatedAt'] = timestamp
@@ -355,7 +365,9 @@ class TDKCore:
355
365
  raise RuntimeError('Malformed package: missing template.json file')
356
366
  data = json.loads(template_file.read_text(encoding=DEFAULT_ENCODING))
357
367
  template = Template.load_local(data)
358
- template.tdk_config.files = ['*', '!.git/', '!.env']
368
+ template.tdk_config.use_default_files()
369
+ self.logger.warning('Using default _tdk.files in template.json, you may want '
370
+ 'to change it to include relevant files')
359
371
  self.logger.debug('Preparing template dir')
360
372
  if template_dir is None:
361
373
  template_dir = pathlib.Path.cwd() / template.id.replace(':', '_')
@@ -372,8 +384,8 @@ class TDKCore:
372
384
  encoding=DEFAULT_ENCODING,
373
385
  )
374
386
  self.logger.debug('Extracting README.md from package')
375
- local_template_json = template_dir / 'README.md'
376
- local_template_json.write_text(
387
+ local_readme = template_dir / 'README.md'
388
+ local_readme.write_text(
377
389
  data=data['readme'].replace('\r\n', '\n'),
378
390
  encoding=DEFAULT_ENCODING,
379
391
  )
@@ -101,7 +101,7 @@ class Format:
101
101
  class TDKConfig:
102
102
 
103
103
  DEFAULT_README = 'README.md'
104
- DEFAULT_FILES = ['*']
104
+ DEFAULT_FILES = ['*', '!.git/', '!.env']
105
105
 
106
106
  def __init__(self, *, version: str | None = None, readme_file: str | None = None,
107
107
  files: list[str] | None = None):
@@ -118,6 +118,9 @@ class TDKConfig:
118
118
  files=data.get('files', cls.DEFAULT_FILES),
119
119
  )
120
120
 
121
+ def use_default_files(self):
122
+ self.files = self.DEFAULT_FILES
123
+
121
124
  def serialize(self):
122
125
  return {
123
126
  'version': self.version,
@@ -44,7 +44,8 @@ def _validate_extension(field_name: str, value) -> List[ValidationError]:
44
44
  if value is not None and re.match(REGEX_ORGANIZATION_ID, value) is None:
45
45
  return [ValidationError(
46
46
  field_name=field_name,
47
- message='File extension should contain only letters, numbers and dots (inside-only)',
47
+ message='File extension should contain only letters, numbers, '
48
+ 'and periods (inside-only)',
48
49
  )]
49
50
  return []
50
51
 
@@ -53,7 +54,8 @@ def _validate_organization_id(field_name: str, value) -> List[ValidationError]:
53
54
  if value is not None and re.match(REGEX_ORGANIZATION_ID, value) is None:
54
55
  return [ValidationError(
55
56
  field_name=field_name,
56
- message='Organization ID may contain only letters, numbers, and period (inside-only)',
57
+ message='Organization ID may contain only letters, numbers, '
58
+ 'periods, dashes, and underscores',
57
59
  )]
58
60
  return []
59
61
 
@@ -62,7 +64,8 @@ def _validate_template_id(field_name: str, value) -> List[ValidationError]:
62
64
  if value is not None and re.match(REGEX_TEMPLATE_ID, value) is None:
63
65
  return [ValidationError(
64
66
  field_name=field_name,
65
- message='Template ID may contain only letters, numbers, and dash (inside-only)',
67
+ message='Template ID may contain only letters, numbers, '
68
+ 'periods, dashes, and underscores',
66
69
  )]
67
70
  return []
68
71
 
@@ -71,7 +74,8 @@ def _validate_km_id(field_name: str, value) -> List[ValidationError]:
71
74
  if value is not None and re.match(REGEX_KM_ID, value) is None:
72
75
  return [ValidationError(
73
76
  field_name=field_name,
74
- message='KM ID may contain only letters, numbers, and dash (inside-only)',
77
+ message='KM ID may contain only letters, numbers, '
78
+ 'periods, dashes, and underscores',
75
79
  )]
76
80
  return []
77
81
 
@@ -107,7 +111,7 @@ def _validate_package_id(field_name: str, value: str) -> List[ValidationError]:
107
111
  if len(parts) != 3:
108
112
  res.append(ValidationError(
109
113
  field_name=field_name,
110
- message='Package ID is not valid (only {len(parts)} parts)',
114
+ message=f'Package ID is not valid (only {len(parts)} parts)',
111
115
  ))
112
116
  if re.match(REGEX_ORGANIZATION_ID, parts[0]) is None:
113
117
  res.append(ValidationError(
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: dsw-tdk
3
- Version: 4.16.0
3
+ Version: 4.17.0
4
4
  Summary: Data Stewardship Wizard Template Development Toolkit
5
5
  Author-email: Marek Suchánek <marek.suchanek@ds-wizard.org>
6
6
  License: Apache License 2.0
@@ -32,6 +32,7 @@ Requires-Dist: python-slugify
32
32
  Requires-Dist: watchfiles
33
33
  Provides-Extra: test
34
34
  Requires-Dist: pytest; extra == "test"
35
+ Dynamic: license-file
35
36
 
36
37
  # dsw-tdk
37
38
 
@@ -4,7 +4,7 @@ build-backend = 'setuptools.build_meta'
4
4
 
5
5
  [project]
6
6
  name = 'dsw-tdk'
7
- version = "4.16.0"
7
+ version = "4.17.0"
8
8
  description = 'Data Stewardship Wizard Template Development Toolkit'
9
9
  readme = 'README.md'
10
10
  keywords = ['documents', 'dsw', 'jinja2', 'template', 'toolkit']
@@ -38,8 +38,8 @@ def test_verify_invalid(fixtures_path: pathlib.Path):
38
38
  result = runner.invoke(main, args=['verify', template_path.as_posix()])
39
39
  assert result.exit_code == 0
40
40
  assert 'The template is invalid!' in result.output
41
- assert 'template_id: Template ID may contain only letters, numbers, and dash' in result.output
42
- assert 'organization_id: Organization ID may contain only letters, numbers, and period' in result.output
41
+ assert 'template_id: Template ID may contain only letters, numbers,' in result.output
42
+ assert 'organization_id: Organization ID may contain only letters, numbers,' in result.output
43
43
  assert 'version: Version must be in semver format' in result.output
44
44
  assert 'name: Missing but it is required' in result.output
45
45
  assert 'description: Missing but it is required' in result.output
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes