appydave-tools 0.3.8 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: abcb7832a0081b43eae1e469b3afad533e09ff21db73512682090de44be185a9
4
- data.tar.gz: a093d21f86dd3ca4d84b4e4c924176b37d92efd63cb579936f435368263cfabd
3
+ metadata.gz: adaf87989c7386fc11d7e2b29a9578b7920a913232e606169b67406f0ddb819a
4
+ data.tar.gz: af6c9502a2b8a66bbe26a0f483109f417c168eeb8c26d8805549e439dff0d437
5
5
  SHA512:
6
- metadata.gz: bb0a732b2d46d87d84e3537cbc80a91288652341a35e49cb9b491542c00bab0583d15fb72b40e6fbbf468455f768f4ba61957c0931819016e47aad3fb6da47de
7
- data.tar.gz: facc58c71da799e70b0dc6e55de2578a411a736093f2dd0f7e2360f9ce81672c9faa224c093bda8442e4d8491a80d00b98ba1a98649c05d543c5a08f15732a21
6
+ metadata.gz: 6334c9279ca5e2f6fd5cf1de4973470dd4dfb2e74e5346e0b0f86a9b1a7fb5594940236e22785123887e6df03a2f009feb677ebb975be3f59606522f23ea1ac0
7
+ data.tar.gz: 5856609b0464a50f23e1ab700a8995ff86cde4f00dc4c75b9fd81f13d0dfd5dc89cac09c04d72f4026e888bd884009156bb110e1e5bf0e41510ee81dd0b5d54f
data/.rubocop.yml CHANGED
@@ -19,6 +19,7 @@ Metrics/BlockLength:
19
19
  Exclude:
20
20
  - "**/spec/**/*"
21
21
  - "*.gemspec"
22
+ - "bin/gpt_context.rb"
22
23
  AllowedMethods:
23
24
  - configure
24
25
  - context
@@ -107,4 +108,10 @@ RSpec/MultipleExpectations:
107
108
  Max: 5
108
109
 
109
110
  RSpec/NestedGroups:
110
- Max: 8
111
+ Max: 8
112
+
113
+ RSpec/DescribeClass:
114
+ Enabled: false
115
+
116
+ RSpec/PendingWithoutReason:
117
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ # [0.4.0](https://github.com/klueless-io/appydave-tools/compare/v0.3.8...v0.4.0) (2024-05-26)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * remove from ci for now ([e4c9e22](https://github.com/klueless-io/appydave-tools/commit/e4c9e225e6fe35a00a7b4d83ff9f2795da737589))
7
+ * remove from ci for now ([30a114c](https://github.com/klueless-io/appydave-tools/commit/30a114c7cd0085ab92aeb906e1962ca3618631e8))
8
+ * remove from ci for now ([7062c3d](https://github.com/klueless-io/appydave-tools/commit/7062c3d69634ab281107b755533f3332b708eb56))
9
+
10
+
11
+ ### Features
12
+
13
+ * Add line limit option and update default format handling ([a0eb426](https://github.com/klueless-io/appydave-tools/commit/a0eb426329ee2a997081cf1a5c219c05d07ff824))
14
+
15
+ ## [0.3.8](https://github.com/klueless-io/appydave-tools/compare/v0.3.7...v0.3.8) (2024-05-25)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * update settings ([0b0c256](https://github.com/klueless-io/appydave-tools/commit/0b0c256793b607db87001752071b0476c6390c5f))
21
+
1
22
  ## [0.3.7](https://github.com/klueless-io/appydave-tools/compare/v0.3.6...v0.3.7) (2024-05-19)
2
23
 
3
24
 
data/bin/gpt_context.rb CHANGED
@@ -14,7 +14,8 @@ require 'appydave/tools'
14
14
  options = {
15
15
  include_patterns: [],
16
16
  exclude_patterns: [],
17
- format: nil,
17
+ format: 'tree,content',
18
+ line_limit: nil,
18
19
  debug: 'none'
19
20
  }
20
21
 
@@ -29,10 +30,14 @@ OptionParser.new do |opts|
29
30
  options[:exclude_patterns] << pattern
30
31
  end
31
32
 
32
- opts.on('-f', '--format FORMAT', 'Output format: default or tree') do |format|
33
+ opts.on('-f', '--format FORMAT', 'Output format: content or tree, if not provided then both are used') do |format|
33
34
  options[:format] = format
34
35
  end
35
36
 
37
+ opts.on('-l', '--line-limit LIMIT', 'Limit the number of lines included from each file') do |limit|
38
+ options[:line_limit] = limit.to_i
39
+ end
40
+
36
41
  # None - No debug output
37
42
  # Output - Output the content to the console, this is the same as found in the clipboard
38
43
  # Params - Output the options that were passed to the script
@@ -68,6 +73,7 @@ gatherer = Appydave::Tools::GptContext::FileCollector.new(
68
73
  include_patterns: options[:include_patterns],
69
74
  exclude_patterns: options[:exclude_patterns],
70
75
  format: options[:format],
76
+ line_limit: options[:line_limit],
71
77
  working_directory: Dir.pwd
72
78
  )
73
79
 
@@ -1,7 +1,11 @@
1
1
  # Configuration Component
2
2
 
3
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)
4
+ [ChatGPT conversation for Schema](https://chatgpt.com/c/bb93e7ac-f139-44f9-8b9c-4e74ac2fa461)
5
+
6
+ attr_accessor :code,
7
+ :narration
8
+
5
9
 
6
10
  ## Schema
7
11
 
@@ -29,6 +29,7 @@ module Appydave
29
29
  end
30
30
 
31
31
  def method_missing(method_name, *_args)
32
+ raise Appydave::Tools::Error, 'Configuration has never been registered' if @configurations.nil?
32
33
  raise Appydave::Tools::Error, "Configuration not available: #{method_name}" unless @configurations.key?(method_name)
33
34
 
34
35
  @configurations[method_name]
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module Configuration
6
+ module Models
7
+ # Channel projects configuration
8
+ class ChannelProjectsConfig < ConfigBase
9
+ # Retrieve channel information by channel name (string or symbol)
10
+ def get_channel_info(channel_name)
11
+ channel_name = channel_name.to_s
12
+ ChannelInfo.new(data['channel_projects'][channel_name] || default_channel_info)
13
+ end
14
+
15
+ # Set channel information
16
+ def set_channel_info(channel_name, channel_info)
17
+ data['channel_projects'] ||= {}
18
+ data['channel_projects'][channel_name.to_s] = channel_info.to_h
19
+ end
20
+
21
+ # Retrieve a list of all channel projects
22
+ def channel_projects
23
+ data['channel_projects'].map do |_name, info|
24
+ ChannelInfo.new(info)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def default_data
31
+ { 'channel_projects' => {} }
32
+ end
33
+
34
+ def default_channel_info
35
+ {
36
+ 'content_projects' => '',
37
+ 'video_projects' => '',
38
+ 'published_projects' => '',
39
+ 'abandoned_projects' => ''
40
+ }
41
+ end
42
+
43
+ # Type-safe class to access channel info properties
44
+ class ChannelInfo
45
+ attr_accessor :content_projects, :video_projects, :published_projects, :abandoned_projects
46
+
47
+ def initialize(data)
48
+ @content_projects = data['content_projects']
49
+ @video_projects = data['video_projects']
50
+ @published_projects = data['published_projects']
51
+ @abandoned_projects = data['abandoned_projects']
52
+ end
53
+
54
+ def to_h
55
+ {
56
+ 'content_projects' => @content_projects,
57
+ 'video_projects' => @video_projects,
58
+ 'published_projects' => @published_projects,
59
+ 'abandoned_projects' => @abandoned_projects
60
+ }
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module Configuration
6
+ module Models
7
+ # Channels configuration
8
+ class ChannelsConfig < ConfigBase
9
+ # Retrieve channel information by channel code (string or symbol)
10
+ def get_channel(channel_key)
11
+ channel_key = channel_key.to_s
12
+ info = data['channels'][channel_key] || default_channel_info
13
+ ChannelInfo.new(channel_key, info)
14
+ end
15
+
16
+ # Set channel information
17
+ def set_channel(channel_key, channel_info)
18
+ data['channels'] ||= {}
19
+ data['channels'][channel_key.to_s] = channel_info.to_h
20
+ end
21
+
22
+ # Retrieve a list of all channels
23
+ def channels
24
+ data['channels'].map do |key, info|
25
+ ChannelInfo.new(key, info)
26
+ end
27
+ end
28
+
29
+ def key?(key)
30
+ key = key.to_s
31
+ data['channels'].key?(key)
32
+ end
33
+
34
+ def code?(code)
35
+ code = code.to_s
36
+ data['channels'].values.any? { |info| info['code'] == code }
37
+ end
38
+
39
+ private
40
+
41
+ def default_data
42
+ { 'channels' => {} }
43
+ end
44
+
45
+ def default_channel_info
46
+ {
47
+ 'code' => '',
48
+ 'name' => '',
49
+ 'youtube_handle' => ''
50
+ }
51
+ end
52
+
53
+ # Type-safe class to access channel properties
54
+ class ChannelInfo
55
+ attr_accessor :key, :code, :name, :youtube_handle
56
+
57
+ def initialize(key, data)
58
+ @key = key
59
+ @code = data['code']
60
+ @name = data['name']
61
+ @youtube_handle = data['youtube_handle']
62
+ end
63
+
64
+ def to_h
65
+ {
66
+ 'code' => @code,
67
+ 'name' => @name,
68
+ 'youtube_handle' => @youtube_handle
69
+ }
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'fileutils'
5
+
6
+ module Appydave
7
+ module Tools
8
+ module Configuration
9
+ module Models
10
+ # Base class for handling common configuration tasks
11
+ class ConfigBase
12
+ include KLog::Logging
13
+
14
+ attr_reader :config_path, :data
15
+
16
+ def initialize
17
+ @config_path = File.join(Config.config_path, "#{config_name}.json")
18
+ @data = load
19
+ end
20
+
21
+ def save
22
+ File.write(config_path, JSON.pretty_generate(data))
23
+ end
24
+
25
+ def load
26
+ return JSON.parse(File.read(config_path)) if File.exist?(config_path)
27
+
28
+ default_data
29
+ rescue JSON::ParserError
30
+ # log.exception e
31
+ default_data
32
+ end
33
+
34
+ def name
35
+ self.class.name.split('::')[-1].gsub(/Config$/, '')
36
+ end
37
+
38
+ def config_name
39
+ name.gsub(/([a-z])([A-Z])/, '\1-\2').downcase
40
+ end
41
+
42
+ def debug
43
+ log.kv 'Config', name
44
+ log.kv 'Path', config_path
45
+
46
+ log.json data
47
+ end
48
+
49
+ private
50
+
51
+ def default_data
52
+ {}
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module Configuration
6
+ module Models
7
+ # Global settings that can be referenced by other configurations or tools
8
+ class SettingsConfig < ConfigBase
9
+ def set(key, value)
10
+ data[key] = value
11
+ end
12
+
13
+ def get(key, default = nil)
14
+ data.fetch(key, default)
15
+ end
16
+
17
+ # Well known settings
18
+
19
+ def ecamm_recording_folder
20
+ get('ecamm-recording-folder')
21
+ end
22
+
23
+ def download_folder
24
+ get('download-folder')
25
+ end
26
+
27
+ def download_image_folder
28
+ get('download-image-folder') || download_folder
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dotenv'
4
+ # Dotenv.load(".env.#{ENV['APP_ENV']}") # Loads environment-specific dotenv file.
5
+ Dotenv.load('.env')
6
+
7
+ OpenAI.configure do |config|
8
+ tools_enabled = ENV.fetch('TOOLS_ENABLED', 'false')
9
+
10
+ if tools_enabled == 'true'
11
+ puts 'OpenAI Tools are enabled'
12
+ config.access_token = ENV.fetch('OPENAI_ACCESS_TOKEN')
13
+ config.organization_id = ENV.fetch('OPENAI_ORGANIZATION_ID', nil)
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ # GPT Context Gather
2
+
3
+ [ChatGPT conversation](https://chatgpt.com/c/efba7b3c-21e7-415c-97eb-92994c3e49fc)
4
+
@@ -6,26 +6,30 @@ module Appydave
6
6
  module GptContext
7
7
  # Gathers file names and content based on include and exclude patterns
8
8
  class FileCollector
9
- attr_reader :include_patterns, :exclude_patterns, :format, :working_directory
9
+ attr_reader :include_patterns, :exclude_patterns, :format, :working_directory, :line_limit
10
10
 
11
- def initialize(include_patterns: [], exclude_patterns: [], format: nil, working_directory: nil)
11
+ def initialize(include_patterns: [], exclude_patterns: [], format: 'tree,content', working_directory: nil, line_limit: nil)
12
12
  @include_patterns = include_patterns
13
13
  @exclude_patterns = exclude_patterns
14
14
  @format = format
15
15
  @working_directory = working_directory
16
+ @line_limit = line_limit
16
17
  end
17
18
 
18
19
  def build
19
20
  FileUtils.cd(working_directory) if working_directory && Dir.exist?(working_directory)
20
21
 
21
- result = case format
22
- when 'tree'
23
- build_tree
24
- when 'both'
25
- "#{build_tree}\n\n#{build_content}"
26
- else
27
- build_content
28
- end
22
+ formats = format.split(',')
23
+ result = formats.map do |fmt|
24
+ case fmt
25
+ when 'tree'
26
+ build_tree
27
+ when 'content'
28
+ build_content
29
+ else
30
+ ''
31
+ end
32
+ end.join("\n\n")
29
33
 
30
34
  FileUtils.cd(Dir.home) if working_directory
31
35
 
@@ -41,7 +45,7 @@ module Appydave
41
45
  Dir.glob(pattern).each do |file_path|
42
46
  next if excluded?(file_path) || File.directory?(file_path)
43
47
 
44
- content = "# file: #{file_path}\n\n#{File.read(file_path)}"
48
+ content = "# file: #{file_path}\n\n#{read_file_content(file_path)}"
45
49
  concatenated_content << content
46
50
  end
47
51
  end
@@ -49,6 +53,13 @@ module Appydave
49
53
  concatenated_content.join("\n\n")
50
54
  end
51
55
 
56
+ def read_file_content(file_path)
57
+ lines = File.readlines(file_path)
58
+ return lines.first(line_limit).join if line_limit
59
+
60
+ lines.join
61
+ end
62
+
52
63
  def build_tree
53
64
  tree_view = {}
54
65
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Appydave
4
4
  module Tools
5
- VERSION = '0.3.8'
5
+ VERSION = '0.4.1'
6
6
  end
7
7
  end
@@ -4,23 +4,25 @@ require 'clipboard'
4
4
  require 'fileutils'
5
5
  require 'json'
6
6
  require 'open3'
7
+ require 'openai'
7
8
  require 'optparse'
8
9
  require 'k_log'
9
10
 
10
11
  require 'appydave/tools/version'
11
12
  require 'appydave/tools/gpt_context/file_collector'
12
13
 
14
+ require 'appydave/tools/configuration/openai'
13
15
  require 'appydave/tools/configuration/configurable'
14
- require 'appydave/tools/configuration/config_base'
15
16
  require 'appydave/tools/configuration/config'
16
- require 'appydave/tools/configuration/settings_config'
17
- require 'appydave/tools/configuration/channel_projects_config'
18
- require 'appydave/tools/configuration/channels_config'
17
+ require 'appydave/tools/configuration/models/config_base'
18
+ require 'appydave/tools/configuration/models/settings_config'
19
+ require 'appydave/tools/configuration/models/channel_projects_config'
20
+ require 'appydave/tools/configuration/models/channels_config'
19
21
  require 'appydave/tools/name_manager/project_name'
20
22
 
21
23
  Appydave::Tools::Configuration::Config.set_default do |config|
22
24
  config.config_path = File.expand_path('~/.config/appydave')
23
- config.register(:settings, Appydave::Tools::Configuration::SettingsConfig)
25
+ config.register(:settings, Appydave::Tools::Configuration::Models::SettingsConfig)
24
26
  config.register(:channels, Appydave::Tools::Configuration::ChannelsConfig)
25
27
  config.register(:channel_projects, Appydave::Tools::Configuration::ChannelProjectsConfig)
26
28
  end
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.3.8",
3
+ "version": "0.4.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appydave-tools",
9
- "version": "0.3.8",
9
+ "version": "0.4.1",
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.8",
3
+ "version": "0.4.1",
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.8
4
+ version: 0.4.1
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-25 00:00:00.000000000 Z
11
+ date: 2024-05-26 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: dotenv
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: k_log
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,20 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ruby-openai
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '7'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '7'
41
69
  description: " AppyDave YouTube Automation Tools\n"
42
70
  email:
43
71
  - david@ideasmen.com.au
@@ -64,13 +92,15 @@ files:
64
92
  - images.log
65
93
  - lib/appydave/tools.rb
66
94
  - lib/appydave/tools/configuration/_doc.md
67
- - lib/appydave/tools/configuration/channel_projects_config.rb
68
- - lib/appydave/tools/configuration/channels_config.rb
69
95
  - lib/appydave/tools/configuration/config.rb
70
- - lib/appydave/tools/configuration/config_base.rb
71
96
  - lib/appydave/tools/configuration/configurable.rb
72
- - lib/appydave/tools/configuration/settings_config copy.xrb
73
- - lib/appydave/tools/configuration/settings_config.rb
97
+ - lib/appydave/tools/configuration/models/channel_projects_config.rb
98
+ - lib/appydave/tools/configuration/models/channels_config.rb
99
+ - lib/appydave/tools/configuration/models/config_base.rb
100
+ - lib/appydave/tools/configuration/models/settings_config copy.xrb
101
+ - lib/appydave/tools/configuration/models/settings_config.rb
102
+ - lib/appydave/tools/configuration/openai.rb
103
+ - lib/appydave/tools/gpt_context/_doc.md
74
104
  - lib/appydave/tools/gpt_context/file_collector.rb
75
105
  - lib/appydave/tools/name_manager/_doc.md
76
106
  - lib/appydave/tools/name_manager/project_name.rb
@@ -1,65 +0,0 @@
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
@@ -1,74 +0,0 @@
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
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'json'
4
- require 'fileutils'
5
-
6
- module Appydave
7
- module Tools
8
- module Configuration
9
- # Base class for handling common configuration tasks
10
- class ConfigBase
11
- include KLog::Logging
12
-
13
- attr_reader :config_path, :data
14
-
15
- def initialize
16
- @config_path = File.join(Config.config_path, "#{config_name}.json")
17
- @data = load
18
- end
19
-
20
- def save
21
- File.write(config_path, JSON.pretty_generate(data))
22
- end
23
-
24
- def load
25
- return JSON.parse(File.read(config_path)) if File.exist?(config_path)
26
-
27
- default_data
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
51
- {}
52
- end
53
- end
54
- end
55
- end
56
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Appydave
4
- module Tools
5
- module Configuration
6
- # Global settings that can be referenced by other configurations or tools
7
- class SettingsConfig < ConfigBase
8
- def set(key, value)
9
- data[key] = value
10
- end
11
-
12
- def get(key, default = nil)
13
- data.fetch(key, default)
14
- end
15
-
16
- # Well known settings
17
-
18
- def ecamm_recording_folder
19
- get('ecamm-recording-folder')
20
- end
21
-
22
- def download_folder
23
- get('download-folder')
24
- end
25
-
26
- def download_image_folder
27
- get('download-image-folder') || download_folder
28
- end
29
- end
30
- end
31
- end
32
- end