appydave-tools 0.77.6 → 0.77.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1ca0547c8abec9adcf7081ade94ffe5753c477e21288020bd0b43dd7609747bb
4
- data.tar.gz: aa03c3205607e0394eaea6b75113a417b0edcf5fcafdba797de9f1372d34e4e9
3
+ metadata.gz: cdcce7ddc1828ec8a28fcda70c442f1786443a9e3d04cbdf0a5f03b223f1ce8f
4
+ data.tar.gz: e419a736811babee9b523fa39cec97e219a903e388b140d4c3140757c15587c0
5
5
  SHA512:
6
- metadata.gz: 4ca27e6b5d96647c8c8eeed68c1d3ec502ac436052e8b5b12975b5beca581297d405895dc4c1585d2ca38db29f5f6f27b16d86ed76c38959668d3497ae4f7f7c
7
- data.tar.gz: 837b4aab157a1e14845e7d572513d94ae8e4aef37784bc84f88a05894c329ce5c088aa5ade430f0dfb2a54984fe0efa9b1e84af5a8f170392bf980edcfd14c39
6
+ metadata.gz: 14de60fca8cc46a8fbe74bb1033ce5d451e1770f22693f7ba641c3f82e95b1dbacec821ad72bd8034c702b268e8673bd7d66ba02c57af25c5c9f9eef61d61d8c
7
+ data.tar.gz: b8973bb5408519c418c01632b09d40060d18195e7dbd14d8f1e17759ff55f0e367492a65728bf09e372e18d48010997becd26d6b140b7125ae9db39422d1a3da
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [0.77.6](https://github.com/appydave/appydave-tools/compare/v0.77.5...v0.77.6) (2026-03-20)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * extract S3Archiver from S3Operations; S3Operations is now a thin delegation facade (B020 complete) ([41419e5](https://github.com/appydave/appydave-tools/commit/41419e5e365f62a8e7a16f3ce16e74c41a80d4a4))
7
+
1
8
  ## [0.77.5](https://github.com/appydave/appydave-tools/compare/v0.77.4...v0.77.5) (2026-03-20)
2
9
 
3
10
 
@@ -1,7 +1,7 @@
1
1
  # Project Backlog — AppyDave Tools
2
2
 
3
- **Last updated**: 2026-03-20 (batch-a-features campaign complete)
4
- **Total**: 41 | Pending: 4 | Done: 36 | Deferred: 0 | Rejected: 0
3
+ **Last updated**: 2026-03-20 (s3-operations-split campaign complete)
4
+ **Total**: 41 | Pending: 3 | Done: 37 | Deferred: 0 | Rejected: 0
5
5
 
6
6
  ---
7
7
 
@@ -10,9 +10,8 @@
10
10
  ### Medium Priority
11
11
  - [ ] B001 — FR-1: GPT Context token counting | Priority: medium
12
12
  - [ ] B012 — Arch: add integration tests for brand resolution end-to-end | Priority: medium
13
- - [ ] B007 — Performance: parallel git/S3 status checks for dam list | Priority: low (unblocked after B020)
13
+ - [ ] B007 — Performance: parallel git/S3 status checks for dam list | Priority: low (unblocked B020 complete)
14
14
  - [ ] B008 — Performance: cache git/S3 status with 5-min TTL | Priority: low
15
- - [ ] B020 — Arch: split S3Operations (1,030 lines, mixed I/O + logic) | Priority: medium (next major campaign)
16
15
  - [ ] B040 — Fix: ProjectResolver.resolve raises RuntimeError not typed exception (found in B012) | Priority: low
17
16
 
18
17
  ---
@@ -55,6 +54,7 @@
55
54
  - [x] B001 — FR-1: GPT Context token counting (--tokens flag, warn to stderr, 100k/200k thresholds) | Completed: batch-a-features (2026-03-20), v0.77.0
56
55
  - [x] B010 — UX: terminal-width-aware separator lines + truncate_path in project_listing | Completed: batch-a-features (2026-03-20), v0.77.0
57
56
  - [x] B009 — UX: progress indicators for dam S3 operations (upload, download, status, archive, sync-ssd) | Completed: batch-a-features (2026-03-20), v0.77.1
57
+ - [x] B020 — Arch: split S3Operations into S3Base + S3Uploader + S3Downloader + S3StatusChecker + S3Archiver; S3Operations thin facade | Completed: s3-operations-split (2026-03-20), v0.77.6
58
58
 
59
59
  ---
60
60
 
@@ -5,18 +5,18 @@
5
5
  **Target**: 870 examples passing, rubocop 0, S3Operations ≤ 80 lines, each focused class standalone
6
6
 
7
7
  ## Summary
8
- - Total: 5 | Complete: 0 | In Progress: 0 | Pending: 5 | Failed: 0
8
+ - Total: 5 | Complete: 5 | In Progress: 0 | Pending: 0 | Failed: 0
9
9
 
10
10
  ## Pending
11
- - [ ] WU1-s3-base — Extract shared infrastructure into S3Base class; S3Operations inherits from it; all 870 tests pass with no public API change
12
- - [ ] WU2-s3-uploader — Create S3Uploader < S3Base; move upload + helpers; S3Operations.upload delegates
13
- - [ ] WU3-s3-downloader — Create S3Downloader < S3Base; move download + helpers; S3Operations.download delegates
14
- - [ ] WU4-s3-status-checker — Create S3StatusChecker < S3Base; move status/calculate_sync_status/sync_timestamps + helpers; S3Operations delegates
15
- - [ ] WU5-s3-archiver — Create S3Archiver < S3Base; move archive/cleanup/cleanup_local + helpers; S3Operations becomes thin facade; add s3_base require to lib/appydave/tools.rb
16
11
 
17
12
  ## In Progress
18
13
 
19
14
  ## Complete
15
+ - [x] WU1-s3-base — Extract shared infrastructure into S3Base class; S3Operations inherits from it; all 870 tests pass with no public API change (v0.77.2)
16
+ - [x] WU2-s3-uploader — Create S3Uploader < S3Base; move upload + helpers; S3Operations.upload delegates (v0.77.3)
17
+ - [x] WU3-s3-downloader — Create S3Downloader < S3Base; move download + helpers; S3Operations.download delegates (v0.77.4)
18
+ - [x] WU4-s3-status-checker — Create S3StatusChecker < S3Base; move status/calculate_sync_status/sync_timestamps; S3Operations delegates (v0.77.5)
19
+ - [x] WU5-s3-archiver — Create S3Archiver < S3Base; move archive/cleanup/cleanup_local + helpers; S3Operations is thin facade (v0.77.6)
20
20
 
21
21
  ## Failed / Needs Retry
22
22
 
@@ -167,9 +167,12 @@ module Appydave
167
167
  brand_info = Appydave::Tools::Configuration::Config.brands.get_brand(brand_arg)
168
168
  is_git_repo = Dir.exist?(File.join(brand_path, '.git'))
169
169
 
170
+ # Run all projects in parallel threads — each project's git + S3 checks are I/O-bound
170
171
  project_data = projects.map do |project|
171
- collect_project_data(brand_arg, brand_path, brand_info, project, is_git_repo, detailed: detailed, s3: s3)
172
- end
172
+ Thread.new do
173
+ collect_project_data(brand_arg, brand_path, brand_info, project, is_git_repo, detailed: detailed, s3: s3)
174
+ end
175
+ end.map(&:value)
173
176
 
174
177
  # Print common header
175
178
  puts "Projects in #{brand}:"
@@ -547,15 +550,12 @@ module Appydave
547
550
  size = FileHelper.calculate_directory_size(project_path)
548
551
  modified = File.mtime(project_path)
549
552
 
550
- # Check if project has uncommitted changes (if brand is git repo)
551
- git_status = if is_git_repo
552
- calculate_project_git_status(brand_path, project)
553
- else
554
- 'N/A'
555
- end
553
+ # Run git and S3 checks concurrently both are I/O-bound (shell + network)
554
+ git_thread = is_git_repo ? Thread.new { calculate_project_git_status(brand_path, project) } : nil
555
+ s3_thread = s3 ? Thread.new { calculate_project_s3_sync_status(brand_arg, brand_info, project) } : nil
556
556
 
557
- # Calculate 3-state S3 sync status - only if requested (performance optimization)
558
- s3_sync = s3 ? calculate_project_s3_sync_status(brand_arg, brand_info, project) : 'N/A'
557
+ git_status = git_thread ? git_thread.value : 'N/A'
558
+ s3_sync = s3_thread ? s3_thread.value : 'N/A'
559
559
 
560
560
  result = {
561
561
  name: project,
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Appydave
4
4
  module Tools
5
- VERSION = '0.77.6'
5
+ VERSION = '0.77.7'
6
6
  end
7
7
  end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.77.6",
3
+ "version": "0.77.7",
4
4
  "description": "AppyDave YouTube Automation Tools",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appydave-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.77.6
4
+ version: 0.77.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys