appydave-tools 0.9.5 → 0.10.1

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: ed51cab9a76cb09289bbcfa80eb759c3f5d70f656043d25bce0b106f74757aef
4
- data.tar.gz: c498125bae1ee080aebe7fd88c0d7c4ceabcb477c0cbd59d8d741c880010bfe6
3
+ metadata.gz: c1a94de7a92dafeaa54b86843c94dec8b25d108355782ba2f57eaf749a368b26
4
+ data.tar.gz: 41ad45648a7a1d3e3394092ef7a95a7ee93585d3e6435dfa1c6bb44d880c1b49
5
5
  SHA512:
6
- metadata.gz: 1520df315b862ca20f306e4e0e0f6ec06b05372858252f3f143e9ba0a7f10fdea18aacc368dd887ad308cdd559ee8664c4b1ad0922d70c89800dfb21124d2a27
7
- data.tar.gz: 2b1e3fb4877bb919b3786e56042d2fde5850d85f8e78d7fa6cf2226dc08edc2bd61dac81e73c4de14e181bc784675d981e59277bbabdd31e34c937e2aef6336b
6
+ metadata.gz: e2f54c832a810f67a6230d38114f49a8877ce45f808daa90a0a1e9f11c6a1d641c69aaccbf38132edcdc628759f43642fd5f69314a586a7bb65716a7b6292dc0
7
+ data.tar.gz: 1aa6d410e0402e5d035ebd3054419e37e16f5bdee5b729940006b465607b0238ee28c4dec3c374139fd79dc9ec87377f736303ff95fd7d925ab343ed45eefa45
data/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # [0.10.0](https://github.com/klueless-io/appydave-tools/compare/v0.9.5...v0.10.0) (2024-06-13)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * cops ([ce8e657](https://github.com/klueless-io/appydave-tools/commit/ce8e657e4a167e7327d86782096bcf5e0a8e226e))
7
+
8
+
9
+ ### Features
10
+
11
+ * starting the prompt tools component ([089043b](https://github.com/klueless-io/appydave-tools/commit/089043bca08dfb79a1b5f3741b55bb66f808adae))
12
+
13
+ ## [0.9.5](https://github.com/klueless-io/appydave-tools/compare/v0.9.4...v0.9.5) (2024-06-13)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * implement update video command ([c46473d](https://github.com/klueless-io/appydave-tools/commit/c46473dc550e34c041418adfd52444014e094917))
19
+
1
20
  ## [0.9.4](https://github.com/klueless-io/appydave-tools/compare/v0.9.3...v0.9.4) (2024-06-12)
2
21
 
3
22
 
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
5
+
6
+ require 'appydave/tools'
7
+
8
+ # Process command line arguments for Prompt operations
9
+ class PromptToolsCLI
10
+ def initialize
11
+ @commands = {
12
+ 'completion' => Appydave::Tools::CliActions::PromptCompletionAction.new
13
+ }
14
+ end
15
+
16
+ def run
17
+ command, *args = ARGV
18
+ if @commands.key?(command)
19
+ @commands[command].action(args)
20
+ else
21
+ puts "Unknown command: #{command}"
22
+ print_help
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def print_help
29
+ puts 'Usage: prompt_tools.rb [command] [options]'
30
+ puts 'Commands:'
31
+ puts ' completion Run a completion prompt against the model'
32
+ puts "Run 'prompt.rb [command] --help' for more information on a command."
33
+ end
34
+ end
35
+
36
+ PromptToolsCLI.new.run
@@ -11,15 +11,15 @@ class YouTubeVideoManagerCLI
11
11
 
12
12
  def initialize
13
13
  @commands = {
14
- 'get' => method(:fetch_video_details),
15
- 'update' => method(:update_video_details)
14
+ 'get' => Appydave::Tools::CliActions::GetVideoAction.new,
15
+ 'update' => Appydave::Tools::CliActions::UpdateVideoAction.new
16
16
  }
17
17
  end
18
18
 
19
19
  def run
20
20
  command, *args = ARGV
21
21
  if @commands.key?(command)
22
- @commands[command].call(args)
22
+ @commands[command].action(args)
23
23
  else
24
24
  puts "Unknown command: #{command}"
25
25
  print_help
@@ -28,27 +28,8 @@ class YouTubeVideoManagerCLI
28
28
 
29
29
  private
30
30
 
31
- def fetch_video_details(args)
32
- options = parse_options(args, 'get')
33
- get_video = Appydave::Tools::YouTubeManager::GetVideo.new
34
- get_video.get(options[:video_id])
35
-
36
- if get_video.video?
37
- # json = JSON.pretty_generate(details)
38
- # puts json
39
-
40
- report = Appydave::Tools::YouTubeManager::Reports::VideoDetailsReport.new
41
- report.print(get_video.data)
42
-
43
- # report = Appydave::Tools::YouTubeManager::Reports::VideoContentReport.new
44
- # report.print(manager.data)
45
- else
46
- log.error "Video not found! Maybe it's private or deleted. ID: #{options[:video_id]}"
47
- end
48
- end
49
-
50
31
  def update_video_details(args)
51
- options = parse_update_options(args)
32
+ options = update_video_options(args)
52
33
 
53
34
  get_video = Appydave::Tools::YouTubeManager::GetVideo.new
54
35
  get_video.get(options[:video_id])
@@ -63,28 +44,7 @@ class YouTubeVideoManagerCLI
63
44
  update_video.save
64
45
  end
65
46
 
66
- def parse_options(args, command)
67
- options = { video_id: nil }
68
- OptionParser.new do |opts|
69
- opts.banner = "Usage: youtube_video_manager.rb #{command} [options]"
70
-
71
- opts.on('-v', '--video-id ID', 'YouTube Video ID') { |v| options[:video_id] = v }
72
-
73
- opts.on_tail('-h', '--help', 'Show this message') do
74
- puts opts
75
- exit
76
- end
77
- end.parse!(args)
78
-
79
- unless options[:video_id]
80
- puts 'Missing required options. Use -h for help.'
81
- exit
82
- end
83
-
84
- options
85
- end
86
-
87
- def parse_update_options(args)
47
+ def update_video_options(args)
88
48
  options = { video_id: nil }
89
49
  OptionParser.new do |opts|
90
50
  opts.banner = 'Usage: youtube_video_manager.rb update [options]'
@@ -0,0 +1,5 @@
1
+ # CLI Actions
2
+
3
+ CLI Actions
4
+
5
+ [ChatGPT](https://chatgpt.com/c/16d34069-1834-4dde-acc6-8e855c725cd9)
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module CliActions
6
+ # Base class for CLI actions
7
+ class BaseAction
8
+ def action(args)
9
+ options = parse_options(args)
10
+ execute(options)
11
+ end
12
+
13
+ protected
14
+
15
+ def parse_options(args)
16
+ options = {}
17
+ OptionParser.new do |opts|
18
+ opts.banner = "Usage: #{command_usage}"
19
+
20
+ define_options(opts, options)
21
+
22
+ opts.on_tail('-h', '--help', 'Show this message') do
23
+ puts opts
24
+ exit
25
+ end
26
+ end.parse!(args)
27
+
28
+ validate_options(options)
29
+ options
30
+ end
31
+
32
+ def command_usage
33
+ "#{self.class.name.split('::').last.downcase} [options]"
34
+ end
35
+
36
+ def define_options(opts, options)
37
+ # To be implemented by subclasses
38
+ end
39
+
40
+ def validate_options(options)
41
+ # To be implemented by subclasses
42
+ end
43
+
44
+ def execute(options)
45
+ # To be implemented by subclasses
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module CliActions
6
+ # CLI Action to get a YouTube video details
7
+ class GetVideoAction < BaseAction
8
+ protected
9
+
10
+ def define_options(opts, options)
11
+ opts.on('-v', '--video-id ID', 'YouTube Video ID') { |v| options[:video_id] = v }
12
+ end
13
+
14
+ def validate_options(options)
15
+ return if options[:video_id]
16
+
17
+ puts 'Missing required options: --video-id. Use -h for help.'
18
+ exit
19
+ end
20
+
21
+ def execute(options)
22
+ get_video = Appydave::Tools::YouTubeManager::GetVideo.new
23
+ get_video.get(options[:video_id])
24
+
25
+ if get_video.video?
26
+ # json = JSON.pretty_generate(details)
27
+ # puts json
28
+
29
+ report = Appydave::Tools::YouTubeManager::Reports::VideoDetailsReport.new
30
+ report.print(get_video.data)
31
+
32
+ # report = Appydave::Tools::YouTubeManager::Reports::VideoContentReport.new
33
+ # report.print(manager.data)
34
+ else
35
+ puts "Video not found! Maybe it's private or deleted. ID: #{options[:video_id]}"
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openai'
4
+
5
+ module Appydave
6
+ module Tools
7
+ module CliActions
8
+ # Action to run a completion prompt against the model
9
+ class PromptCompletionAction < BaseAction
10
+ DEFAULT_MODEL = 'gpt-4o'
11
+ DEFAULT_PLATFORM = 'openai'
12
+
13
+ protected
14
+
15
+ def define_options(opts, options)
16
+ opts.on('-p', '--prompt PROMPT', 'The prompt text') { |v| options[:prompt] = v }
17
+ opts.on('-f', '--file FILE', 'The prompt file') { |v| options[:file] = v }
18
+ opts.on('-o', '--output FILE', 'Output file') { |v| options[:output] = v }
19
+ opts.on('-c', '--clipboard', 'Copy result to clipboard') { |v| options[:clipboard] = v }
20
+ opts.on('-m', '--model MODEL', "Model to use (default: #{DEFAULT_MODEL})") { |v| options[:model] = v }
21
+ opts.on('-k', '--key-value PAIR', 'Key-value pairs for interpolation (format: key1=value1,key2=value2)') { |v| options[:key_value] = v }
22
+ end
23
+
24
+ def validate_options(options)
25
+ unless options[:prompt] || options[:file]
26
+ puts 'Missing required options: --prompt or --file. Use -h for help.'
27
+ exit
28
+ end
29
+
30
+ if options[:key_value]
31
+ key_value_pairs = options[:key_value].split(',').to_h { |pair| pair.split('=') }
32
+ options[:key_value] = key_value_pairs
33
+ else
34
+ options[:key_value] = {}
35
+ end
36
+ end
37
+
38
+ def execute(options)
39
+ prompt_text = options[:prompt] || File.read(options[:file])
40
+ model = options[:model] || DEFAULT_MODEL
41
+ key_value_pairs = options[:key_value] || {}
42
+
43
+ # Interpolate key-value pairs into the prompt
44
+ key_value_pairs.each do |key, value|
45
+ prompt_text.gsub!("{#{key}}", value)
46
+ end
47
+
48
+ puts "Prompt: #{prompt_text}"
49
+ puts "Model: #{model}"
50
+ puts "Key-Value Pairs: #{key_value_pairs}"
51
+
52
+ # USE Library class to run this type of code
53
+ # client = OpenAI::Client.new(api_key: ENV['OPENAI_API_KEY'])
54
+ # response = client.completions(
55
+ # engine: model,
56
+ # parameters: {
57
+ # prompt: prompt_text,
58
+ # max_tokens: 100
59
+ # }
60
+ # )
61
+
62
+ # result = response['choices'].first['text'].strip
63
+
64
+ # if options[:output]
65
+ # File.write(options[:output], result)
66
+ # puts "Output written to #{options[:output]}"
67
+ # end
68
+
69
+ # if options[:clipboard]
70
+ # Clipboard.copy(result)
71
+ # puts 'Output copied to clipboard'
72
+ # end
73
+
74
+ puts 'Result:'
75
+ # puts result unless options[:output]
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module CliActions
6
+ # Action to update a YouTube video metadata (title, description, tags, category)
7
+ class UpdateVideoAction < BaseAction
8
+ protected
9
+
10
+ def define_options(opts, options)
11
+ opts.on('-v', '--video-id ID', 'YouTube Video ID') { |v| options[:video_id] = v }
12
+ opts.on('-t', '--title TITLE', 'Video Title') { |t| options[:title] = t }
13
+ opts.on('-d', '--description DESCRIPTION', 'Video Description') { |d| options[:description] = d }
14
+ opts.on('-g', '--tags TAGS', 'Video Tags (comma-separated)') { |g| options[:tags] = g.split(',') }
15
+ opts.on('-c', '--category-id CATEGORY_ID', 'Video Category ID') { |c| options[:category_id] = c }
16
+ end
17
+
18
+ def validate_options(options)
19
+ return if options[:video_id]
20
+
21
+ puts 'Missing required options: --video-id. Use -h for help.'
22
+ exit
23
+ end
24
+
25
+ def execute(options)
26
+ get_video = Appydave::Tools::YouTubeManager::GetVideo.new
27
+ get_video.get(options[:video_id])
28
+
29
+ if get_video.video?
30
+ update_video = Appydave::Tools::YouTubeManager::UpdateVideo.new(get_video.data)
31
+
32
+ update_video.title(options[:title]) if options[:title]
33
+ update_video.description(options[:description]) if options[:description]
34
+ update_video.tags(options[:tags]) if options[:tags]
35
+ update_video.category_id(options[:category_id]) if options[:category_id]
36
+
37
+ update_video.save
38
+ puts "Video updated successfully. ID: #{options[:video_id]}"
39
+ else
40
+ puts "Video not found! Maybe it's private or deleted. ID: #{options[:video_id]}"
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -23,3 +23,5 @@ module Appydave
23
23
  end
24
24
  end
25
25
  end
26
+
27
+ ActiveModel::Type.register(:array, Appydave::Tools::Types::ArrayType)
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module Types
6
+ # Used by the ActiveModel attributes API to cast values to hashes
7
+ class BaseModel
8
+ include ActiveModel::Model
9
+ include ActiveModel::Attributes
10
+ end
11
+ end
12
+ end
13
+ end
@@ -23,3 +23,5 @@ module Appydave
23
23
  end
24
24
  end
25
25
  end
26
+
27
+ ActiveModel::Type.register(:hash, Appydave::Tools::Types::HashType)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Appydave
4
4
  module Tools
5
- VERSION = '0.9.5'
5
+ VERSION = '0.10.1'
6
6
  end
7
7
  end
@@ -1,3 +1,5 @@
1
1
  # Youtube Manager
2
2
 
3
- Service classes for interacting with the YouTube API.
3
+ Service classes for interacting with the YouTube API.
4
+
5
+ [ChatGPT - Update video](https://chatgpt.com/c/41b75159-95c5-4183-92f3-e1be5e52a1e8)
@@ -5,6 +5,8 @@ module Appydave
5
5
  module YouTubeManager
6
6
  # Manage YouTube video details
7
7
  class GetVideo < YouTubeBase
8
+ include KLog::Logging
9
+
8
10
  attr_reader :video_id
9
11
  attr_reader :data
10
12
 
@@ -21,9 +21,14 @@ require 'appydave/tools/version'
21
21
  require 'appydave/tools/types/indifferent_access_hash'
22
22
  require 'appydave/tools/types/hash_type'
23
23
  require 'appydave/tools/types/array_type'
24
+ require 'appydave/tools/types/base_model'
24
25
 
25
- ActiveModel::Type.register(:array, Appydave::Tools::Types::ArrayType)
26
- ActiveModel::Type.register(:hash, Appydave::Tools::Types::HashType)
26
+ require 'appydave/tools/cli_actions/base_action'
27
+
28
+ # May want to move this into the tools location
29
+ require 'appydave/tools/cli_actions/prompt_completion_action'
30
+ require 'appydave/tools/cli_actions/get_video_action'
31
+ require 'appydave/tools/cli_actions/update_video_action'
27
32
 
28
33
  require 'appydave/tools/gpt_context/file_collector'
29
34
 
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.9.5",
3
+ "version": "0.10.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appydave-tools",
9
- "version": "0.9.5",
9
+ "version": "0.10.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.9.5",
3
+ "version": "0.10.1",
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.9.5
4
+ version: 0.10.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
@@ -160,6 +160,7 @@ files:
160
160
  - bin/configuration.rb
161
161
  - bin/console
162
162
  - bin/gpt_context.rb
163
+ - bin/prompt_tools.rb
163
164
  - bin/setup
164
165
  - bin/subtitle_master.rb
165
166
  - bin/youtube_automation.rb
@@ -171,6 +172,11 @@ files:
171
172
  - lib/appydave/tools/bank_reconciliation/clean/mapper.rb
172
173
  - lib/appydave/tools/bank_reconciliation/clean/read_transactions.rb
173
174
  - lib/appydave/tools/bank_reconciliation/models/transaction.rb
175
+ - lib/appydave/tools/cli_actions/_doc.md
176
+ - lib/appydave/tools/cli_actions/base_action.rb
177
+ - lib/appydave/tools/cli_actions/get_video_action.rb
178
+ - lib/appydave/tools/cli_actions/prompt_completion_action.rb
179
+ - lib/appydave/tools/cli_actions/update_video_action.rb
174
180
  - lib/appydave/tools/configuration/_doc.md
175
181
  - lib/appydave/tools/configuration/config.rb
176
182
  - lib/appydave/tools/configuration/configurable.rb
@@ -185,9 +191,11 @@ files:
185
191
  - lib/appydave/tools/gpt_context/file_collector.rb
186
192
  - lib/appydave/tools/name_manager/_doc.md
187
193
  - lib/appydave/tools/name_manager/project_name.rb
194
+ - lib/appydave/tools/prompt_tools/models/platform_info.rb
188
195
  - lib/appydave/tools/subtitle_master/_doc.md
189
196
  - lib/appydave/tools/subtitle_master/clean.rb
190
197
  - lib/appydave/tools/types/array_type.rb
198
+ - lib/appydave/tools/types/base_model.rb
191
199
  - lib/appydave/tools/types/hash_type.rb
192
200
  - lib/appydave/tools/types/indifferent_access_hash.rb
193
201
  - lib/appydave/tools/version.rb