legion-cli 0.2.0

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 (49) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +61 -0
  3. data/.gitignore +12 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +17 -0
  6. data/Gemfile +4 -0
  7. data/README.md +3 -0
  8. data/Rakefile +6 -0
  9. data/bitbucket-pipelines.yml +69 -0
  10. data/exe/legionio +4 -0
  11. data/exe/lex_gen +5 -0
  12. data/legion-cli.gemspec +35 -0
  13. data/lib/legion/cli.rb +56 -0
  14. data/lib/legion/cli/chain.rb +36 -0
  15. data/lib/legion/cli/cohort.rb +10 -0
  16. data/lib/legion/cli/function.rb +41 -0
  17. data/lib/legion/cli/lex/actor.rb +31 -0
  18. data/lib/legion/cli/lex/exchange.rb +32 -0
  19. data/lib/legion/cli/lex/message.rb +32 -0
  20. data/lib/legion/cli/lex/queue.rb +32 -0
  21. data/lib/legion/cli/lex/runner.rb +71 -0
  22. data/lib/legion/cli/lex/templates/actor.erb +6 -0
  23. data/lib/legion/cli/lex/templates/actor_spec.erb +0 -0
  24. data/lib/legion/cli/lex/templates/base/bitbucket.yml.erb +69 -0
  25. data/lib/legion/cli/lex/templates/base/gemfile.erb +3 -0
  26. data/lib/legion/cli/lex/templates/base/gemspec.erb +26 -0
  27. data/lib/legion/cli/lex/templates/base/gitignore.erb +11 -0
  28. data/lib/legion/cli/lex/templates/base/lex.erb +9 -0
  29. data/lib/legion/cli/lex/templates/base/lex_spec.erb +5 -0
  30. data/lib/legion/cli/lex/templates/base/lic.erb +21 -0
  31. data/lib/legion/cli/lex/templates/base/rakefile.erb +6 -0
  32. data/lib/legion/cli/lex/templates/base/readme.md.erb +2 -0
  33. data/lib/legion/cli/lex/templates/base/rubocop.yml.erb +15 -0
  34. data/lib/legion/cli/lex/templates/base/spec_helper.rb.erb +11 -0
  35. data/lib/legion/cli/lex/templates/base/version.erb +7 -0
  36. data/lib/legion/cli/lex/templates/exchange.erb +11 -0
  37. data/lib/legion/cli/lex/templates/exchange_spec.erb +0 -0
  38. data/lib/legion/cli/lex/templates/message.erb +27 -0
  39. data/lib/legion/cli/lex/templates/message_spec.erb +0 -0
  40. data/lib/legion/cli/lex/templates/queue.erb +8 -0
  41. data/lib/legion/cli/lex/templates/queue_spec.erb +0 -0
  42. data/lib/legion/cli/lex/templates/runner.erb +11 -0
  43. data/lib/legion/cli/lex/templates/runner_spec.erb +11 -0
  44. data/lib/legion/cli/relationship.rb +22 -0
  45. data/lib/legion/cli/task.rb +49 -0
  46. data/lib/legion/cli/trigger.rb +81 -0
  47. data/lib/legion/cli/version.rb +5 -0
  48. data/lib/legion/lex.rb +91 -0
  49. metadata +176 -0
@@ -0,0 +1,49 @@
1
+ module Legion
2
+ class Cli
3
+ class Task < Thor
4
+ package_name 'Legion'
5
+
6
+ option :limit, type: :numeric, required: true, default: 10, desc: 'how many tasks to return'
7
+ desc 'show', 'show'
8
+ option :status, type: :string, required: false, desc: 'search for specific status'
9
+ def show
10
+ Legion::Service.new(cache: false, crypt: false, extensions: false, log_level: 'error')
11
+ rows = [%w[id relationship function status]]
12
+ Legion::Data::Model::Task.limit(options[:limit]).order(:id).reverse_each do |row|
13
+ rows.push([row.values[:id], row.values[:relationship_id], row.values[:function_id], row.values[:status]])
14
+ end
15
+
16
+ print_table rows
17
+ end
18
+
19
+ desc 'test', 'test'
20
+ def status(id)
21
+ Legion::Service.new(cache: false, crypt: false, extensions: false, log_level: 'error')
22
+ say Legion::Data::Model::Task[id].values
23
+ end
24
+
25
+ desc 'logs', 'logs'
26
+ option :limit, type: :numeric, required: true, default: 10, desc: 'how many tasks to return'
27
+ def logs(id)
28
+ Legion::Service.new(cache: false, crypt: false, extensions: false, log_level: 'error')
29
+ rows = [%w[id node_id created entry]]
30
+ Legion::Data::Model::TaskLog.where(task_id: id).limit(options[:limit]).each do |row|
31
+ rows.push([row.values[:id], row.values[:node_id], row.values[:created], row.values[:entry]])
32
+ end
33
+ print_table rows
34
+ end
35
+
36
+ desc 'purge', 'purge'
37
+ def purge
38
+ Legion::Service.new(cache: false, crypt: false, extensions: false, log_level: 'error')
39
+ days = ask 'how many days do you want to keep?', default: 7
40
+ dataset = Legion::Data::Model::Task.where { created < DateTime.now - days.to_i }
41
+ yes? "This will delete #{dataset.count} tasks, continue?", :red
42
+ dataset.delete
43
+ say 'Done!'
44
+ end
45
+
46
+ default_task :show
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,81 @@
1
+ module Legion
2
+ class Cli
3
+ class Trigger < Thor
4
+ desc 'queue', 'used to send a job directly to a worker via Legion::Transport'
5
+ option :extension, type: :string, required: false, desc: 'extension short name'
6
+ option :runner, type: :string, required: false, desc: 'runner short name'
7
+ option :function, type: :string, required: false, desc: 'function short name'
8
+ option :delay, type: :numeric, default: 0, desc: 'how long to wait before running the task'
9
+ def queue(*args)
10
+ Legion::Service.new(cache: false, crypt: false, extensions: false, log_level: 'error')
11
+ include Legion::Extensions::Helpers::Task
12
+ response = if options['extension'].is_a? String
13
+ options[:extension]
14
+ else
15
+ ask 'trigger extension?', limited_to: Legion::Data::Model::Extension.map(:name)
16
+ end
17
+ trigger_extension = Legion::Data::Model::Extension.where(name: response).first
18
+ runners = Legion::Data::Model::Runner.where(extension_id: trigger_extension.values[:id])
19
+ if runners.count === 1
20
+ trigger_runner = runners.first
21
+ say "Auto selecting #{trigger_runner.values[:name]} since it is the only option for runners"
22
+ else
23
+ response = options[:runner].is_a?(String) ? options[:runner] : ask('trigger runner?', limited_to: runners.map(:name))
24
+ trigger_runner = Legion::Data::Model::Runner.where(name: response).where(extension_id: trigger_extension.values[:id]).first
25
+ end
26
+
27
+ functions = Legion::Data::Model::Function.where(runner_id: trigger_runner.values[:id])
28
+
29
+ if functions.count === 1
30
+ trigger_function = functions.first
31
+ say "Auto selecting #{trigger_function.values[:name]} since it is the only option for functions"
32
+ else
33
+ response = options[:function].is_a?(String) ? options[:function] : ask('trigger function?', limited_to: Legion::Data::Model::Function.where(runner_id: trigger_runner.values[:id]).map(:name))
34
+ trigger_function = Legion::Data::Model::Function.where(runner_id: trigger_runner.values[:id]).where(name: response).first
35
+ end
36
+ say "#{trigger_runner.values[:namespace]}.#{trigger_function.values[:name]} selected as trigger", :green, :italicized
37
+ payload = {}
38
+ auto_opts = {}
39
+ unless args.count.zero?
40
+ args.each do |arg|
41
+ test = arg.split(':')
42
+ auto_opts[test[0].to_sym] = test[1]
43
+ end
44
+ end
45
+
46
+ Legion::JSON.load(trigger_function.values[:args]).each do |arg, required|
47
+ next if %w[args payload opts options].include? arg.to_s
48
+
49
+ if auto_opts.key? arg
50
+ payload[arg.to_sym] = auto_opts[arg]
51
+ next
52
+ end
53
+ response = ask "#{required == 'keyreq' ? '[required]' : '[optional]'} #{arg} value:"
54
+ if response.empty? && required == 'keyreq'
55
+ say "Error! #{arg} is required and cannot be empty", :red
56
+ redo
57
+ end
58
+ payload[arg.to_sym] = response unless response.empty?
59
+ end
60
+
61
+ status = options[:delay].zero? ? 'task.queued' : 'task.delayed'
62
+ task = generate_task_id(function_id: trigger_function.values[:id], status: status, runner_id: trigger_runner.values[:id], args: payload, delay: options[:delay])
63
+
64
+ unless options[:delay].zero?
65
+ say "Task: #{task[:task_id]} is queued and will be run in #{options[:delay]}s"
66
+ return true
67
+ end
68
+
69
+ routing_key = "#{trigger_extension.values[:exchange]}.#{trigger_runner.values[:queue]}.#{trigger_function.values[:name]}"
70
+ exchange = Legion::Transport::Messages::Dynamic.new(function: trigger_function.values[:name], function_id: trigger_function.values[:id], routing_key: routing_key, args: payload)
71
+ exchange.options[:task_id] = task[:task_id]
72
+ exchange.publish if options[:delay].zero?
73
+
74
+ say "Task: #{task[:task_id]} was queued"
75
+ end
76
+ remove_command :generate_task_id
77
+
78
+ default_task :queue
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,5 @@
1
+ module Legion
2
+ class Cli
3
+ VERSION = '0.2.0'.freeze
4
+ end
5
+ end
@@ -0,0 +1,91 @@
1
+ require 'thor'
2
+ require 'legion/cli/version'
3
+ require 'legion/cli/lex/actor'
4
+ require 'legion/cli/lex/exchange'
5
+ require 'legion/cli/lex/message'
6
+ require 'legion/cli/lex/queue'
7
+ require 'legion/cli/lex/runner'
8
+
9
+ module Legion
10
+ class Cli
11
+ class LexBuilder < Thor
12
+ check_unknown_options!
13
+ include Thor::Actions
14
+
15
+ no_commands do
16
+ def lex
17
+ Dir.pwd.split('/').last.split('-').last
18
+ end
19
+ end
20
+
21
+ def self.exit_on_failure?
22
+ true
23
+ end
24
+
25
+ def self.source_root
26
+ File.dirname(__FILE__)
27
+ end
28
+
29
+ desc 'actor', 'creates and manages actors'
30
+ subcommand 'actor', Legion::Cli::Lex::Actor
31
+
32
+ desc 'exchange', 'creates and manages exchanges'
33
+ subcommand 'exchange', Legion::Cli::Lex::Exchange
34
+
35
+ desc 'messages', 'creates and manages messages'
36
+ subcommand 'message', Legion::Cli::Lex::Message
37
+
38
+ desc 'queue', 'creates and manages queues'
39
+ subcommand 'queue', Legion::Cli::Lex::Queue
40
+
41
+ desc 'runner', 'creates and manages runners'
42
+ subcommand 'runner', Legion::Cli::Lex::Runner
43
+
44
+ desc 'version', 'Display Version'
45
+ map %w[-v --version] => :version
46
+ def version
47
+ say "Legion::CLI #{Legion::Cli::VERSION}"
48
+ end
49
+
50
+ method_option rspec: true
51
+ method_option pipeline: true
52
+ method_option git_init: true
53
+ method_option bundle_install: true
54
+ desc 'create :name', 'creates a new lex'
55
+ def create(name)
56
+ if Dir.pwd.include?('lex-')
57
+ say('already inside a lex_gen, try moving to a different directory', :red)
58
+ return nil
59
+ end
60
+
61
+ vars = { filename: "lex-#{name}", class_name: name.capitalize, lex: name }
62
+ filename = vars[:filename]
63
+ template('lex/templates/base/gemspec.erb', "#{filename}/#{filename}.gemspec", vars)
64
+ template('lex/templates/base/gemfile.erb', "#{filename}/Gemfile", vars)
65
+ template('lex/templates/base/gitignore.erb', "#{filename}/.gitignore", vars)
66
+ template('lex/templates/base/lic.erb', "#{filename}/LICENSE.txt", vars)
67
+ template('lex/templates/base/rakefile.erb', "#{filename}/Rakefile", vars)
68
+ template('lex/templates/base/rubocop.yml.erb', "#{filename}/.rubocop.yml", vars)
69
+ template('lex/templates/base/readme.md.erb', "#{filename}/README.md", **vars)
70
+ template('lex/templates/base/lex.erb', "#{filename}/lib/legion/extensions/#{name}.rb", vars)
71
+ template('lex/templates/base/version.erb', "#{filename}/lib/legion/extensions/#{name}/version.rb", vars)
72
+ if options[:pipeline]
73
+ template('lex/templates/base/bitbucket.yml.erb', "#{filename}/bitbucket-pipelines.yml", vars)
74
+ end
75
+ template('lex/templates/base/spec_helper.rb.erb', "#{filename}/spec/spec_helper.rb", vars)
76
+ template('lex/templates/base/lex_spec.erb', "#{filename}/spec/legion/#{name}_spec.rb", vars)
77
+
78
+ return if !options[:git_init] && !options[:bundle_install]
79
+
80
+ run("cd lex_gen-#{filename}")
81
+ if options[:git_init]
82
+ run('git init')
83
+ run('git add .')
84
+ run('git commit -m \'Initial commit\'')
85
+ end
86
+
87
+ run('bundle update') if options[:bundle_install]
88
+ end
89
+ end
90
+ end
91
+ end
metadata ADDED
@@ -0,0 +1,176 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: legion-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Esity
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-11-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: legionio
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: thor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Legion::CLI
98
+ email:
99
+ - matthewdiverson@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".circleci/config.yml"
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - ".rubocop.yml"
108
+ - Gemfile
109
+ - README.md
110
+ - Rakefile
111
+ - bitbucket-pipelines.yml
112
+ - exe/legionio
113
+ - exe/lex_gen
114
+ - legion-cli.gemspec
115
+ - lib/legion/cli.rb
116
+ - lib/legion/cli/chain.rb
117
+ - lib/legion/cli/cohort.rb
118
+ - lib/legion/cli/function.rb
119
+ - lib/legion/cli/lex/actor.rb
120
+ - lib/legion/cli/lex/exchange.rb
121
+ - lib/legion/cli/lex/message.rb
122
+ - lib/legion/cli/lex/queue.rb
123
+ - lib/legion/cli/lex/runner.rb
124
+ - lib/legion/cli/lex/templates/actor.erb
125
+ - lib/legion/cli/lex/templates/actor_spec.erb
126
+ - lib/legion/cli/lex/templates/base/bitbucket.yml.erb
127
+ - lib/legion/cli/lex/templates/base/gemfile.erb
128
+ - lib/legion/cli/lex/templates/base/gemspec.erb
129
+ - lib/legion/cli/lex/templates/base/gitignore.erb
130
+ - lib/legion/cli/lex/templates/base/lex.erb
131
+ - lib/legion/cli/lex/templates/base/lex_spec.erb
132
+ - lib/legion/cli/lex/templates/base/lic.erb
133
+ - lib/legion/cli/lex/templates/base/rakefile.erb
134
+ - lib/legion/cli/lex/templates/base/readme.md.erb
135
+ - lib/legion/cli/lex/templates/base/rubocop.yml.erb
136
+ - lib/legion/cli/lex/templates/base/spec_helper.rb.erb
137
+ - lib/legion/cli/lex/templates/base/version.erb
138
+ - lib/legion/cli/lex/templates/exchange.erb
139
+ - lib/legion/cli/lex/templates/exchange_spec.erb
140
+ - lib/legion/cli/lex/templates/message.erb
141
+ - lib/legion/cli/lex/templates/message_spec.erb
142
+ - lib/legion/cli/lex/templates/queue.erb
143
+ - lib/legion/cli/lex/templates/queue_spec.erb
144
+ - lib/legion/cli/lex/templates/runner.erb
145
+ - lib/legion/cli/lex/templates/runner_spec.erb
146
+ - lib/legion/cli/relationship.rb
147
+ - lib/legion/cli/task.rb
148
+ - lib/legion/cli/trigger.rb
149
+ - lib/legion/cli/version.rb
150
+ - lib/legion/lex.rb
151
+ homepage: https://bitbucket.org/legion-io/legion-cli
152
+ licenses: []
153
+ metadata:
154
+ homepage_uri: https://bitbucket.org/legion-io/legion-cli
155
+ source_code_uri: https://bitbucket.org/legion-io/legion-cli
156
+ changelog_uri: https://bitbucket.org/legion-io/legion-cli
157
+ post_install_message:
158
+ rdoc_options: []
159
+ require_paths:
160
+ - lib
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: 2.5.0
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ requirements: []
172
+ rubygems_version: 3.1.2
173
+ signing_key:
174
+ specification_version: 4
175
+ summary: Legion::CLI
176
+ test_files: []