rainforest-cli 1.10.0 → 1.10.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
  SHA1:
3
- metadata.gz: aefdfe1a4a5ecf73e5b919dbbf6da1bb7d13f5c1
4
- data.tar.gz: 88ee5992a58f3340535f3b1d21ed54f8fea53cc8
3
+ metadata.gz: 2b75c82906788c8a2ee74b5d0ddb6311c7b644dd
4
+ data.tar.gz: 3a80fd662427ed53bc4e850d85f13a0ad7e4ae96
5
5
  SHA512:
6
- metadata.gz: 4787e5a59c11fe612a982f2aabb51e6ed5386e2fef18fb5771aad337d54334b7514dfe4ea82d5738c51fb39496e28e13a5f3d440ac0773298eba2082c724969f
7
- data.tar.gz: 64c1ef609db5add1c02c19e04d241e73520123b15d5c3fc60c0388875e3994b670f934c6b78b52c5f3750edc829445477a8b71ed544a6a676d4b9dd9d6ebf1b7
6
+ metadata.gz: 837d61212b55d32434c933547c50224522e5c0da42d10ed5da14f8db6784242927861815fa724d1bf8eeade388f2feedc74b06ec70a0336224e93a490b32db1e
7
+ data.tar.gz: 6dcf90bfca52ee02e8c1f72df2fd471bfef755c52cb374a8995b994e5d7605b159f63fd85b0947ba0a57904175d8a6e24b71a243fe9b97ca3e501c9e4b689d25
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Rainforest CLI Changelog
2
2
 
3
+ ## 1.10.1 - 10th October 2016
4
+ - Add documentation for commands to `--help` text. (fe3fddbe7086a6b914ffe74f65ae128a14277f82, @epaulet)
5
+ - Use more efficient CSV upload method. (e716e76b7627b334c4f8b50fd0afdad6fadd162e, @epaulet)
6
+
3
7
  ## 1.10.0 - 19th September 2016
4
8
  - Add `--overwrite-variable` option to overwrite existing tabular variables if the
5
9
  desired variable name is already taken when uploading CSVs. (ebf4ab90c5db2589695eaf6c3d4c4206bad17e7b,
@@ -5,6 +5,7 @@ require 'logger'
5
5
  require 'rainforest_cli/version'
6
6
  require 'rainforest_cli/constants'
7
7
  require 'rainforest_cli/options'
8
+ require 'rainforest_cli/commands'
8
9
  require 'rainforest_cli/runner'
9
10
  require 'rainforest_cli/http_client'
10
11
  require 'rainforest_cli/git_trigger'
@@ -23,9 +24,24 @@ require 'rainforest_cli/reporter'
23
24
  module RainforestCli
24
25
  def self.start(args)
25
26
  options = OptionParser.new(args)
27
+ commands = Commands.new do |c|
28
+ c.add('run', 'Run your tests on Rainforest') { Runner.new(options).run }
29
+ c.add('new', 'Create a new RFML test') { TestFiles.new(options).create_file }
30
+ c.add('validate', 'Validate your RFML tests') { Validator.new(options).validate }
31
+ c.add('upload', 'Upload your RFML tests') { Uploader.new(options).upload }
32
+ c.add('rm', 'Remove an RFML test locally and remotely') { Deleter.new(options).delete }
33
+ c.add('export', 'Export your remote Rainforest tests to RFML') { Exporter.new(options).export }
34
+ c.add('csv-upload', 'Upload a new tabular variable from a CSV file') { CSVImporter.new(options).import }
35
+ c.add('report', 'Create a JUnit report from your run results') { Reporter.new(options).report }
36
+ end
37
+
26
38
  @http_client = HttpClient.new(token: options.token)
27
39
  ::Rainforest.api_key = options.token
28
- OptionParser.new(['--help']) if args.size == 0
40
+
41
+ if args.size == 0
42
+ commands.print_documentation
43
+ options.print_documentation
44
+ end
29
45
 
30
46
  begin
31
47
  options.validate!
@@ -34,22 +50,7 @@ module RainforestCli
34
50
  exit 2
35
51
  end
36
52
 
37
- case options.command
38
- when 'run' then Runner.new(options).run
39
- when 'new' then TestFiles.new(options).create_file
40
- when 'validate' then Validator.new(options).validate
41
- when 'upload' then Uploader.new(options).upload
42
- when 'rm' then Deleter.new(options).delete
43
- when 'export' then Exporter.new(options).export
44
- when 'csv-upload' then CSVImporter.new(options).import
45
- when 'report' then Reporter.new(options).report
46
- when 'sites', 'folders', 'browsers'
47
- Resources.new(options).public_send(options.command)
48
- else
49
- logger.fatal 'Unknown command'
50
- exit 2
51
- end
52
-
53
+ commands.call(options.command) if options.command
53
54
  true
54
55
  end
55
56
 
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RainforestCli
4
+ class Commands
5
+ Command = Struct.new(:name, :description, :block)
6
+
7
+ attr_reader :commands
8
+
9
+ def initialize
10
+ @commands = []
11
+ yield(self) if block_given?
12
+ end
13
+
14
+ def add(command, description, &blk)
15
+ @commands << Command.new(command, description, blk)
16
+ end
17
+
18
+ def call(command_name)
19
+ command = @commands.find { |c| c.name == command_name }
20
+
21
+ if command.nil?
22
+ logger.fatal "Unknown command: #{command_name}"
23
+ exit 2
24
+ end
25
+
26
+ command.block.call
27
+ end
28
+
29
+ def print_documentation
30
+ command_col_width = @commands.map { |c| c.name.length }.max
31
+ puts 'Usage: Rainforest CLI commands:'
32
+ @commands.each do |command|
33
+ puts "\t#{command.name.ljust(command_col_width)}\t\t#{command.description}"
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def logger
40
+ RainforestCli.logger
41
+ end
42
+ end
43
+ end
@@ -1,8 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
  require 'csv'
4
- require 'parallel'
5
- require 'ruby-progressbar'
6
4
 
7
5
  module RainforestCli
8
6
  class CSVImporter
@@ -24,7 +22,7 @@ module RainforestCli
24
22
 
25
23
  # Create the generator
26
24
  columns = rows.shift.map do |column|
27
- {name: column.downcase.strip.gsub(/\s/, '_')}
25
+ column.downcase.strip.gsub(/\s/, '_')
28
26
  end
29
27
  raise 'Invalid schema in CSV. You must include headers in first row.' if !columns
30
28
 
@@ -45,17 +43,15 @@ module RainforestCli
45
43
  raise "Error creating tabular variable: #{response['error']}" if response['error']
46
44
  puts "\t[OK]"
47
45
 
48
- @columns = response['columns']
49
- @generator_id = response['id']
46
+ columns = response['columns']
47
+ generator_id = response['id']
48
+ data = rows.map { |row| row_data(columns, row) }
50
49
 
51
50
  puts 'Uploading data...'
52
- p = ProgressBar.create(title: 'Rows', total: rows.count, format: '%a %B %p%% %t')
53
-
54
- # Insert the data
55
- Parallel.each(rows, in_threads: RainforestCli::THREADS, finish: lambda { |_item, _i, _result| p.increment }) do |row|
56
- response = http_client.post("/generators/#{@generator_id}/rows", {data: row_data(@columns, row)})
57
- raise response['error'] if response['error']
58
- end
51
+ response = http_client.post("/generators/#{generator_id}/rows/batch", data: data)
52
+ # NOTE: Response for this endpoint will usually be an array representing all the rows created
53
+ raise response['error'] if response.is_a?(Hash) && response['error']
54
+ puts 'Upload complete.'
59
55
  end
60
56
 
61
57
  private
@@ -128,7 +128,7 @@ module RainforestCli
128
128
  exit 0
129
129
  end
130
130
 
131
- opts.on_tail('--version', 'Display gem version') do
131
+ opts.on_tail('--version', '-v', 'Display gem version') do
132
132
  puts opts.ver
133
133
  exit 0
134
134
  end
@@ -150,6 +150,10 @@ module RainforestCli
150
150
  @tests = @args.dup
151
151
  end
152
152
 
153
+ def print_documentation
154
+ self.class.new(['--help'])
155
+ end
156
+
153
157
  def tests
154
158
  @tests
155
159
  end
@@ -175,7 +179,7 @@ module RainforestCli
175
179
  end
176
180
 
177
181
  def validate!
178
- if !TOKEN_NOT_REQUIRED.include?(command)
182
+ unless command.nil? || TOKEN_NOT_REQUIRED.include?(command)
179
183
  unless token
180
184
  raise ValidationError, 'You must pass your API token using: --token TOKEN'
181
185
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module RainforestCli
3
- VERSION = '1.10.0'
3
+ VERSION = '1.10.1'
4
4
  end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+ describe RainforestCli::Commands do
3
+ subject { described_class.new }
4
+
5
+ describe '#initialize' do
6
+ it 'works without giving a block' do
7
+ expect { described_class.new }.to_not raise_error
8
+ end
9
+
10
+ it 'adds commands to list' do
11
+ commands = described_class.new do |c|
12
+ c.add('foo', 'bar') { 'baz' }
13
+ c.add('blah', 'blah') { 'blah' }
14
+ end
15
+
16
+ expect(commands.commands.length).to eq(2)
17
+ end
18
+ end
19
+
20
+ describe '#add' do
21
+ let(:first_command) { subject.commands.first }
22
+
23
+ it 'properly adds a command to the list of commands' do
24
+ subject.add('foo', 'bar') { 'baz' }
25
+ expect(first_command.name).to eq('foo')
26
+ expect(first_command.description).to eq('bar')
27
+ expect(first_command.block.call).to eq('baz')
28
+ end
29
+ end
30
+
31
+ describe '#call' do
32
+ let(:service_object) { double }
33
+
34
+ before do
35
+ subject.add('my_command', 'desc') { service_object.my_method }
36
+ end
37
+
38
+ it "calls the corresponding command's block" do
39
+ expect(service_object).to receive(:my_method)
40
+ subject.call('my_command')
41
+ end
42
+
43
+ it 'raises a fatal error if the command does not exist' do
44
+ expect { subject.call('my_other_command') }.to raise_error(SystemExit)
45
+ end
46
+ end
47
+ end
@@ -31,24 +31,22 @@ describe RainforestCli::CSVImporter do
31
31
  .with('/generators', {
32
32
  name: 'variables',
33
33
  description: 'variables',
34
- columns: columns.map {|col| { name: col } },
34
+ columns: columns,
35
35
  })
36
36
  .and_return success_response
37
37
 
38
38
  expect(http_client).to receive(:post)
39
- .with("/generators/#{generator_id}/rows", {
40
- data: {
41
- 0 => 'russ@rainforestqa.com',
42
- 1 => 'abc123',
43
- },
44
- }).and_return({})
45
-
46
- expect(http_client).to receive(:post)
47
- .with("/generators/#{generator_id}/rows", {
48
- data: {
49
- 0 => 'bob@example.com',
50
- 1 => 'hunter2',
51
- },
39
+ .with("/generators/#{generator_id}/rows/batch", {
40
+ data: [
41
+ {
42
+ 0 => 'russ@rainforestqa.com',
43
+ 1 => 'abc123',
44
+ },
45
+ {
46
+ 0 => 'bob@example.com',
47
+ 1 => 'hunter2',
48
+ },
49
+ ],
52
50
  }).and_return({})
53
51
  subject.import
54
52
  end
@@ -143,12 +143,12 @@ describe RainforestCli::OptionParser do
143
143
  end
144
144
 
145
145
  context 'with valid arguments' do
146
- let(:args) { %w(--token foo) }
146
+ let(:args) { %w(new) }
147
147
  it { does_not_raise_a_validation_exception }
148
148
  end
149
149
 
150
150
  context 'with missing token' do
151
- let(:args) { %w() }
151
+ let(:args) { %w(upload) }
152
152
  it { raises_a_validation_exception }
153
153
  end
154
154
 
@@ -40,6 +40,15 @@ describe RainforestCli do
40
40
  end
41
41
  end
42
42
 
43
+ context 'no parameters' do
44
+ let(:params) { %w() }
45
+ it 'prints out the help docs' do
46
+ expect_any_instance_of(RainforestCli::Commands).to receive(:print_documentation)
47
+ expect_any_instance_of(RainforestCli::OptionParser).to receive(:print_documentation)
48
+ described_class.start(params)
49
+ end
50
+ end
51
+
43
52
  context 'git-trigger' do
44
53
  let(:params) { %w(run --token x --git-trigger) }
45
54
  let(:commit_message) { 'a test commit message' }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rainforest-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.0
4
+ version: 1.10.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Russell Smith
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-09-19 00:00:00.000000000 Z
12
+ date: 2016-10-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -190,6 +190,7 @@ files:
190
190
  - bin/rainforest
191
191
  - examples/inline_files.md
192
192
  - lib/rainforest_cli.rb
193
+ - lib/rainforest_cli/commands.rb
193
194
  - lib/rainforest_cli/constants.rb
194
195
  - lib/rainforest_cli/csv_importer.rb
195
196
  - lib/rainforest_cli/deleter.rb
@@ -220,6 +221,7 @@ files:
220
221
  - spec/multiple-rainforest-examples/example_test.rfml
221
222
  - spec/multiple-rainforest-examples/example_test_2.rfml
222
223
  - spec/rainforest-example/example_test.rfml
224
+ - spec/rainforest_cli/commands_spec.rb
223
225
  - spec/rainforest_cli/csv_importer_spec.rb
224
226
  - spec/rainforest_cli/deleter_spec.rb
225
227
  - spec/rainforest_cli/exporter_spec.rb
@@ -290,6 +292,7 @@ test_files:
290
292
  - spec/multiple-rainforest-examples/example_test.rfml
291
293
  - spec/multiple-rainforest-examples/example_test_2.rfml
292
294
  - spec/rainforest-example/example_test.rfml
295
+ - spec/rainforest_cli/commands_spec.rb
293
296
  - spec/rainforest_cli/csv_importer_spec.rb
294
297
  - spec/rainforest_cli/deleter_spec.rb
295
298
  - spec/rainforest_cli/exporter_spec.rb