tddium_client 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
4
+ nbproject
5
+ .DS_Store
data/.rvmrc ADDED
@@ -0,0 +1,2 @@
1
+ rvm use ruby-1.8.7-p302@tddium_client
2
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in tddium_client.gemspec
4
+ gemspec
data/README ADDED
File without changes
@@ -0,0 +1,4 @@
1
+ # Copyright (c) 2011 Solano Labs All Rights Reserved
2
+
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,21 @@
1
+ # Copyright (c) 2011 Solano Labs All Rights Reserved
2
+
3
+ development:
4
+ api:
5
+ scheme: http
6
+ host: localhost
7
+ port: 3000
8
+ version: 1
9
+
10
+ production:
11
+ api:
12
+ scheme: https
13
+ host: api.tddium.com
14
+ version: 1
15
+
16
+ test:
17
+ api:
18
+ scheme: http
19
+ host: localhost
20
+ port: 3000
21
+ version: 1
@@ -0,0 +1,70 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ require 'rubygems'
6
+ require 'httparty'
7
+ require 'json'
8
+
9
+ class TddiumClient
10
+ API_KEY_HEADER = "X-tddium-api-key"
11
+ API_ERROR_TEXT = "An error occured: "
12
+
13
+ attr_accessor :environment
14
+
15
+ def initialize(env = :development)
16
+ self.environment = env
17
+ end
18
+
19
+ def call_api(method, api_path, params = {}, api_key = nil, retries = 5, &block)
20
+ headers = { API_KEY_HEADER => api_key } if api_key
21
+
22
+ done = false
23
+ tries = 0
24
+ while (retries < 0 || tries <= retries) && !done
25
+ begin
26
+ http = HTTParty.send(method, tddium_uri(api_path), :body => params, :headers => headers)
27
+ done = true
28
+ rescue Timeout::Error
29
+ ensure
30
+ tries += 1
31
+ end
32
+ end
33
+
34
+ raise Timeout::Error if tries > retries
35
+
36
+ response = JSON.parse(http.body) rescue {}
37
+
38
+ if http.success?
39
+ if response["status"] == 0
40
+ yield response
41
+ else
42
+ message = API_ERROR_TEXT + response["explanation"].to_s
43
+ end
44
+ else
45
+ message = API_ERROR_TEXT + http.response.header.msg.to_s
46
+ message << " #{response["explanation"]}" if response["status"].to_i > 0
47
+ end
48
+ [response["status"] || http.code, message]
49
+ end
50
+
51
+ private
52
+
53
+ def tddium_uri(path)
54
+ uri = URI.parse("")
55
+ uri.host = tddium_config["api"]["host"]
56
+ uri.port = tddium_config["api"]["port"]
57
+ uri.scheme = tddium_config["api"]["scheme"]
58
+ URI.join(uri.to_s, "#{tddium_config["api"]["version"]}/#{path}").to_s
59
+ end
60
+
61
+ def tddium_config
62
+ unless @tddium_config
63
+ @tddium_config = YAML.load(
64
+ File.read(File.join(File.dirname(__FILE__), "..", "config", "environment.yml"))
65
+ )[environment.to_s]
66
+ end
67
+ @tddium_config
68
+ end
69
+ end
70
+
@@ -0,0 +1,57 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ require 'httparty'
6
+ require 'fakeweb'
7
+
8
+ FakeWeb.allow_net_connect = false
9
+
10
+ module TddiumSpecHelpers
11
+
12
+ private
13
+
14
+ def register_uri_options(options = {})
15
+ if options.is_a?(Array)
16
+ options_array = []
17
+ options.each do |sub_options|
18
+ options_array << register_uri_options(sub_options)
19
+ end
20
+ options_array
21
+ else
22
+ options_for_fake_web = {:body => options[:body], :status => options[:status]}
23
+ if options[:response]
24
+ FakeFS.deactivate!
25
+ response = File.open(options[:response]) { |f| f.read }
26
+ FakeFS.activate!
27
+ options_for_fake_web.merge!(:response => response)
28
+ end
29
+ options_for_fake_web
30
+ end
31
+ end
32
+
33
+ def create_file(path, content = "blah")
34
+ FileUtils.mkdir_p(File.dirname(path))
35
+ File.open(path, 'w') do |f|
36
+ f.write(content)
37
+ end
38
+ end
39
+
40
+ def api_uri(path)
41
+ uri = URI.parse("")
42
+ uri.host = tddium_client_config["api"]["host"]
43
+ uri.scheme = tddium_client_config["api"]["scheme"]
44
+ uri.port = tddium_client_config["api"]["port"]
45
+ URI.join(uri.to_s, "#{tddium_client_config["api"]["version"]}/#{path}").to_s
46
+ end
47
+
48
+ def tddium_client_config(raw = false, environment = "test")
49
+ unless @tddium_config
50
+ FakeFS.deactivate!
51
+
52
+ @tddium_config = File.read(File.join(File.dirname(__FILE__), "..", "..", "config", "environment.yml"))
53
+ FakeFS.activate!
54
+ end
55
+ raw ? @tddium_config : YAML.load(@tddium_config)[environment]
56
+ end
57
+ end
@@ -0,0 +1,7 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ module TddiumClient
6
+ VERSION = "0.0.1"
7
+ end
@@ -0,0 +1,13 @@
1
+ HTTP/1.1 201 Created
2
+ Date: Thu, 03 Mar 2011 10:25:28 GMT
3
+ Server: Apache
4
+ X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.3
5
+ Cache-Control: no-cache
6
+ X-UA-Compatible: IE=Edge
7
+ X-Runtime: 0.096863
8
+ Set-Cookie: _tddium_site_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRiIlYjk0YTMzNmZmNzQ1NTI1NDk5YmE2NTc4Y2IxNTYxNGU%3D--d841305e17bd1b770b2b99ae74a03bc7aa5eddd5; path=/; HttpOnly
9
+ Status: 201
10
+ Transfer-Encoding: chunked
11
+ Content-Type: application/json; charset=utf-8
12
+
13
+ {"suite":{"created_at":"2011-03-03T10:25:28Z","id":19,"ruby_version":"1.9.2","ssh_key":"ssh-rsa blah","suite_name":"tddium/demo","test_pattern":"**/*_spec.rb","updated_at":"2011-03-03T10:25:28Z","user_id":null},"status":0}
@@ -0,0 +1,13 @@
1
+ HTTP/1.1 269 Duplicated
2
+ Date: Thu, 03 Mar 2011 10:00:32 GMT
3
+ Server: Apache
4
+ X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.3
5
+ Cache-Control: no-cache
6
+ X-UA-Compatible: IE=Edge
7
+ X-Runtime: 0.045332
8
+ Set-Cookie: _tddium_site_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRiIlOGZiMTgxZjM0ZGIwMmJlMzI2ZWQwMmFkYzUwZGEzZDU%3D--287be8a7de3c8535fc4d958d2fc036110e64e5b6; path=/; HttpOnly
9
+ Status: 269
10
+ Transfer-Encoding: chunked
11
+ Content-Type: application/json; charset=utf-8
12
+
13
+ {"status":1,"explanation":"{:suite_name=>[\"has already been taken\"]}"}
@@ -0,0 +1,13 @@
1
+ HTTP/1.1 409 Conflict
2
+ Date: Thu, 03 Mar 2011 10:00:32 GMT
3
+ Server: Apache
4
+ X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.3
5
+ Cache-Control: no-cache
6
+ X-UA-Compatible: IE=Edge
7
+ X-Runtime: 0.045332
8
+ Set-Cookie: _tddium_site_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRiIlOGZiMTgxZjM0ZGIwMmJlMzI2ZWQwMmFkYzUwZGEzZDU%3D--287be8a7de3c8535fc4d958d2fc036110e64e5b6; path=/; HttpOnly
9
+ Status: 409
10
+ Transfer-Encoding: chunked
11
+ Content-Type: application/json; charset=utf-8
12
+
13
+ {"status":1,"explanation":"{:suite_name=>[\"has already been taken\"]}"}
@@ -0,0 +1,15 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ require "tddium_client"
6
+ require "fakeweb"
7
+ require "rack/test"
8
+ require "fakefs/spec_helpers"
9
+ require "tddium_client/tddium_spec_helpers"
10
+
11
+ FakeWeb.allow_net_connect = false
12
+
13
+ def fixture_path(fixture_name)
14
+ File.join File.dirname(__FILE__), "fixtures", fixture_name
15
+ end
@@ -0,0 +1,181 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ require "spec_helper"
6
+
7
+ describe TddiumClient do
8
+ include FakeFS::SpecHelpers
9
+ include TddiumSpecHelpers
10
+
11
+ EXAMPLE_HTTP_METHOD = :post
12
+ EXAMPLE_TDDIUM_RESOURCE = "suites"
13
+ EXAMPLE_PARAMS = {"key" => "value"}
14
+ EXAMPLE_API_KEY = "afb12412bdafe124124asfasfabebafeabwbawf1312342erbfasbb"
15
+
16
+ def stub_tddium_client_config
17
+ create_file(File.join("config", "environment.yml"), tddium_client_config(true))
18
+ end
19
+
20
+ def stub_http_response(method, path, options = {})
21
+ uri = api_uri(path)
22
+ FakeWeb.register_uri(method, uri, register_uri_options(options))
23
+ end
24
+
25
+ def parse_request_params
26
+ Rack::Utils.parse_nested_query(FakeWeb.last_request.body)
27
+ end
28
+
29
+ let(:tddium_client) { TddiumClient.new }
30
+
31
+ it "should set the default environment to :development" do
32
+ tddium_client.environment.should == :development
33
+ end
34
+
35
+ describe "#environment" do
36
+ it "should set the environment" do
37
+ tddium_client.environment = :production
38
+ tddium_client.environment.should == :production
39
+ end
40
+ end
41
+
42
+ describe "#call_api" do
43
+ before do
44
+ FakeWeb.clean_registry
45
+ stub_tddium_client_config
46
+ stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)
47
+ end
48
+
49
+ context "('#{EXAMPLE_HTTP_METHOD}', '#{EXAMPLE_TDDIUM_RESOURCE}')" do
50
+ it "should make a '#{EXAMPLE_HTTP_METHOD.to_s.upcase}' request to the api" do
51
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)
52
+ FakeWeb.last_request.method.downcase.to_sym.should == EXAMPLE_HTTP_METHOD
53
+ end
54
+
55
+ it "should make a request to the correct resource" do
56
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)
57
+ FakeWeb.last_request.path.should =~ /#{EXAMPLE_TDDIUM_RESOURCE}$/
58
+ end
59
+ end
60
+
61
+ context "raises an error" do
62
+ before do
63
+ HTTParty.stub(EXAMPLE_HTTP_METHOD).and_raise(Timeout::Error)
64
+ end
65
+
66
+ it "should retry 5 times by default to contact the API" do
67
+ HTTParty.should_receive(EXAMPLE_HTTP_METHOD).exactly(6).times
68
+ expect { tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE) }.to raise_error(Timeout::Error)
69
+ end
70
+
71
+ it "should retry as many times as we want to contact the API" do
72
+ HTTParty.should_receive(EXAMPLE_HTTP_METHOD).exactly(3).times
73
+ expect { tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {}, nil, 2) }.to raise_error(Timeout::Error)
74
+ end
75
+ end
76
+
77
+ context "('#{EXAMPLE_HTTP_METHOD}', '#{EXAMPLE_TDDIUM_RESOURCE}', {}, #{EXAMPLE_API_KEY}) # with api_key" do
78
+ it "should include #{TddiumClient::API_KEY_HEADER}=#{EXAMPLE_API_KEY} in the request headers" do
79
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {}, EXAMPLE_API_KEY)
80
+ FakeWeb.last_request[TddiumClient::API_KEY_HEADER].should == EXAMPLE_API_KEY
81
+ end
82
+ end
83
+
84
+ context "('#{EXAMPLE_HTTP_METHOD}', '#{EXAMPLE_TDDIUM_RESOURCE}') # without api_key" do
85
+ it "should not include #{TddiumClient::API_KEY_HEADER} in the request headers" do
86
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {})
87
+ FakeWeb.last_request[TddiumClient::API_KEY_HEADER].should be_nil
88
+ end
89
+ end
90
+
91
+ context "('#{EXAMPLE_HTTP_METHOD}', '#{EXAMPLE_TDDIUM_RESOURCE}', #{EXAMPLE_PARAMS}) # with params" do
92
+ it "should include #{EXAMPLE_PARAMS} in the request params" do
93
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, EXAMPLE_PARAMS)
94
+ parse_request_params.should include(EXAMPLE_PARAMS)
95
+ end
96
+ end
97
+
98
+ context "('#{EXAMPLE_HTTP_METHOD}', '#{EXAMPLE_TDDIUM_RESOURCE}') # without params" do
99
+ it "should not include any request params" do
100
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)
101
+ parse_request_params.should == {}
102
+ end
103
+ end
104
+
105
+ context "results in a successful response" do
106
+ let(:dummy_block) { Proc.new { |response| @parsed_http_response = response } }
107
+ before do
108
+ stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, :response => fixture_path("post_suites_201.json"))
109
+ end
110
+
111
+ it "should try to contact the api only once" do
112
+ HTTParty.should_receive(EXAMPLE_HTTP_METHOD).exactly(1).times.and_return(mock(HTTParty).as_null_object)
113
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {}, nil, &dummy_block)
114
+ end
115
+
116
+ it "should parse the JSON response" do
117
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {}, nil, &dummy_block)
118
+ @parsed_http_response.should be_a(Hash)
119
+ @parsed_http_response["status"].should == 0
120
+ @parsed_http_response["suite"]["id"].should == 19
121
+ end
122
+
123
+ it "should return a tuple with element[0]==status and element[1]==nil" do
124
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {}, nil, &dummy_block).should == [0, nil]
125
+ end
126
+ end
127
+
128
+ context "results in an unsuccessful response" do
129
+ before { stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, :status => ["404", "Not Found"]) }
130
+
131
+ shared_examples_for "returning that an error occured" do
132
+ it "should return that an error occured in the second element" do
133
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[1].should =~ /^#{TddiumClient::API_ERROR_TEXT}/
134
+ end
135
+ end
136
+
137
+ shared_examples_for("returning the API error") do
138
+ it "should return the API error in the second element" do
139
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[1].should =~ /\{\:suite_name\=\>\[\"has already been taken\"\]\}$/
140
+ end
141
+ end
142
+
143
+ it "should return an array with two elements" do
144
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE).size.should == 2
145
+ end
146
+
147
+ context "where the http request was successful but API status is not 0" do
148
+ before { stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, :response => fixture_path("post_suites_201_json_status_1.json")) }
149
+ it_should_behave_like("returning that an error occured")
150
+ it_should_behave_like("returning the API error")
151
+
152
+ it "should return the API error code in the first element" do
153
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[0].should == 1
154
+ end
155
+ end
156
+
157
+ context "where the http request was unsuccessful" do
158
+ before { stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, :status => ["501", "Internal Server Error"]) }
159
+ it_should_behave_like("returning that an error occured")
160
+
161
+ it "should return the HTTP error message in the second element" do
162
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[1].should =~ /Internal Server Error/
163
+ end
164
+
165
+ context "and an API error is returned" do
166
+ before { stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, :response => fixture_path("post_suites_409.json")) }
167
+ it_should_behave_like("returning the API error")
168
+ it "should return the HTTP error code in the first element" do
169
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[0].should == 1
170
+ end
171
+ end
172
+
173
+ context "and no API error is returned" do
174
+ it "should return the HTTP error code in the first element" do
175
+ tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[0].should == 501
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,33 @@
1
+ =begin
2
+ Copyright (c) 2011 Solano Labs All Rights Reserved
3
+ =end
4
+
5
+ # -*- encoding: utf-8 -*-
6
+ $:.push File.expand_path("../lib", __FILE__)
7
+ require "tddium_client/version"
8
+
9
+ Gem::Specification.new do |s|
10
+ s.name = "tddium_client"
11
+ s.version = TddiumClient::VERSION
12
+ s.platform = Gem::Platform::RUBY
13
+ s.authors = ["Jay Moorthi"]
14
+ s.email = ["info@tddium.com"]
15
+ s.homepage = "http://www.tddium.com/"
16
+ s.summary = %q{tddium Client Gem}
17
+ s.description = %q{Internal Gem used to call the Tddium API}
18
+
19
+ s.rubyforge_project = "tddium_client"
20
+
21
+ s.files = `git ls-files`.split("\n")
22
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
23
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
24
+ s.require_paths = ["lib"]
25
+
26
+ s.add_runtime_dependency("httparty")
27
+ s.add_runtime_dependency("json")
28
+
29
+ s.add_development_dependency("rspec")
30
+ s.add_development_dependency("fakeweb")
31
+ s.add_development_dependency("fakefs")
32
+ s.add_development_dependency("rack-test")
33
+ end
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tddium_client
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Jay Moorthi
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-03-15 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: httparty
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: json
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: rspec
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :development
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: fakeweb
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ type: :development
76
+ version_requirements: *id004
77
+ - !ruby/object:Gem::Dependency
78
+ name: fakefs
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ type: :development
90
+ version_requirements: *id005
91
+ - !ruby/object:Gem::Dependency
92
+ name: rack-test
93
+ prerelease: false
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ type: :development
104
+ version_requirements: *id006
105
+ description: Internal Gem used to call the Tddium API
106
+ email:
107
+ - info@tddium.com
108
+ executables: []
109
+
110
+ extensions: []
111
+
112
+ extra_rdoc_files: []
113
+
114
+ files:
115
+ - .gitignore
116
+ - .rvmrc
117
+ - Gemfile
118
+ - README
119
+ - Rakefile
120
+ - config/environment.yml
121
+ - lib/tddium_client.rb
122
+ - lib/tddium_client/tddium_spec_helpers.rb
123
+ - lib/tddium_client/version.rb
124
+ - spec/fixtures/post_suites_201.json
125
+ - spec/fixtures/post_suites_201_json_status_1.json
126
+ - spec/fixtures/post_suites_409.json
127
+ - spec/spec_helper.rb
128
+ - spec/tddium_client_spec.rb
129
+ - tddium_client.gemspec
130
+ has_rdoc: true
131
+ homepage: http://www.tddium.com/
132
+ licenses: []
133
+
134
+ post_install_message:
135
+ rdoc_options: []
136
+
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ hash: 3
145
+ segments:
146
+ - 0
147
+ version: "0"
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ hash: 3
154
+ segments:
155
+ - 0
156
+ version: "0"
157
+ requirements: []
158
+
159
+ rubyforge_project: tddium_client
160
+ rubygems_version: 1.3.7
161
+ signing_key:
162
+ specification_version: 3
163
+ summary: tddium Client Gem
164
+ test_files:
165
+ - spec/fixtures/post_suites_201.json
166
+ - spec/fixtures/post_suites_201_json_status_1.json
167
+ - spec/fixtures/post_suites_409.json
168
+ - spec/spec_helper.rb
169
+ - spec/tddium_client_spec.rb