minfra-cli 0.2.1 → 0.2.2

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: 4224f87e9e115273ab68701933de59e1f158defa41dce87eb654e99995194e17
4
- data.tar.gz: 4d3a42708f78a4f735077e384a22cc1c61dfb3bd53212ceac3cd6e8f2c3a58a2
3
+ metadata.gz: 4c095831fd4a669abd1381046091e615395c93e367051ee051bf48c458167d63
4
+ data.tar.gz: 3b7219fba8adb56249c8be8f249751613c9f9e529d7a8d9341f44c32e69271ac
5
5
  SHA512:
6
- metadata.gz: aa77c060c478f6af724543a962c4ac95f20a224ef8b60d614de57ce65a4de81e6b3b31b992781008db931bd3be670566e2cff6fbfd83b3a847e74c775c24ad77
7
- data.tar.gz: 176fbdbdcc45afea7143417a7cb66a3796e95a48028ee2a4cb6890e3e5b80cce3322a915afa87938ab53d4a8f64cae57df0409eace476a1161485ed318404709
6
+ metadata.gz: 45aacbd112f2797e1b177f477b9456cb955a20576a11442c8c4799609bbe6a226177d29c3ac1ff27a9b2270a1fd2fd2ac6fe4bd1ab5e813e823ff13bfd1e960c
7
+ data.tar.gz: 81bd7e7366bf87ca8c048289e74ec3bc2e5819456c6b386063e1831d8465bb2cb4cc18cd573ada93a5aefdd0c5392bba50be02348a31616ff447f60975ab65e2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,4 @@
1
- # 0.2.1
2
- * fixing preload
1
+ # 0.2.2 Secrets support in charts
3
2
 
4
3
  # 0.1.0 Initial
5
4
  * opensourcing a base state, still WIP!
data/bin/run_tests CHANGED
@@ -61,7 +61,7 @@ volumes << "..:/code" unless ENV["BUILD_ID"]
61
61
 
62
62
  # Run docker pull on cache
63
63
  if @cache_tag
64
- run("docker pull 858049876441.dkr.ecr.eu-west-1.amazonaws.com/#{@project_name}:#{@cache_tag}")
64
+ run("docker pull TBD/#{@project_name}:#{@cache_tag}")
65
65
  end
66
66
 
67
67
  erb = ERB.new(File.open("#{__dir__}/../spec/docker-compose.yml").read, 0, '>')
@@ -87,13 +87,13 @@ module Minfra
87
87
 
88
88
  method = options["install"] ? "install" : "upgrade"
89
89
  File.open(stack.compose_path(blank: true),"w") do |f|
90
- Orchparty.print(cluster_name: cluster,
91
- application_name: stack.name,
92
- force_variable_definition: false,
93
- file_name: stack.stack_rb_path.to_s,
94
- method: method,
95
- options: options,
96
- out_io: f)
90
+ Orchparty::App.new(cluster_name: cluster,
91
+ application_name: stack.name,
92
+ force_variable_definition: false,
93
+ file_name: stack.stack_rb_path.to_s,
94
+ options: options
95
+ ).
96
+ print( method: method, out_io: f)
97
97
  end
98
98
  #run_cmd(generate_cmd, :bash)
99
99
  bash_cmd = ["cd #{stack.release_path}"]
@@ -128,7 +128,13 @@ module Minfra
128
128
 
129
129
  message = "deploying stack #{stack.name}: #{reason_message}."
130
130
  Minfra::Cli::Document.document(@config,"started #{message}")
131
- Orchparty.send(method, cluster_name: cluster, application_name: stack.name, force_variable_definition: false, file_name: stack.stack_rb_path.to_s, options: options)
131
+ orch=Orchparty::App.new(cluster_name: cluster,
132
+ application_name: stack.name,
133
+ force_variable_definition: false,
134
+ file_name: stack.stack_rb_path.to_s,
135
+ options: options
136
+ )
137
+ orch.send(method)
132
138
  Minfra::Cli::Document.document(@config,"finished #{message}")
133
139
  end
134
140
  end
@@ -1,5 +1,5 @@
1
1
  module Minfra
2
2
  module Cli
3
- VERSION = '0.2.1'.freeze
3
+ VERSION = '0.2.2'.freeze
4
4
  end
5
5
  end
data/lib/minfra/cli.rb CHANGED
@@ -19,6 +19,7 @@ require_relative 'cli/plugins'
19
19
  require 'active_support'
20
20
  require 'active_support/core_ext'
21
21
 
22
+ require "#{ENV['MINFRA_PATH']}/config/preload.rb" if File.exist?("#{ENV['MINFRA_PATH']}/config/preload.rb")
22
23
 
23
24
  module Minfra
24
25
  module Cli
@@ -74,9 +75,6 @@ end
74
75
  Minfra::Cli::Plugins.load
75
76
  Minfra::Cli.scan
76
77
  require_relative 'cli/main_command'
77
-
78
- require "#{ENV['MINFRA_PATH']}/config/preload.rb" if File.exist?("#{ENV['MINFRA_PATH']}/config/preload.rb")
79
-
80
78
  Minfra::Cli.resolve
81
79
 
82
80
 
@@ -188,6 +188,7 @@ module Orchparty
188
188
  self
189
189
  end
190
190
 
191
+
191
192
  def wait(&block)
192
193
  name = SecureRandom.hex
193
194
  result = ServiceBuilder.build(name, "wait", block)
@@ -214,7 +215,6 @@ module Orchparty
214
215
  end
215
216
 
216
217
  def service(name, &block)
217
-
218
218
  chart_name = @application.name
219
219
  unless @application.services[chart_name]
220
220
  @application.services[chart_name] = AST.chart(name: chart_name, _type: "chart" )
@@ -332,6 +332,14 @@ module Orchparty
332
332
  def initialize(name, type)
333
333
  super AST.service(name: name, _type: type)
334
334
  end
335
+
336
+ # 1. rememebring the secrets in environment_secrets (so these environments can be created differentyly
337
+ # 2. create Secret sections
338
+ def environment_secrets(&block)
339
+ result = HashBuilder.build(block)
340
+ @node.environment_secrets = result
341
+ self
342
+ end
335
343
  end
336
344
 
337
345
  class ServiceMixinBuilder < CommonBuilder
@@ -356,6 +364,15 @@ module Orchparty
356
364
  @node._services << name
357
365
  self
358
366
  end
367
+
368
+ def secrets(name, &block)
369
+ result = ServiceBuilder.build(name, "chart-secret", block)
370
+ @application.services[name] = result
371
+ @application._service_order << name
372
+ @node._services << name
373
+ self
374
+ end
375
+
359
376
  end
360
377
  end
361
378
  end
@@ -32,6 +32,7 @@ module Orchparty
32
32
  if(file_path.end_with?(".erb"))
33
33
  helm.application = OpenStruct.new(cluster_name: cluster_name, namespace: namespace)
34
34
  template = Erubis::Eruby.new(File.read(file_path))
35
+ template.filename = file_path
35
36
  yaml = template.result(helm.get_binding)
36
37
  file = Tempfile.new("kube-deploy.yaml")
37
38
  file.write(yaml)
@@ -117,14 +118,6 @@ module Orchparty
117
118
  @out_io.puts upgrade_cmd(label)
118
119
  end
119
120
 
120
- def upgrade(label)
121
- @out_io.puts system(upgrade_cmd(label))
122
- end
123
-
124
- def install(label)
125
- @out_io.puts system(install_cmd(label))
126
- end
127
-
128
121
  def upgrade_cmd(label)
129
122
  "kubectl --namespace #{namespace} --context #{cluster_name} label --overwrite #{label[:resource]} #{label[:name]} #{label["value"]}"
130
123
  end
@@ -184,7 +177,6 @@ module Orchparty
184
177
  output_chart_path: output_chart_path,
185
178
  chart_name: chart.name,
186
179
  )
187
-
188
180
  params.each do |app_name, subparams|
189
181
  subparams[:chart] = chart
190
182
  generate_documents_from_erbs(
@@ -203,12 +195,13 @@ module Orchparty
203
195
  end
204
196
 
205
197
  kind = params.fetch(:kind)
206
-
207
198
  Dir[File.join(templates_path, kind, '*.erb')].each do |template_path|
199
+ puts "Rendering Template: #{template_path}"
208
200
  template_name = File.basename(template_path, '.erb')
209
201
  output_path = File.join(output_chart_path, 'templates', "#{app_name}-#{template_name}")
210
202
 
211
203
  template = Erubis::Eruby.new(File.read(template_path))
204
+ template.filename = template_path
212
205
  params.app_name = app_name
213
206
  params.templates_path = templates_path
214
207
  begin
@@ -216,7 +209,7 @@ module Orchparty
216
209
  rescue Exception
217
210
  puts "#{template_path} has a problem: #{$!.inspect}"
218
211
  raise
219
- end
212
+ end
220
213
  File.write(output_path, document)
221
214
  end
222
215
  end
@@ -226,6 +219,7 @@ module Orchparty
226
219
  output_path = File.join(output_chart_path, 'Chart.yaml')
227
220
 
228
221
  template = Erubis::Eruby.new(File.read(template_path))
222
+ template.filename = template_path
229
223
  params = Hashie::Mash.new(chart_name: chart_name)
230
224
  document = template.result(CleanBinding.new.get_binding(params))
231
225
  File.write(output_path, document)
@@ -249,6 +243,7 @@ module Orchparty
249
243
 
250
244
  def upgrade(chart)
251
245
  build_chart(chart) do |chart_path|
246
+ system("cp -a #{chart_path} /tmp/latest-chart")
252
247
  @out_io.puts system("helm upgrade --namespace #{namespace} --kube-context #{cluster_name} #{chart.name} #{chart_path}")
253
248
  end
254
249
  end
@@ -299,6 +294,7 @@ class KubernetesApplication
299
294
  services = combine_charts(app_config)
300
295
  services.each do |name|
301
296
  service = app_config[:services][name]
297
+ puts "Service: #{name} #{method}"
302
298
  "::Orchparty::Services::#{service._type.classify}".constantize.new(cluster_name: cluster_name, namespace: namespace, file_path: file_path, app_config: app_config, out_io: @out_io).send(method, service)
303
299
  end
304
300
  end
data/lib/orchparty.rb CHANGED
@@ -1,59 +1,85 @@
1
- require "deep_merge"
2
- require "orchparty/version"
3
- require "orchparty/ast"
4
- require "orchparty/context"
5
- require "orchparty/transformations"
6
- require "orchparty/dsl_parser"
7
- require "orchparty/dsl_parser_kubernetes"
8
- require "orchparty/plugin"
9
- require "orchparty/kubernetes_application"
10
- require "hash"
1
+ # frozen_string_literal: true
11
2
 
12
- module Orchparty
3
+ require 'deep_merge'
4
+ require 'orchparty/version'
5
+ require 'orchparty/ast'
6
+ require 'orchparty/context'
7
+ require 'orchparty/transformations'
8
+ require 'orchparty/dsl_parser'
9
+ require 'orchparty/dsl_parser_kubernetes'
10
+ require 'orchparty/plugin'
11
+ require 'orchparty/kubernetes_application'
12
+ require 'hash'
13
13
 
14
- def self.load_all_available_plugins
15
- Gem::Specification.map {|f| f.matches_for_glob("orchparty/plugins/*.rb") }.flatten.map{|file_name| File.basename(file_name, ".*").to_sym }.each do |plugin_name|
16
- plugin(plugin_name)
17
- end
18
- end
14
+ module Orchparty
19
15
 
20
16
  def self.options
21
- @@options || {}
17
+ @@options
22
18
  end
23
- def self.plugins
24
- Orchparty::Plugin.plugins
19
+ def self.options=(opt)
20
+ @@options=opt
25
21
  end
22
+
23
+ class App
24
+ attr_reader :options
26
25
 
27
- def self.plugin(name)
28
- Orchparty::Plugin.load_plugin(name)
29
- end
26
+ def initialize(cluster_name:, application_name:, force_variable_definition:, file_name:, options: {})
27
+ @cluster_name = cluster_name
28
+ @application_name = application_name
29
+ @force_variable_definiton = force_variable_definition
30
+ @file_name = file_name
31
+ @options = options
32
+ Orchparty.options=options
33
+
34
+ load_plugins
35
+ end
30
36
 
31
- def self.ast(filename: , application:, force_variable_definition: nil )
32
- Transformations.transform(Orchparty::DSLParser.new(filename).parse, force_variable_definition: force_variable_definition).applications[application]
33
- end
37
+ def plugins
38
+ Orchparty::Plugin.plugins
39
+ end
34
40
 
35
- def self.generate(plugin_name, options, plugin_options)
36
- plugins[plugin_name].generate(ast(options), plugin_options)
37
- end
41
+ def print(method:, out_io:)
42
+ app(out_io: out_io).print(method)
43
+ end
38
44
 
39
- def self.install(cluster_name: , application_name: , force_variable_definition:, file_name:, options: )
40
- @@options= options
41
- app_config = Transformations.transform_kubernetes(Orchparty::Kubernetes::DSLParser.new(file_name).parse, force_variable_definition: force_variable_definition).applications[application_name]
42
- app = KubernetesApplication.new(app_config: app_config, namespace: application_name, cluster_name: cluster_name, file_name: file_name)
43
- app.install
44
- end
45
+ def install
46
+ app.install
47
+ end
45
48
 
46
- def self.upgrade(cluster_name: , application_name: , force_variable_definition:, file_name:, options: )
47
- @@options = options
48
- app_config = Transformations.transform_kubernetes(Orchparty::Kubernetes::DSLParser.new(file_name).parse, force_variable_definition: force_variable_definition).applications[application_name]
49
- app = KubernetesApplication.new(app_config: app_config, namespace: application_name, cluster_name: cluster_name, file_name: file_name)
50
- app.upgrade
51
- end
49
+ def upgrade
50
+ app.upgrade
51
+ end
52
+
53
+ private
54
+
55
+ def app(out_io: STDOUT)
56
+ parsed = Orchparty::Kubernetes::DSLParser.new(@file_name).parse
57
+ app_config = Transformations.transform_kubernetes(parsed, force_variable_definition: @force_variable_definition).applications[@application_name]
58
+ KubernetesApplication.new(app_config: app_config, namespace: @application_name, cluster_name: @cluster_name, file_name: @file_name, out_io: out_io)
59
+ end
60
+
61
+ def generate(plugin_name, options, plugin_options)
62
+ plugins[plugin_name].generate(ast(options), plugin_options)
63
+ end
52
64
 
53
- def self.print(cluster_name: , application_name: , force_variable_definition:, file_name:, method:, options:, out_io: )
54
- @@options= options
55
- app_config = Transformations.transform_kubernetes(Orchparty::Kubernetes::DSLParser.new(file_name).parse, force_variable_definition: force_variable_definition).applications[application_name]
56
- app = KubernetesApplication.new(app_config: app_config, namespace: application_name, cluster_name: cluster_name, file_name: file_name, out_io: out_io)
57
- app.print(method)
65
+ def ast(filename:, application:, force_variable_definition: nil)
66
+ Transformations.transform(Orchparty::DSLParser.new(filename).parse,
67
+ force_variable_definition: force_variable_definition).applications[application]
68
+ end
69
+
70
+ def load_plugins
71
+ Gem::Specification.map do |f|
72
+ f.matches_for_glob('orchparty/plugins/*.rb')
73
+ end.flatten.map do |file_name|
74
+ File.basename(file_name,
75
+ '.*').to_sym
76
+ end.each do |plugin_name|
77
+ plugin(plugin_name)
78
+ end
79
+ end
80
+
81
+ def plugin(name)
82
+ Orchparty::Plugin.load_plugin(name)
83
+ end
58
84
  end
59
85
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minfra-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Schrammel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-04 00:00:00.000000000 Z
11
+ date: 2022-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -110,11 +110,8 @@ extra_rdoc_files: []
110
110
  files:
111
111
  - ".dockerignore"
112
112
  - ".gitignore"
113
- - ".rspec"
114
113
  - CHANGELOG.md
115
114
  - Dockerfile
116
- - Gemfile
117
- - Gemfile.lock
118
115
  - bin/build
119
116
  - bin/console
120
117
  - bin/container_exec
@@ -191,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
191
188
  - !ruby/object:Gem::Version
192
189
  version: '0'
193
190
  requirements: []
194
- rubygems_version: 3.2.5
191
+ rubygems_version: 3.1.2
195
192
  signing_key:
196
193
  specification_version: 4
197
194
  summary: A cli framework for k8s based development and deployment.
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --format progress
2
- --color
data/Gemfile DELETED
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
- source 'https://rubygems.org'
3
-
4
- #gemspec
5
- gem "thor"
6
- gem "table_print", "1.5.6"
7
- gem "rest-client", "~>2.0"
8
- gem "hashie", "~>3.5"
9
- gem "bootsnap"
10
- gem "gli", "~> 2.16.0"
11
- gem "activesupport"
12
- gem "erubis"
13
-
14
- gem 'byebug', require: true # convenience
15
- gem 'graphiti'
16
- gem 'faraday'
17
-
18
-
19
- group :test do
20
- gem 'rspec'
21
- gem 'rubocop'
22
- gem 'timecop'
23
- end
24
-
25
- group :development, :test do
26
- gem 'guard-rspec', require: false
27
- gem 'pry'
28
- gem 'pry-doc'
29
- end
30
-
31
- if false && ENV["MINFRA_WITH_PLUGINS"]=="true" # this is only set when we run the exe (not on bundle install...)
32
- require 'ostruct'
33
- require 'json'
34
- require 'byebug'
35
-
36
- [Pathname.new(ENV["MINFRA_PATH"]).join("config","minfra_plugins.json"),
37
- Pathname.new(ENV["MINFRA_PATH"]).join("me","minfra_plugins.json")].each do |file|
38
-
39
- next unless File.exist?(file)
40
-
41
- plugins=JSON.parse(File.read(file))
42
- plugins["plugins"].each do |spec|
43
- opts=spec["opts"] || {}
44
- opts.merge(require: false)
45
- if opts["path"]
46
- gem spec["name"], spec["version"], opts
47
- else
48
- begin
49
- Gem::Specification.find_by_name(spec["name"]) unless ENV["MINFRA_SETUP"]
50
- gem spec["name"], spec["version"], opts
51
- rescue Gem::MissingSpecError
52
- STDERR.puts("Can't load plugin: #{spec["name"]}, #{spec["version"]}; run 'minfra plugin setup'")
53
- end
54
- end
55
- end
56
- end
57
- end
58
-
59
-
data/Gemfile.lock DELETED
@@ -1,171 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- activesupport (6.1.0)
5
- concurrent-ruby (~> 1.0, >= 1.0.2)
6
- i18n (>= 1.6, < 2)
7
- minitest (>= 5.1)
8
- tzinfo (~> 2.0)
9
- zeitwerk (~> 2.3)
10
- ast (2.4.0)
11
- bootsnap (1.4.6)
12
- msgpack (~> 1.0)
13
- byebug (11.1.3)
14
- coderay (1.1.3)
15
- concurrent-ruby (1.1.7)
16
- diff-lcs (1.3)
17
- domain_name (0.5.20190701)
18
- unf (>= 0.0.5, < 1.0.0)
19
- dry-configurable (0.13.0)
20
- concurrent-ruby (~> 1.0)
21
- dry-core (~> 0.6)
22
- dry-container (0.9.0)
23
- concurrent-ruby (~> 1.0)
24
- dry-configurable (~> 0.13, >= 0.13.0)
25
- dry-core (0.7.1)
26
- concurrent-ruby (~> 1.0)
27
- dry-inflector (0.2.1)
28
- dry-logic (1.2.0)
29
- concurrent-ruby (~> 1.0)
30
- dry-core (~> 0.5, >= 0.5)
31
- dry-types (1.5.1)
32
- concurrent-ruby (~> 1.0)
33
- dry-container (~> 0.3)
34
- dry-core (~> 0.5, >= 0.5)
35
- dry-inflector (~> 0.1, >= 0.1.2)
36
- dry-logic (~> 1.0, >= 1.0.2)
37
- erubis (2.7.0)
38
- faraday (2.0.1)
39
- faraday-net_http (~> 2.0)
40
- ruby2_keywords (>= 0.0.4)
41
- faraday-net_http (2.0.1)
42
- ffi (1.14.2)
43
- formatador (0.2.5)
44
- gli (2.16.1)
45
- graphiti (1.3.5)
46
- activesupport (>= 4.1)
47
- concurrent-ruby (~> 1.0)
48
- dry-types (>= 0.15.0, < 2.0)
49
- graphiti_errors (~> 1.1.0)
50
- jsonapi-renderer (~> 0.2, >= 0.2.2)
51
- jsonapi-serializable (~> 0.3.0)
52
- graphiti_errors (1.1.2)
53
- jsonapi-serializable (~> 0.1)
54
- guard (2.16.2)
55
- formatador (>= 0.2.4)
56
- listen (>= 2.7, < 4.0)
57
- lumberjack (>= 1.0.12, < 2.0)
58
- nenv (~> 0.1)
59
- notiffany (~> 0.0)
60
- pry (>= 0.9.12)
61
- shellany (~> 0.0)
62
- thor (>= 0.18.1)
63
- guard-compat (1.2.1)
64
- guard-rspec (4.7.3)
65
- guard (~> 2.1)
66
- guard-compat (~> 1.1)
67
- rspec (>= 2.99.0, < 4.0)
68
- hashie (3.5.7)
69
- http-accept (1.7.0)
70
- http-cookie (1.0.3)
71
- domain_name (~> 0.5)
72
- i18n (1.8.5)
73
- concurrent-ruby (~> 1.0)
74
- jaro_winkler (1.5.4)
75
- jsonapi-renderer (0.2.2)
76
- jsonapi-serializable (0.3.1)
77
- jsonapi-renderer (~> 0.2.0)
78
- listen (3.3.3)
79
- rb-fsevent (~> 0.10, >= 0.10.3)
80
- rb-inotify (~> 0.9, >= 0.9.10)
81
- lumberjack (1.2.8)
82
- method_source (1.0.0)
83
- mime-types (3.3.1)
84
- mime-types-data (~> 3.2015)
85
- mime-types-data (3.2020.0425)
86
- minitest (5.14.2)
87
- msgpack (1.3.3)
88
- nenv (0.3.0)
89
- netrc (0.11.0)
90
- notiffany (0.1.3)
91
- nenv (~> 0.1)
92
- shellany (~> 0.0)
93
- parallel (1.19.1)
94
- parser (2.7.1.2)
95
- ast (~> 2.4.0)
96
- pry (0.13.1)
97
- coderay (~> 1.1)
98
- method_source (~> 1.0)
99
- pry-doc (1.1.0)
100
- pry (~> 0.11)
101
- yard (~> 0.9.11)
102
- rainbow (3.0.0)
103
- rb-fsevent (0.10.4)
104
- rb-inotify (0.10.1)
105
- ffi (~> 1.0)
106
- rest-client (2.1.0)
107
- http-accept (>= 1.7.0, < 2.0)
108
- http-cookie (>= 1.0.2, < 2.0)
109
- mime-types (>= 1.16, < 4.0)
110
- netrc (~> 0.8)
111
- rexml (3.2.4)
112
- rspec (3.9.0)
113
- rspec-core (~> 3.9.0)
114
- rspec-expectations (~> 3.9.0)
115
- rspec-mocks (~> 3.9.0)
116
- rspec-core (3.9.2)
117
- rspec-support (~> 3.9.3)
118
- rspec-expectations (3.9.2)
119
- diff-lcs (>= 1.2.0, < 2.0)
120
- rspec-support (~> 3.9.0)
121
- rspec-mocks (3.9.1)
122
- diff-lcs (>= 1.2.0, < 2.0)
123
- rspec-support (~> 3.9.0)
124
- rspec-support (3.9.3)
125
- rubocop (0.82.0)
126
- jaro_winkler (~> 1.5.1)
127
- parallel (~> 1.10)
128
- parser (>= 2.7.0.1)
129
- rainbow (>= 2.2.2, < 4.0)
130
- rexml
131
- ruby-progressbar (~> 1.7)
132
- unicode-display_width (>= 1.4.0, < 2.0)
133
- ruby-progressbar (1.10.1)
134
- ruby2_keywords (0.0.5)
135
- shellany (0.0.1)
136
- table_print (1.5.6)
137
- thor (1.0.1)
138
- timecop (0.9.1)
139
- tzinfo (2.0.4)
140
- concurrent-ruby (~> 1.0)
141
- unf (0.1.4)
142
- unf_ext
143
- unf_ext (0.0.7.7)
144
- unicode-display_width (1.7.0)
145
- yard (0.9.25)
146
- zeitwerk (2.4.2)
147
-
148
- PLATFORMS
149
- ruby
150
-
151
- DEPENDENCIES
152
- activesupport
153
- bootsnap
154
- byebug
155
- erubis
156
- faraday
157
- gli (~> 2.16.0)
158
- graphiti
159
- guard-rspec
160
- hashie (~> 3.5)
161
- pry
162
- pry-doc
163
- rest-client (~> 2.0)
164
- rspec
165
- rubocop
166
- table_print (= 1.5.6)
167
- thor
168
- timecop
169
-
170
- BUNDLED WITH
171
- 2.1.4