rainforest-client 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 67f3f0495908c60093c5dcd1df844643a51d064a
4
+ data.tar.gz: 6e2d86568a94f96bf25dfcf85acefe5b6dd40f25
5
+ SHA512:
6
+ metadata.gz: 8fd7080807a7dd2a5656d3031f106bbecb36edf547141b0fbe8d595a6ebc39cbcf778704290fb9e23f8c9813aae692fe43310ad5ca2a29595b1fe3917289ee81
7
+ data.tar.gz: bb592ed884c0b1f4c645f46c2a140ece3af78d0f7905569542840c7e952035741a521220f14afe3dfea9c7b4e0183791fcd88dad5cf375b63777f7166c470358
data/.gitignore ADDED
@@ -0,0 +1,34 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swo
15
+ *.swp
16
+
17
+ ## PROJECT::GENERAL
18
+ config/mixpanel.yml
19
+ coverage
20
+ rdoc
21
+ pkg
22
+ doc
23
+ .yardoc
24
+
25
+ ## PROJECT::SPECIFIC
26
+ test/
27
+ tmp/
28
+
29
+ ## Bundler/Gems
30
+ *.gem
31
+ .bundle
32
+ Gemfile.lock
33
+ pkg/*
34
+ bin/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ rainforest-client
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.0.0-p247
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rainforest-cli.gemspec
4
+ gemspec
5
+
6
+ group :test do
7
+ gem "rspec"
8
+ end
data/README.md ADDED
@@ -0,0 +1,71 @@
1
+ [![Build Status](https://travis-ci.org/kureikain/rainforest-gem.png)](https://travis-ci.org/kureikain/rainforest-gem)
2
+
3
+ # Rainforest-client
4
+
5
+ API Client for RainForest
6
+
7
+ ## Installation
8
+
9
+ $ gem install rainforest-client
10
+
11
+ or if you use a Gemfile
12
+
13
+ gem 'rainforest_client'
14
+
15
+ or you can use direcly from github
16
+
17
+ gem 'rainforest-client',
18
+ :git => 'https://github.com/kureikain/rainforest-gem',
19
+ :branch => 'master'
20
+
21
+ ## Usage
22
+
23
+ You can access end-point directly, via request method and receive JSON data back. Or use resource wrapper.
24
+
25
+ ### Access API directly
26
+
27
+ require 'rubygems'
28
+ require 'rainforest-client'
29
+
30
+ Rainforest::Client.api_key="1f98f025af50d0d6732e79625abb5a06"
31
+
32
+ api = Rainforest::Client.new
33
+ payload = {tests: [2286]}
34
+
35
+ runs = api.request('runs', payload)
36
+ puts runs
37
+
38
+ # Or to get runs
39
+ runs = api.request('runs', payload, :get)
40
+ puts runs
41
+
42
+ # Get a particular resource
43
+
44
+ runs = api.request('runs/2286', nil, :get)
45
+ puts runs
46
+
47
+ ### Or via object/resource wrapper
48
+
49
+ runs = Rainforest::Runs.new
50
+ puts runs.retrieve
51
+
52
+ puts runs.retrieve 4208898
53
+ puts runs.delete
54
+
55
+ # These are not implemented yet
56
+ test = Rainforest::Tests.new
57
+ test.create
58
+
59
+ puts runs.retrieve 4208898
60
+
61
+ ## Test
62
+ $ rake spec
63
+
64
+ ## Changelog
65
+
66
+ ### v0.0.2
67
+ * Separate API client and resource
68
+ * Add error handle via parsing response from API endpoint
69
+
70
+ ### v0.0.1
71
+ * Experimental
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rubygems'
3
+ require 'rake'
4
+
5
+ Bundler::GemHelper.install_tasks
6
+
7
+ require 'rspec/core/rake_task'
8
+
9
+ desc 'Run all default tests'
10
+ RSpec::Core::RakeTask.new(:spec) do |spec|
11
+ #spec.pattern = 'spec/**/*_spec.rb'
12
+ spec.rspec_opts = ['--format doc --color']
13
+ end
14
+
15
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
16
+ spec.pattern = 'spec/**/*_spec.rb'
17
+ spec.rcov = true
18
+ end
19
+
20
+ task :spec
21
+ task :default => :spec
@@ -0,0 +1,70 @@
1
+ require "rainforest/client/version"
2
+ require "rainforest/resource/base"
3
+ require "rainforest/resource/runs"
4
+ require "httparty"
5
+ require "json"
6
+
7
+ module Rainforest
8
+ class ConfigurationError < StandardError; end
9
+
10
+ class Client
11
+ @@api_key = nil
12
+ API_END_POINT = 'https://app.rainforestqa.com/api/1/'
13
+
14
+ def self.api_key=(api_key)
15
+ @@api_key = api_key
16
+ end
17
+ def self.api_key
18
+ @@api_key
19
+ end
20
+
21
+ def initialize
22
+ end
23
+
24
+ # More information about resource at: https://app.rainforestqa.com/docs
25
+ def build_request_uri(resource)
26
+ _resource = resource.split('/')[0]
27
+ raise ArgumentError, 'resource is invalid' unless ['auth', 'clients', 'runs', 'tests', 'environments', 'pricing_plan'].include? _resource
28
+ return "#{API_END_POINT}#{resource}"
29
+ end
30
+
31
+ def request(cmd, payload, method = :post)
32
+ raise Rainforest::ConfigurationError, "Client token is missing" if @@api_key == nil
33
+
34
+ url = build_request_uri(cmd)
35
+ payload = payload.to_json if payload.class == Hash
36
+
37
+ if [:get, :post, :put, :delete].include? method
38
+ case method
39
+ when :get
40
+ response = HTTParty.get url, {
41
+ body: payload,
42
+ headers: {"CLIENT_TOKEN" => @@api_key, "Content-type" => "application/json"}
43
+ }
44
+ when :post
45
+ response = HTTParty.post url, {
46
+ body: payload,
47
+ headers: {"CLIENT_TOKEN" => @@api_key, "Content-type" => "application/json"}
48
+ }
49
+ when :put
50
+ response = HTTParty.put url, {
51
+ body: payload,
52
+ headers: {"CLIENT_TOKEN" => @@api_key, "Content-type" => "application/json"}
53
+ }
54
+ when :delete
55
+ response = HTTParty.delete url, {
56
+ body: payload,
57
+ headers: {"CLIENT_TOKEN" => @@api_key, "Content-type" => "application/json"}
58
+ }
59
+ end
60
+ body = JSON.parse(response.body)
61
+ if body.include? 'error'
62
+ raise body['error']
63
+ end
64
+ return JSON.parse(response.body)
65
+ end
66
+ raise ArgumentError, "Invalid Method. We support only: :get, :post, :put, :delete"
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,5 @@
1
+ module Rainforest
2
+ class Client
3
+ VERSION = "0.0.10"
4
+ end
5
+ end
@@ -0,0 +1,40 @@
1
+ require "json"
2
+
3
+ module Rainforest
4
+ class Resource
5
+
6
+ def initialize(hash=nil)
7
+ if hash.class == Hash
8
+ hash.each do |k,v|
9
+ self.instance_variable_set("@#{k}", v)
10
+ end
11
+ end
12
+ @api_client = Rainforest::Client.new
13
+
14
+ end
15
+
16
+ # Get resource
17
+ def retrieve(id=nil)
18
+ if id.is_a? Integer
19
+ object = self.class.name.split('::')[-1].downcase + '/' + id.to_s
20
+ @api_client.request(object, nil, :get)
21
+ else
22
+ object = self.class.name.split('::')[-1].downcase + '/' + id.to_s
23
+ @api_client.request(object, nil, :get)
24
+ end
25
+ end
26
+
27
+ # Create resource
28
+ def create
29
+ end
30
+
31
+ # Delete resource
32
+ def delete
33
+ end
34
+
35
+ # @TODO
36
+ def update
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,17 @@
1
+ require "json"
2
+
3
+ module Rainforest
4
+ class Runs < Resource
5
+ attr_accessor :id,
6
+ :created_at,
7
+ :environment_id,
8
+ :test_count,
9
+ :state_log,
10
+ :state,
11
+ :result,
12
+ :expected_wait_time,
13
+ :browsers,
14
+ :requested_tests
15
+
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ require "rainforest/client"
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rainforest/client/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rainforest-client"
8
+ spec.version = Rainforest::Client::VERSION
9
+ spec.authors = ["Simon Mathieu", "Russell Smith", "kureikain"]
10
+ spec.email = ["simon@rainforestqa.com", "russ@rainforestqa.com"]
11
+ spec.description = %q{API Client for RainforestQA}
12
+ spec.summary = %q{API Client for RainforestQA}
13
+ spec.homepage = "https://www.rainforestqa.com/"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "httparty"
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ end
@@ -0,0 +1,93 @@
1
+ require 'spec_helper'
2
+ require 'ostruct'
3
+
4
+ describe Rainforest::Client do
5
+ # Should keep this API key for tets only
6
+ let(:api_key) { '1f98f025af50d0d6732e79625abb5a06'}
7
+ subject do
8
+ Rainforest::Client.new
9
+ end
10
+
11
+ it "should create a new instance" do
12
+ subject.should be_an_instance_of Rainforest::Client
13
+ end
14
+
15
+ it 'should update API key' do
16
+ Rainforest::Client.api_key = api_key
17
+ Rainforest::Client.api_key.should == api_key
18
+ end
19
+
20
+ describe '#build_request_uri' do
21
+ it "should throw error with nil resource" do
22
+ expect { subject.build_request_uri}.to raise_error ArgumentError
23
+ end
24
+
25
+ it "should throw error with empty resource" do
26
+ expect { subject.build_request_uri(' ')}.to raise_error ArgumentError
27
+ end
28
+
29
+ it "should throw error with invalid resource" do
30
+ expect { subject.build_request_uri('unknow resource')}.to raise_error ArgumentError
31
+ end
32
+
33
+ it "build correct end point" do
34
+ subject.build_request_uri('runs').should == 'https://app.rainforestqa.com/api/1/runs'
35
+ end
36
+ end
37
+
38
+ describe '#request' do
39
+ context "with invalid param" do
40
+ it "should raise error without an API token" do
41
+ Rainforest::Client.api_key = nil
42
+ expect { subject.request('runs', {}, :get)}.to raise_error Rainforest::ConfigurationError
43
+ end
44
+ it "should raise error with input argument" do
45
+ Rainforest::Client.api_key = api_key
46
+ expect { subject.request('lopruns', {}, :invalid)}.to raise_error ArgumentError
47
+ end
48
+ end
49
+
50
+ context "with valid param" do
51
+ before(:each) do
52
+ Rainforest::Client.api_key = api_key
53
+ end
54
+
55
+ it "should retrieve all runs" do
56
+ payload = {tests: [2286]}
57
+ uri = subject.build_request_uri('runs')
58
+ HTTParty.stub(:get).with(uri, {body: "{}", headers: {"CLIENT_TOKEN" => api_key, "Content-type" => "application/json"}}) do
59
+ OpenStruct.new({body: '[{"id":4337,"object":"Run","created_at":"2013-11-16T08:30:36Z","environment_id":1235,"test_count":1,"state_log":[{"created_at":"2013-11-16T08:30:46Z","event":"validate_run!","from":"queued","id":11846764,"state_column":"state","stateful_id":4337,"stateful_type":"Run","to":"validating","transitioned_at":"2013-11-16T08:30:46Z","updated_at":"2013-11-16T08:30:46Z"},{"created_at":"2013-11-16T08:30:46Z","event":"validated!","from":"validating","id":11846763,"state_column":"state","stateful_id":4337,"stateful_type":"Run","to":"in_progress","transitioned_at":"2013-11-16T08:30:46Z","updated_at":"2013-11-16T08:30:46Z"}],"state":"in_progress","result":"no_result","expected_wait_time":5400.0,"browsers":[{"name":"chrome","state":"enabled"},{"name":"firefox","state":"enabled"},{"name":"ie8","state":"enabled"},{"name":"ie9","state":"enabled"},{"name":"safari","state":"enabled"}],"requested_tests":[2286]},{"id":4270,"object":"Run","created_at":"2013-11-14T05:47:46Z","environment_id":1235,"test_count":1,"state_log":[{"created_at":"2013-11-14T06:06:54Z","event":"complete!","from":"in_progress","id":11780317,"state_column":"state","stateful_id":4270,"stateful_type":"Run","to":"complete","transitioned_at":"2013-11-14T06:06:54Z","updated_at":"2013-11-14T06:06:54Z"},{"created_at":"2013-11-14T06:06:44Z","event":"failed!","from":"no_result","id":11780303,"state_column":"result","stateful_id":4270,"stateful_type":"Run","to":"failed","transitioned_at":"2013-11-14T06:06:44Z","updated_at":"2013-11-14T06:06:44Z"},{"created_at":"2013-11-14T06:06:43Z","event":"failed!","from":"no_result","id":11780301,"state_column":"result","stateful_id":4270,"stateful_type":"Run","to":"failed","transitioned_at":"2013-11-14T06:06:43Z","updated_at":"2013-11-14T06:06:43Z"},{"created_at":"2013-11-14T05:48:05Z","event":"validate_run!","from":"queued","id":11779865,"state_column":"state","stateful_id":4270,"stateful_type":"Run","to":"validating","transitioned_at":"2013-11-14T05:48:05Z","updated_at":"2013-11-14T05:48:05Z"},{"created_at":"2013-11-14T05:48:05Z","event":"validated!","from":"validating","id":11779864,"state_column":"state","stateful_id":4270,"stateful_type":"Run","to":"in_progress","transitioned_at":"2013-11-14T05:48:05Z","updated_at":"2013-11-14T05:48:05Z"}],"state":"complete","result":"failed","expected_wait_time":5400.0,"browsers":[{"name":"chrome","state":"enabled"},{"name":"firefox","state":"enabled"},{"name":"ie8","state":"enabled"},{"name":"ie9","state":"enabled"},{"name":"safari","state":"enabled"}],"requested_tests":[2286]},{"id":4269,"object":"Run","created_at":"2013-11-14T05:30:51Z","environment_id":1235,"test_count":1,"state_log":[{"created_at":"2013-11-14T05:54:29Z","event":"complete!","from":"in_progress","id":11780079,"state_column":"state","stateful_id":4269,"stateful_type":"Run","to":"complete","transitioned_at":"2013-11-14T05:54:29Z","updated_at":"2013-11-14T05:54:29Z"},{"created_at":"2013-11-14T05:48:01Z","event":"failed!","from":"failed","id":11779840,"state_column":"result","stateful_id":4269,"stateful_type":"Run","to":"failed","transitioned_at":"2013-11-14T05:48:01Z","updated_at":"2013-11-14T05:48:01Z"},{"created_at":"2013-11-14T05:36:19Z","event":"failed!","from":"no_result","id":11779597,"state_column":"result","stateful_id":4269,"stateful_type":"Run","to":"failed","transitioned_at":"2013-11-14T05:36:19Z","updated_at":"2013-11-14T05:36:19Z"},{"created_at":"2013-11-14T05:36:18Z","event":"failed!","from":"no_result","id":11779595,"state_column":"result","stateful_id":4269,"stateful_type":"Run","to":"failed","transitioned_at":"2013-11-14T05:36:18Z","updated_at":"2013-11-14T05:36:18Z"},{"created_at":"2013-11-14T05:31:05Z","event":"validate_run!","from":"queued","id":11779400,"state_column":"state","stateful_id":4269,"stateful_type":"Run","to":"validating","transitioned_at":"2013-11-14T05:31:05Z","updated_at":"2013-11-14T05:31:05Z"},{"created_at":"2013-11-14T05:31:05Z","event":"validated!","from":"validating","id":11779399,"state_column":"state","stateful_id":4269,"stateful_type":"Run","to":"in_progress","transitioned_at":"2013-11-14T05:31:05Z","updated_at":"2013-11-14T05:31:05Z"}],"state":"complete","result":"failed","expected_wait_time":5400.0,"browsers":[{"name":"chrome","state":"enabled"},{"name":"firefox","state":"enabled"},{"name":"ie8","state":"enabled"},{"name":"ie9","state":"enabled"},{"name":"safari","state":"enabled"}],"requested_tests":[2285]}]'})
60
+ end
61
+ runs = subject.request('runs', {}, :get)
62
+ expect(runs.count).to eq(3)
63
+ expect(runs[0]['id']).to eq(4337)
64
+ expect(runs[0]['object']).to eq('Run')
65
+ end
66
+
67
+ it "should create a run" do
68
+ payload = {tests: [2286]}
69
+ uri = subject.build_request_uri('runs')
70
+ HTTParty.stub(:post).with(uri, {body: payload.to_json, headers: {"CLIENT_TOKEN" => api_key, "Content-type" => "application/json"}}) do
71
+ OpenStruct.new({:body=> '{"id":4338,"object":"Run","created_at":"2013-11-16T09:03:19Z","environment_id":1235,"test_count":0,"state_log":[],"state":"queued","result":"no_result","expected_wait_time":5400.0,"browsers":[{"name":"chrome","state":"disabled"},{"name":"firefox","state":"disabled"},{"name":"ie8","state":"disabled"},{"name":"ie9","state":"disabled"},{"name":"safari","state":"disabled"}],"requested_tests":[2286]}'})
72
+ end
73
+ runs = subject.request('runs', payload, :post)
74
+ expect(runs['id']).to eq(4338)
75
+ expect(runs['object']).to eq('Run')
76
+ end
77
+
78
+ it "should abort a run" do
79
+ run_id = 4338
80
+ payload = {:run => run_id}
81
+ uri = subject.build_request_uri('runs/4338')
82
+ HTTParty.stub(:delete).with(uri, {body: payload.to_json, headers: {"CLIENT_TOKEN" => api_key, "Content-type" => "application/json"}}) do
83
+ OpenStruct.new({:body=> '{"id":4338,"object":"Run","created_at":"2013-11-16T09:03:19Z","environment_id":1235,"test_count":1,"state_log":[{"created_at":"2013-11-16T09:14:13Z","event":"abort!","from":"in_progress","id":11847319,"state_column":"state","stateful_id":4338,"stateful_type":"Run","to":"aborted","transitioned_at":"2013-11-16T09:14:13Z","updated_at":"2013-11-16T09:14:13Z"},{"created_at":"2013-11-16T09:03:39Z","event":"validate_run!","from":"queued","id":11847142,"state_column":"state","stateful_id":4338,"stateful_type":"Run","to":"validating","transitioned_at":"2013-11-16T09:03:39Z","updated_at":"2013-11-16T09:03:39Z"},{"created_at":"2013-11-16T09:03:39Z","event":"validated!","from":"validating","id":11847141,"state_column":"state","stateful_id":4338,"stateful_type":"Run","to":"in_progress","transitioned_at":"2013-11-16T09:03:39Z","updated_at":"2013-11-16T09:03:39Z"}],"state":"aborted","result":"no_result","expected_wait_time":5400.0,"browsers":[{"name":"chrome","state":"enabled"},{"name":"firefox","state":"enabled"},{"name":"ie8","state":"enabled"},{"name":"ie9","state":"enabled"},{"name":"safari","state":"enabled"}],"requested_tests":[2286]}'})
84
+ end
85
+ runs = subject.request('runs/4338', payload, :delete)
86
+ expect(runs['id']).to eq(4338)
87
+ expect(runs['state']).to eq('aborted')
88
+ expect(runs['state_log'][0]['to']).to eq('aborted')
89
+ end
90
+ end
91
+ end
92
+
93
+ end
@@ -0,0 +1,13 @@
1
+ require "rainforest_client"
2
+
3
+ RSpec.configure do |config|
4
+ config.treat_symbols_as_metadata_keys_with_true_values = true
5
+ config.run_all_when_everything_filtered = true
6
+ config.filter_run :focus
7
+
8
+ # Run specs in random order to surface order dependencies. If you find an
9
+ # order dependency and want to debug it, you can fix the order by providing
10
+ # the seed, which is printed after each run.
11
+ # --seed 1234
12
+ config.order = 'random'
13
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rainforest-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.10
5
+ platform: ruby
6
+ authors:
7
+ - Simon Mathieu
8
+ - Russell Smith
9
+ - kureikain
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-11-16 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: httparty
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - '>='
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: bundler
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: '1.3'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ version: '1.3'
43
+ - !ruby/object:Gem::Dependency
44
+ name: rake
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ description: API Client for RainforestQA
58
+ email:
59
+ - simon@rainforestqa.com
60
+ - russ@rainforestqa.com
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - .gitignore
66
+ - .rspec
67
+ - .ruby-gemset
68
+ - .ruby-version
69
+ - .travis.yml
70
+ - Gemfile
71
+ - README.md
72
+ - Rakefile
73
+ - lib/rainforest/client.rb
74
+ - lib/rainforest/client/version.rb
75
+ - lib/rainforest/resource/base.rb
76
+ - lib/rainforest/resource/runs.rb
77
+ - lib/rainforest_client.rb
78
+ - rainforest-client.gemspec
79
+ - spec/rainforest/client_spec.rb
80
+ - spec/spec_helper.rb
81
+ homepage: https://www.rainforestqa.com/
82
+ licenses:
83
+ - MIT
84
+ metadata: {}
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 2.1.5
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: API Client for RainforestQA
105
+ test_files:
106
+ - spec/rainforest/client_spec.rb
107
+ - spec/spec_helper.rb