cleepcli 1.43.8__tar.gz → 1.43.10__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 (30) hide show
  1. {cleepcli-1.43.8/cleepcli.egg-info → cleepcli-1.43.10}/PKG-INFO +1 -1
  2. {cleepcli-1.43.8 → cleepcli-1.43.10}/bin/ccli +16 -2
  3. {cleepcli-1.43.8 → cleepcli-1.43.10}/bin/cleep-cli +16 -2
  4. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/package.py +96 -24
  5. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/test.py +4 -1
  6. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/version.py +1 -1
  7. {cleepcli-1.43.8 → cleepcli-1.43.10/cleepcli.egg-info}/PKG-INFO +1 -1
  8. {cleepcli-1.43.8 → cleepcli-1.43.10}/LICENSE +0 -0
  9. {cleepcli-1.43.8 → cleepcli-1.43.10}/MANIFEST.in +0 -0
  10. {cleepcli-1.43.8 → cleepcli-1.43.10}/README.md +0 -0
  11. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/__init__.py +0 -0
  12. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/check.py +0 -0
  13. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/ci.py +0 -0
  14. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/cleepapi.py +0 -0
  15. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/config.py +0 -0
  16. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/console.py +0 -0
  17. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/docs.py +0 -0
  18. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/file.py +0 -0
  19. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/git.py +0 -0
  20. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/module.py +0 -0
  21. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/tools.py +0 -0
  22. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli/watch.py +0 -0
  23. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli.egg-info/SOURCES.txt +0 -0
  24. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli.egg-info/dependency_links.txt +0 -0
  25. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli.egg-info/requires.txt +0 -0
  26. {cleepcli-1.43.8 → cleepcli-1.43.10}/cleepcli.egg-info/top_level.txt +0 -0
  27. {cleepcli-1.43.8 → cleepcli-1.43.10}/pyproject.toml +0 -0
  28. {cleepcli-1.43.8 → cleepcli-1.43.10}/requirements.txt +0 -0
  29. {cleepcli-1.43.8 → cleepcli-1.43.10}/setup.cfg +0 -0
  30. {cleepcli-1.43.8 → cleepcli-1.43.10}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cleepcli
3
- Version: 1.43.8
3
+ Version: 1.43.10
4
4
  Summary: Cleep-cli helps developers to build great Cleep applications from command line.
5
5
  Home-page: https://github.com/CleepDevice/cleep-cli
6
6
  Author: Tanguy Bonneau
@@ -463,12 +463,26 @@ def corebuild():
463
463
  @click.option('--version', required=True, help='Version to publish.')
464
464
  @click.option('--prerelease', is_flag=True, default=False, help='Pre-release flag')
465
465
  @click.option('--tag', required=True, help='Release git tag.')
466
- def corepublish(version, prerelease, tag):
466
+ @click.option(
467
+ '--force',
468
+ is_flag=True,
469
+ default=False,
470
+ help='If release already exists, replace .deb/.sha256 assets (keep git tag).',
471
+ )
472
+ @click.option(
473
+ '--skip-existing',
474
+ is_flag=True,
475
+ default=False,
476
+ help='If release already exists, exit 0 without uploading.',
477
+ )
478
+ def corepublish(version, prerelease, tag, force, skip_existing):
467
479
  """
468
480
  Publish built Cleep debian package
469
481
  """
470
482
  p = Package()
471
- res = p.publish_cleep(version, prerelease, tag)
483
+ res = p.publish_cleep(
484
+ version, prerelease, tag, force=force, skip_existing=skip_existing
485
+ )
472
486
 
473
487
  if not res:
474
488
  sys.exit(1)
@@ -463,12 +463,26 @@ def corebuild():
463
463
  @click.option('--version', required=True, help='Version to publish.')
464
464
  @click.option('--prerelease', is_flag=True, default=False, help='Pre-release flag')
465
465
  @click.option('--tag', required=True, help='Release git tag.')
466
- def corepublish(version, prerelease, tag):
466
+ @click.option(
467
+ '--force',
468
+ is_flag=True,
469
+ default=False,
470
+ help='If release already exists, replace .deb/.sha256 assets (keep git tag).',
471
+ )
472
+ @click.option(
473
+ '--skip-existing',
474
+ is_flag=True,
475
+ default=False,
476
+ help='If release already exists, exit 0 without uploading.',
477
+ )
478
+ def corepublish(version, prerelease, tag, force, skip_existing):
467
479
  """
468
480
  Publish built Cleep debian package
469
481
  """
470
482
  p = Package()
471
- res = p.publish_cleep(version, prerelease, tag)
483
+ res = p.publish_cleep(
484
+ version, prerelease, tag, force=force, skip_existing=skip_existing
485
+ )
472
486
 
473
487
  if not res:
474
488
  sys.exit(1)
@@ -250,7 +250,9 @@ sha256sum $DEB > $SHA256
250
250
  self.logger.exception('Error deleting tag "%s"' % tag_name)
251
251
  return False
252
252
 
253
- def publish_cleep(self, version, prerelease, tag):
253
+ def publish_cleep(
254
+ self, version, prerelease, tag, force=False, skip_existing=False
255
+ ):
254
256
  """
255
257
  Publish cleep version on github
256
258
 
@@ -258,9 +260,17 @@ sha256sum $DEB > $SHA256
258
260
  version (str): cleep version
259
261
  prerelease (bool): True to publish pre-release version
260
262
  tag (str): associated git tag
263
+ force (bool): If release already exists, replace .deb/.sha256 assets
264
+ without deleting the git tag (safe for CI replay)
265
+ skip_existing (bool): If release already exists, exit successfully
266
+ without uploading (mutually exclusive intent with force —
267
+ force wins if both are set)
261
268
  """
262
269
  label = "pre-release" if prerelease else "release"
263
- token = os.environ["GITHUB_TOKEN"]
270
+ token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GITHUB_ACCESS_TOKEN")
271
+ if not token:
272
+ self.logger.error("GITHUB_TOKEN is not set")
273
+ return False
264
274
  github = Github(token)
265
275
  repo = github.get_repo("%s/%s" % (config.GITHUB_ORG, config.GITHUB_REPO))
266
276
 
@@ -274,12 +284,18 @@ sha256sum $DEB > $SHA256
274
284
  changes = os.path.abspath(
275
285
  os.path.join(config.REPO_DIR, "..", "cleep_%s_armhf.changes" % version)
276
286
  )
287
+ missing = False
277
288
  if not os.path.exists(archive):
278
289
  self.logger.error('Archive file "%s" does not exist' % archive)
290
+ missing = True
279
291
  if not os.path.exists(sha256):
280
292
  self.logger.error('Checksum file "%s" does not exist' % sha256)
293
+ missing = True
281
294
  if not os.path.exists(changes):
282
295
  self.logger.error('Changes file "%s" does not exist' % changes)
296
+ missing = True
297
+ if missing:
298
+ return False
283
299
 
284
300
  # get changelog
285
301
  cmd = (
@@ -294,7 +310,7 @@ sha256sum $DEB > $SHA256
294
310
  changelog = "\n".join([line.strip() for line in result["stdout"]])
295
311
  self.logger.debug("Changelog:\n%s" % changelog)
296
312
 
297
- # search existing release
313
+ # search existing release (by title = version name)
298
314
  release_found = None
299
315
  releases = repo.get_releases()
300
316
  for release in releases:
@@ -304,27 +320,50 @@ sha256sum $DEB > $SHA256
304
320
  release_found = release
305
321
  break
306
322
 
307
- if release_found and (release_found.prerelease or release_found.draft):
308
- # due to github limitation (bug or limitation?), draft assets are not downloadable
309
- # so we create prerelease version instead of draft and delete it before creating it
310
- # again when pushing new version
311
- self.logger.info(
312
- 'Deleting existing %s "%s"...', label, release_found.tag_name
313
- )
314
- try:
315
- release_found.delete_release()
316
- except:
317
- self.logger.exception("Error deleting existing %s:", label)
318
- return False
323
+ if release_found:
324
+ if skip_existing and not force:
325
+ self.logger.info(
326
+ 'Release "%s" already exists — skip (--skip-existing)',
327
+ version,
328
+ )
329
+ return True
330
+
331
+ if force:
332
+ return self.__replace_release_assets(
333
+ release_found,
334
+ version,
335
+ changelog,
336
+ prerelease,
337
+ archive,
338
+ sha256,
339
+ )
319
340
 
320
- # delete tag
321
- if not self.__delete_github_tag(release_found.tag_name, token):
341
+ if release_found.prerelease or release_found.draft:
342
+ # Legacy RC path: delete release + tag, then recreate.
343
+ # Prefer --force to replace assets without touching the tag.
344
+ self.logger.info(
345
+ 'Deleting existing %s "%s"...', label, release_found.tag_name
346
+ )
347
+ try:
348
+ release_found.delete_release()
349
+ except Exception:
350
+ self.logger.exception("Error deleting existing %s:", label)
351
+ return False
352
+
353
+ if not self.__delete_github_tag(release_found.tag_name, token):
354
+ return False
355
+ release_found = None
356
+ else:
357
+ self.logger.error(
358
+ 'Release "%s" already exists — use --force to replace '
359
+ "assets or --skip-existing to no-op",
360
+ version,
361
+ )
322
362
  return False
323
363
 
324
364
  # create release
325
365
  self.logger.info('Creating new %s "%s"...', label, version)
326
366
  try:
327
- commits = repo.get_commits()
328
367
  release_found = repo.create_git_release(
329
368
  tag=tag,
330
369
  name=version,
@@ -332,20 +371,53 @@ sha256sum $DEB > $SHA256
332
371
  draft=False,
333
372
  prerelease=prerelease,
334
373
  )
335
- except:
374
+ except Exception:
336
375
  self.logger.exception("Error occured creating new %s:", label)
337
376
  return False
338
377
 
339
- # upload assets
378
+ return self.__upload_release_assets(release_found, archive, sha256)
379
+
380
+ def __replace_release_assets(
381
+ self, release, version, changelog, prerelease, archive, sha256
382
+ ):
383
+ """Update existing release metadata and replace .deb / .sha256 assets."""
384
+ self.logger.info(
385
+ 'Replacing assets on existing release "%s" (tag=%s)...',
386
+ version,
387
+ release.tag_name,
388
+ )
389
+ try:
390
+ release.update_release(
391
+ name=version,
392
+ message=changelog,
393
+ draft=False,
394
+ prerelease=prerelease,
395
+ )
396
+ except Exception:
397
+ self.logger.exception("Error updating release metadata:")
398
+ return False
399
+
400
+ wanted = {os.path.basename(archive), os.path.basename(sha256)}
401
+ try:
402
+ for asset in release.get_assets():
403
+ if asset.name in wanted:
404
+ self.logger.info('Deleting existing asset "%s"...', asset.name)
405
+ asset.delete_asset()
406
+ except Exception:
407
+ self.logger.exception("Error deleting existing assets:")
408
+ return False
409
+
410
+ return self.__upload_release_assets(release, archive, sha256)
411
+
412
+ def __upload_release_assets(self, release, archive, sha256):
340
413
  try:
341
414
  self.logger.info('Uploading asset "%s"...' % archive)
342
- release_found.upload_asset(archive)
415
+ release.upload_asset(archive)
343
416
  self.logger.info('Uploading asset "%s"...' % sha256)
344
- release_found.upload_asset(sha256)
345
- except:
417
+ release.upload_asset(sha256)
418
+ except Exception:
346
419
  self.logger.exception("Error uploading assets:")
347
420
  return False
348
-
349
421
  return True
350
422
 
351
423
  # TODO code for draft release removed for problem downloading draft assets
@@ -224,6 +224,9 @@ cd "%(path)s"
224
224
 
225
225
  # copy coverage file to standart location (in module tests directory) for coverage report tools
226
226
  if copy_to:
227
+ if not os.path.isfile(coverage_file_path):
228
+ self.logger.error('Coverage file missing: %s' % coverage_file_path)
229
+ return False
227
230
  shutil.copyfile(coverage_file_path, os.path.join(copy_to, '.coverage'))
228
231
 
229
232
  self.logger.debug('Return code: %s' % self.__endless_command_return_code)
@@ -238,7 +241,7 @@ cd "%(path)s"
238
241
  """
239
242
  return """
240
243
  cd "%s"
241
- COVERAGE_FILE=%s coverage run --omit="*/lib/python*/*","test_*" --source="../backend" --concurrency=gevent -m unittest discover
244
+ COVERAGE_FILE=%s coverage run --omit="*/lib/python*/*","test_*" --source="../backend" --concurrency=thread -m unittest discover
242
245
  """ % (module_tests_path, coverage_file_path)
243
246
 
244
247
  def __get_tests_cmd_with_pattern(self, module_tests_path, pattern):
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
- VERSION = "1.43.8"
4
+ VERSION = "1.43.10"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cleepcli
3
- Version: 1.43.8
3
+ Version: 1.43.10
4
4
  Summary: Cleep-cli helps developers to build great Cleep applications from command line.
5
5
  Home-page: https://github.com/CleepDevice/cleep-cli
6
6
  Author: Tanguy Bonneau
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
File without changes
File without changes