appydave-tools 0.3.2 → 0.3.4

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: b3a84090fe26e9b28b2947af82cf7647f6f6bcbf3e0b0f0bd8cbcfddb9513c1a
4
- data.tar.gz: 8cf4b4251ef2eff3fe897fa0ec545ffbf18f18f48700dea1978072ece796520a
3
+ metadata.gz: c5e47cee4b8a3f0c9d7d1714bceeb4a02780cfe441348466ecd822e4e454d0fe
4
+ data.tar.gz: 3f035ac5b9e34e819a79c17f3c19a9646ec246017493a63ba20a1096ae86c95f
5
5
  SHA512:
6
- metadata.gz: bf89c55719c8d05e1a49d695945675c3163d2715c76453ffb5c14ee00a70814df164fce00a2aded2d131f6e69fd09611d9ce7c1662bd419e483c6f00c6e4c75b
7
- data.tar.gz: 5382b10ff12234a3d0a1fafc901a035342c89f7d7ed233656a6a75f5185f52f1a4ab42cd00b6cfb955a2a1677123864e3a96b2e85d6645c56e090953df2741c4
6
+ metadata.gz: 59aa944562e5a3c28c47e053a49df7d9ea6236268736263dca2d29022ed4d3a70d1a3fe9668b080183dfce38fe520efac252aa2c0fe11f40aa7491a325f88570
7
+ data.tar.gz: 55aa8b91b2992fec8968f214baefc896ab816e56a77ff0f724b99d0f3ac10d8eb8446e220beecbac5398b3b23cf46bad14b8fe3dc785af25573cbbbf077e0f87
data/.rubocop.yml CHANGED
@@ -95,9 +95,6 @@ Layout/SpaceBeforeComma:
95
95
  # My Preferences - End
96
96
 
97
97
  # RSpec Cops
98
- RSpec/NestedGroups:
99
- Max: 5
100
-
101
98
  RSpec/FilePath:
102
99
  Exclude:
103
100
  - "**/spec/**/*"
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## [0.3.3](https://github.com/klueless-io/appydave-tools/compare/v0.3.2...v0.3.3) (2024-05-18)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * updating configuration with channels and channel_projects ([d4f54aa](https://github.com/klueless-io/appydave-tools/commit/d4f54aa0f455f535b6e265f23e6fba123d099d26))
7
+
8
+ ## [0.3.2](https://github.com/klueless-io/appydave-tools/compare/v0.3.1...v0.3.2) (2024-05-16)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * updating settings configuration and tests ([18bdf2b](https://github.com/klueless-io/appydave-tools/commit/18bdf2bb2605f51a5779dfe649c40e98c2bd77ef))
14
+ * updating settings configuration and tests ([487ce36](https://github.com/klueless-io/appydave-tools/commit/487ce366b857ce38ed91b35e4b6cc15a8ef56d35))
15
+
1
16
  ## [0.3.1](https://github.com/klueless-io/appydave-tools/compare/v0.3.0...v0.3.1) (2024-05-16)
2
17
 
3
18
 
@@ -1,3 +1,69 @@
1
1
  # Configuration Component
2
2
 
3
- [ChatGPT conversation](https://chatgpt.com/g/g-4dMsIRK3E-ruby-script-assistant/c/d8ea5960-071b-48aa-9fd9-554ca302c7dd)
3
+ [ChatGPT conversation](https://chatgpt.com/g/g-4dMsIRK3E-ruby-script-assistant/c/d8ea5960-071b-48aa-9fd9-554ca302c7dd)
4
+ [ChatGPT confersation for Schema](https://chatgpt.com/c/bb93e7ac-f139-44f9-8b9c-4e74ac2fa461)
5
+
6
+ ## Schema
7
+
8
+ ### Channels Schema
9
+
10
+ - **code**: Short identifier for the channel (e.g., `"ad"`, `"ac"`, `"fv"`).
11
+ - **name**: Full name of the channel (e.g., `"AppyDave"`, `"AppyDave Coding"`, `"FliVideo"`).
12
+ - **youtube_handle**: YouTube handle for the channel (e.g., `"@appydave"`, `"@appydavecoding"`, `"@flivideo"`).
13
+
14
+ #### Example
15
+
16
+ ```json
17
+ {
18
+ "channels": {
19
+ "appydave": {
20
+ "code": "ad",
21
+ "name": "AppyDave",
22
+ "youtube_handle": "@appydave"
23
+ },
24
+ "appydave_coding": {
25
+ "code": "ac",
26
+ "name": "AppyDave Coding",
27
+ "youtube_handle": "@appydavecoding"
28
+ },
29
+ "fli_video": {
30
+ "code": "fv",
31
+ "name": "FliVideo",
32
+ "youtube_handle": "@flivideo"
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ ### Channel Projects Schema
39
+
40
+ - **content_projects**: Path to the shared folder for content creation (e.g., `"/user/Library/CloudStorage/Dropbox/team-appydave"`).
41
+ - **video_projects**: Path to the local storage folder for active video projects (e.g., `"/user/tube-channels/appy-dave/active"`).
42
+ - **published_projects**: Path to the archive folder for published projects (e.g., `"/Volumes/Expansion/published/appydave"`).
43
+ - **abandoned_projects**: Path to the archive folder for incomplete or failed projects (e.g., `"/Volumes/Expansion/failed/appydave"`).
44
+
45
+ ## Example
46
+ ```json
47
+ {
48
+ "projects": {
49
+ "appydave": {
50
+ "content_projects": "/user/Library/CloudStorage/Dropbox/team-appydave",
51
+ "video_projects": "/user/tube-channels/appy-dave/active",
52
+ "published_projects": "/Volumes/Expansion/published/appydave",
53
+ "abandoned_projects": "/Volumes/Expansion/failed/appydave"
54
+ },
55
+ "appydave_coding": {
56
+ "content_projects": "/user/Library/CloudStorage/Dropbox/team-appydavecoding",
57
+ "video_projects": "/user/tube-channels/a-cast/cast-active",
58
+ "published_projects": "/Volumes/Expansion/published/appydave-coding",
59
+ "abandoned_projects": "/Volumes/Expansion/failed/appydave-coding"
60
+ },
61
+ "fli_video": {
62
+ "content_projects": "/user/Library/CloudStorage/Dropbox/team-flivideo",
63
+ "video_projects": "/user/tube-channels/fli-video/active",
64
+ "published_projects": "/Volumes/Expansion/published/fli-video",
65
+ "abandoned_projects": "/Volumes/Expansion/failed/fli-video"
66
+ }
67
+ }
68
+ }
69
+ ```
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module Configuration
6
+ # Channel projects configuration
7
+ class ChannelProjectsConfig < ConfigBase
8
+ # Retrieve channel information by channel name (string or symbol)
9
+ def get_channel_info(channel_name)
10
+ channel_name = channel_name.to_s
11
+ ChannelInfo.new(data['channel_projects'][channel_name] || default_channel_info)
12
+ end
13
+
14
+ # Set channel information
15
+ def set_channel_info(channel_name, channel_info)
16
+ data['channel_projects'] ||= {}
17
+ data['channel_projects'][channel_name.to_s] = channel_info.to_h
18
+ end
19
+
20
+ # Retrieve a list of all channel projects
21
+ def channel_projects
22
+ data['channel_projects'].map do |_name, info|
23
+ ChannelInfo.new(info)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def default_data
30
+ { 'channel_projects' => {} }
31
+ end
32
+
33
+ def default_channel_info
34
+ {
35
+ 'content_projects' => '',
36
+ 'video_projects' => '',
37
+ 'published_projects' => '',
38
+ 'abandoned_projects' => ''
39
+ }
40
+ end
41
+
42
+ # Type-safe class to access channel info properties
43
+ class ChannelInfo
44
+ attr_accessor :content_projects, :video_projects, :published_projects, :abandoned_projects
45
+
46
+ def initialize(data)
47
+ @content_projects = data['content_projects']
48
+ @video_projects = data['video_projects']
49
+ @published_projects = data['published_projects']
50
+ @abandoned_projects = data['abandoned_projects']
51
+ end
52
+
53
+ def to_h
54
+ {
55
+ 'content_projects' => @content_projects,
56
+ 'video_projects' => @video_projects,
57
+ 'published_projects' => @published_projects,
58
+ 'abandoned_projects' => @abandoned_projects
59
+ }
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module Configuration
6
+ # Channels configuration
7
+ class ChannelsConfig < ConfigBase
8
+ # Retrieve channel information by channel code (string or symbol)
9
+ def get_channel(channel_key)
10
+ channel_key = channel_key.to_s
11
+ info = data['channels'][channel_key] || default_channel_info
12
+ ChannelInfo.new(channel_key, info)
13
+ end
14
+
15
+ # Set channel information
16
+ def set_channel(channel_key, channel_info)
17
+ data['channels'] ||= {}
18
+ data['channels'][channel_key.to_s] = channel_info.to_h
19
+ end
20
+
21
+ # Retrieve a list of all channels
22
+ def channels
23
+ data['channels'].map do |key, info|
24
+ ChannelInfo.new(key, info)
25
+ end
26
+ end
27
+
28
+ def key?(key)
29
+ key = key.to_s
30
+ data['channels'].key?(key)
31
+ end
32
+
33
+ def code?(code)
34
+ code = code.to_s
35
+ data['channels'].values.any? { |info| info['code'] == code }
36
+ end
37
+
38
+ private
39
+
40
+ def default_data
41
+ { 'channels' => {} }
42
+ end
43
+
44
+ def default_channel_info
45
+ {
46
+ 'code' => '',
47
+ 'name' => '',
48
+ 'youtube_handle' => ''
49
+ }
50
+ end
51
+
52
+ # Type-safe class to access channel properties
53
+ class ChannelInfo
54
+ attr_accessor :key, :code, :name, :youtube_handle
55
+
56
+ def initialize(key, data)
57
+ @key = key
58
+ @code = data['code']
59
+ @name = data['name']
60
+ @youtube_handle = data['youtube_handle']
61
+ end
62
+
63
+ def to_h
64
+ {
65
+ 'code' => @code,
66
+ 'name' => @name,
67
+ 'youtube_handle' => @youtube_handle
68
+ }
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -6,6 +6,8 @@ module Appydave
6
6
  # Configuration class for handling multiple configurations
7
7
  class Config
8
8
  class << self
9
+ include KLog::Logging
10
+
9
11
  attr_accessor :config_path
10
12
  attr_reader :configurations
11
13
 
@@ -46,6 +48,11 @@ module Appydave
46
48
  Open3.capture3(open_vscode)
47
49
  end
48
50
 
51
+ def debug
52
+ log.kv 'Configuration Path', config_path
53
+ configurations.each_value(&:debug)
54
+ end
55
+
49
56
  private
50
57
 
51
58
  def ensure_config_directory
@@ -8,9 +8,11 @@ module Appydave
8
8
  module Configuration
9
9
  # Base class for handling common configuration tasks
10
10
  class ConfigBase
11
+ include KLog::Logging
12
+
11
13
  attr_reader :config_path, :data
12
14
 
13
- def initialize(config_name = 'unknown')
15
+ def initialize
14
16
  @config_path = File.join(Config.config_path, "#{config_name}.json")
15
17
  @data = load
16
18
  end
@@ -22,8 +24,30 @@ module Appydave
22
24
  def load
23
25
  return JSON.parse(File.read(config_path)) if File.exist?(config_path)
24
26
 
25
- {}
27
+ default_data
26
28
  rescue JSON::ParserError
29
+ # log.exception e
30
+ default_data
31
+ end
32
+
33
+ def name
34
+ self.class.name.split('::')[-1].gsub(/Config$/, '')
35
+ end
36
+
37
+ def config_name
38
+ name.gsub(/([a-z])([A-Z])/, '\1-\2').downcase
39
+ end
40
+
41
+ def debug
42
+ log.kv 'Config', name
43
+ log.kv 'Path', config_path
44
+
45
+ log.json data
46
+ end
47
+
48
+ private
49
+
50
+ def default_data
27
51
  {}
28
52
  end
29
53
  end
@@ -5,10 +5,6 @@ module Appydave
5
5
  module Configuration
6
6
  # Global settings that can be referenced by other configurations or tools
7
7
  class SettingsConfig < ConfigBase
8
- def initialize
9
- super('settings')
10
- end
11
-
12
8
  def set(key, value)
13
9
  data[key] = value
14
10
  end
@@ -0,0 +1,21 @@
1
+ # Naming Manager
2
+
3
+ [ChatGPT conversation](https://chatgpt.com/g/g-4dMsIRK3E-ruby-script-assistant/c/cab5e2f7-a607-402f-80b7-9ca262bab8ee)
4
+
5
+ ## Channel Names
6
+
7
+ | Key | Code | Name | YouTube Handle |
8
+ |-----------------|------|-----------------|--------------------|
9
+ | appydave | ad | AppyDave | @appydave |
10
+ | appydave_coding | ac | AppyDave Coding | @appydavecoding |
11
+ | fli_video | fv | FliVideo | @flivideo |
12
+ | winning_prompts | wp | Winning Prompts | @winningprompts |
13
+ | trend10 | t1 | Trend10 | @trend10 |
14
+ | aitldr | tl | AI TLDR | @aitldr |
15
+
16
+
17
+ ## Project Naming Component
18
+
19
+ The Project Naming Component is a tool designed to generate standardized names for projects within the YouTube content creation process.
20
+ It ensures consistency and clarity by combining a unique sequence identifier, an optional channel code, and a descriptive project name into a well-defined format.
21
+ This component is essential for maintaining organized and easily recognizable project names across all channels and project types.
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ # Project, channel, and file name management
6
+ module NameManager
7
+ # Parses and generates project names for Appydave video projects
8
+ class ProjectName
9
+ attr_reader :sequence, :channel_code, :project_name
10
+
11
+ def initialize(file_name)
12
+ parse_file_name(file_name)
13
+ end
14
+
15
+ def generate_name
16
+ if channel_code
17
+ "#{sequence}-#{channel_code}-#{project_name}"
18
+ else
19
+ "#{sequence}-#{project_name}"
20
+ end.downcase
21
+ end
22
+
23
+ def to_s
24
+ generate_name
25
+ end
26
+
27
+ private
28
+
29
+ def parse_file_name(file_name)
30
+ file_name = File.basename(file_name, File.extname(file_name))
31
+ parts = file_name.split('-')
32
+
33
+ @sequence = parts[0]
34
+ @project_name = parts[-1]
35
+ @channel_code = parts.length == 3 ? parts[1] : nil
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Appydave
4
4
  module Tools
5
- VERSION = '0.3.2'
5
+ VERSION = '0.3.4'
6
6
  end
7
7
  end
@@ -5,6 +5,7 @@ require 'fileutils'
5
5
  require 'json'
6
6
  require 'open3'
7
7
  require 'optparse'
8
+ require 'k_log'
8
9
 
9
10
  require 'appydave/tools/version'
10
11
  require 'appydave/tools/gpt_context/file_collector'
@@ -12,6 +13,9 @@ require 'appydave/tools/gpt_context/file_collector'
12
13
  require 'appydave/tools/configuration/config_base'
13
14
  require 'appydave/tools/configuration/config'
14
15
  require 'appydave/tools/configuration/settings_config'
16
+ require 'appydave/tools/configuration/channel_projects_config'
17
+ require 'appydave/tools/configuration/channels_config'
18
+ require 'appydave/tools/name_manager/project_name'
15
19
 
16
20
  module Appydave
17
21
  module Tools
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appydave-tools",
9
- "version": "0.3.2",
9
+ "version": "0.3.4",
10
10
  "devDependencies": {
11
11
  "@klueless-js/semantic-release-rubygem": "github:klueless-js/semantic-release-rubygem",
12
12
  "@semantic-release/changelog": "^6.0.3",
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "AppyDave YouTube Automation Tools",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appydave-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-16 00:00:00.000000000 Z
11
+ date: 2024-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clipboard
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: k_log
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: " AppyDave YouTube Automation Tools\n"
28
42
  email:
29
43
  - david@ideasmen.com.au
@@ -49,11 +63,15 @@ files:
49
63
  - bin/setup
50
64
  - lib/appydave/tools.rb
51
65
  - lib/appydave/tools/configuration/_doc.md
66
+ - lib/appydave/tools/configuration/channel_projects_config.rb
67
+ - lib/appydave/tools/configuration/channels_config.rb
52
68
  - lib/appydave/tools/configuration/config.rb
53
69
  - lib/appydave/tools/configuration/config_base.rb
54
70
  - lib/appydave/tools/configuration/settings_config copy.xrb
55
71
  - lib/appydave/tools/configuration/settings_config.rb
56
72
  - lib/appydave/tools/gpt_context/file_collector.rb
73
+ - lib/appydave/tools/name_manager/_doc.md
74
+ - lib/appydave/tools/name_manager/project_name.rb
57
75
  - lib/appydave/tools/version.rb
58
76
  - package-lock.json
59
77
  - package.json