trigonal 0.9.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.
@@ -0,0 +1,10 @@
1
+ # in .autotest
2
+ require "autotest/bundler"
3
+
4
+ # filter out VCS files and other garbage to reduce HDD usage
5
+ Autotest.add_hook :initialize do |autotest|
6
+ %w{.git .svn .hg .DS_Store ._* vendor tmp log doc}.each do |exception|
7
+ autotest.add_exception(exception)
8
+ end
9
+ end
10
+
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
19
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in trigonal.gemspec
4
+ gemspec
@@ -0,0 +1,48 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ trigonal (1.0.0)
5
+ httparty (~> 0.10.2)
6
+ multi_json (~> 1.7.1)
7
+ sys-host (~> 0.6.2)
8
+ sys-uname (~> 0.9.1)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ addressable (2.3.3)
14
+ crack (0.3.2)
15
+ diff-lcs (1.2.1)
16
+ ffi (1.6.0)
17
+ httparty (0.10.2)
18
+ multi_json (~> 1.0)
19
+ multi_xml (>= 0.5.2)
20
+ multi_json (1.7.1)
21
+ multi_xml (0.5.3)
22
+ rspec (2.13.0)
23
+ rspec-core (~> 2.13.0)
24
+ rspec-expectations (~> 2.13.0)
25
+ rspec-mocks (~> 2.13.0)
26
+ rspec-core (2.13.1)
27
+ rspec-expectations (2.13.0)
28
+ diff-lcs (>= 1.1.3, < 2.0)
29
+ rspec-mocks (2.13.0)
30
+ simplecov (0.7.1)
31
+ multi_json (~> 1.0)
32
+ simplecov-html (~> 0.7.1)
33
+ simplecov-html (0.7.1)
34
+ sys-host (0.6.2)
35
+ sys-uname (0.9.1)
36
+ ffi (>= 1.0.0)
37
+ webmock (1.11.0)
38
+ addressable (>= 2.2.7)
39
+ crack (>= 0.3.2)
40
+
41
+ PLATFORMS
42
+ ruby
43
+
44
+ DEPENDENCIES
45
+ rspec (= 2.13.0)
46
+ simplecov
47
+ trigonal!
48
+ webmock (= 1.11.0)
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Matthew Nielsen
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,36 @@
1
+ t.app# Trigonal
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'trigonal'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install trigonal
18
+
19
+ ## Usage
20
+
21
+ * Test under rubies MRI 1.8.7 and 1.9.x, JRruby 1.6.x and 1.7.x, rubinus 1.2.x
22
+ * Test under rails 2.3.x, 3.0.x, 3.1.x, 3.2.x and 4.x.x
23
+
24
+ TODO:
25
+
26
+ Write usage instructions here
27
+ VERY FAST timeout on server poll (or thread it!)
28
+ don't post on developent/test mode
29
+
30
+ ## Contributing
31
+
32
+ 1. Fork it
33
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
34
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
35
+ 4. Push to the branch (`git push origin my-new-feature`)
36
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,2 @@
1
+ require "trigonal/errors"
2
+ require "trigonal/trigonal"
@@ -0,0 +1,5 @@
1
+ class Trigonal
2
+ class OptionsError < StandardError; end
3
+ class InvalidCredentialsError < StandardError; end
4
+ class UnknownServerError < StandardError; end
5
+ end
@@ -0,0 +1,116 @@
1
+ require 'rubygems'
2
+ require 'HTTParty'
3
+ require 'multi_json'
4
+ require 'sys/uname'
5
+ require 'sys/host'
6
+
7
+ class Trigonal
8
+ include Sys # for sys/uname and sys.host
9
+
10
+ SERVER_PROTOCOL = 'http'
11
+ SERVER_HOST = 'trigonal.herokuapp.com'
12
+ SERVER_PORT = '80'
13
+ SERVER_PATH = '/api/manifests.json'
14
+
15
+ LIVE_ENVIRONMENTS = %w[stage staging production master]
16
+
17
+ def initialize(options = {}, &block)
18
+ raise OptionsError unless options[:email]
19
+ raise OptionsError unless (options[:password] || options[:key])
20
+
21
+ @email = options[:email]
22
+ @password = options[:password]
23
+ @key = options[:key]
24
+
25
+ yield self if block_given?
26
+
27
+ end
28
+
29
+ def server_url
30
+ "#{SERVER_PROTOCOL}://#{SERVER_HOST}:#{SERVER_PORT}#{SERVER_PATH}"
31
+ end
32
+
33
+ def post_manifest(options = {})
34
+ return unless (live_environment? || options[:force])
35
+ response = HTTParty.post(server_url,
36
+ :body => MultiJson.dump({
37
+ :email => @email,
38
+ :key => @key,
39
+ :password => @password,
40
+ :system => host_system_software,
41
+ :ruby => host_ruby,
42
+ :hostname => get_host_name,
43
+ :name => get_name,
44
+ :appname => get_appname,
45
+ :environment => get_environment,
46
+ :gems => get_gems
47
+ }),
48
+ :headers => { 'Content-Type' => 'application/json' }
49
+ ).response
50
+ case response.code
51
+ when /^2\d+/
52
+ return true
53
+ when "401"
54
+ raise Trigonal::InvalidCredentialsError, "Email address and password or key was not accepted"
55
+ else
56
+ raise Trigonal::UnknownServerError, "Unknown upstream server (code #{response.code}) occured"
57
+ end
58
+ end
59
+
60
+ def host_system_software
61
+ @host_system_software ||= Uname.uname.version
62
+ end
63
+
64
+ def host_ruby
65
+ @host_ruby ||= RUBY_DESCRIPTION
66
+ end
67
+
68
+ def get_host_name
69
+ @host_name ||= Host.hostname
70
+ end
71
+
72
+ def get_appname
73
+ @appname
74
+ end
75
+
76
+ def get_name
77
+ @name
78
+ end
79
+
80
+ def get_environment
81
+ @environment ||= "development"
82
+ end
83
+
84
+ def get_gems
85
+ @gems || get_gems_from_host
86
+ end
87
+
88
+ def get_gems_from_host
89
+ Gem::Specification.map do |specification|
90
+ {
91
+ :name => specification.name,
92
+ :version => specification.version.to_s
93
+ }
94
+ end
95
+ end
96
+
97
+ def live_environment?
98
+ LIVE_ENVIRONMENTS.include?(get_environment)
99
+ end
100
+
101
+ def name(val=nil)
102
+ val ? @name=val : @name
103
+ end
104
+
105
+ def environment(val=nil)
106
+ val ? @environment=val : @environment
107
+ end
108
+
109
+ def appname(val=nil)
110
+ val ? @appname=val : @appname
111
+ end
112
+
113
+ def host_name(val=nil)
114
+ val ? @host_name=val : @host_name
115
+ end
116
+ end
@@ -0,0 +1,281 @@
1
+ require 'spec_helper'
2
+ require 'trigonal/trigonal'
3
+ require 'trigonal/errors'
4
+
5
+ describe Trigonal do
6
+ let (:email) { 'user@email.com' }
7
+ let (:password) { 'password' }
8
+ let (:key) { 'keykeykey' }
9
+ let (:valid_password_params) do
10
+ { :email => email, :password => password }
11
+ end
12
+ let (:valid_key_params) do
13
+ { :email => email, :key => key }
14
+ end
15
+ subject { Trigonal.new(valid_key_params) }
16
+
17
+ describe "#initialize" do
18
+ it "shall accept an options hash with email and password" do
19
+ Trigonal.new(valid_password_params).should be_a_kind_of Trigonal
20
+ end
21
+
22
+ it "shall accept an options hash with email and key" do
23
+ Trigonal.new(valid_key_params).should be_a_kind_of Trigonal
24
+ end
25
+
26
+ it "shall raise an error if email is not passed in options" do
27
+ lambda { Trigonal.new(valid_key_params.merge(:email => nil)) }.should raise_exception(Trigonal::OptionsError)
28
+ end
29
+
30
+ it "shall raise an error if password or key is not passed in options" do
31
+ lambda { Trigonal.new(valid_key_params.merge(:key => nil)) }.should raise_exception(Trigonal::OptionsError)
32
+ end
33
+
34
+ it "shall accept a block" do
35
+ Trigonal.new(valid_password_params) do
36
+ true
37
+ end.should be_a_kind_of Trigonal
38
+ end
39
+
40
+ it "shall allow a 'hostname' to be manually set" do
41
+ example = Trigonal.new(valid_password_params) do |t|
42
+ t.host_name "awesome hostname"
43
+ end
44
+ example.get_host_name.should == "awesome hostname"
45
+ end
46
+
47
+ it "shall allow a 'name' to be manually set" do
48
+ example = Trigonal.new(valid_password_params) do |t|
49
+ t.name "awesome name"
50
+ end
51
+ example.get_name.should == "awesome name"
52
+ end
53
+
54
+ it "shall allow an 'appname' do be manually set" do
55
+ example = Trigonal.new(valid_password_params) do |t|
56
+ t.appname "awesome appname"
57
+ end
58
+ example.get_appname.should == "awesome appname"
59
+ end
60
+
61
+ it "shall allow the 'environment' to be manually set" do
62
+ example = Trigonal.new(valid_password_params) do |t|
63
+ t.environment "awesome environment"
64
+ end
65
+ example.get_environment.should == "awesome environment"
66
+ end
67
+
68
+ end
69
+
70
+ describe '#server_url' do
71
+ it "shall return a composite string of the server url" do
72
+ expect(subject.server_url.should).to eq("#{Trigonal::SERVER_PROTOCOL}://#{Trigonal::SERVER_HOST}:#{Trigonal::SERVER_PORT}#{Trigonal::SERVER_PATH}")
73
+ end
74
+ end
75
+
76
+ describe '#post_manifest' do
77
+ let(:valid_body) do
78
+ MultiJson.dump({
79
+ :email => email,
80
+ :key => key,
81
+ :password => nil,
82
+ :system => 'linux 2.6.0',
83
+ :ruby => 'ruby 1.9.3-p361',
84
+ :hostname => 'some_host',
85
+ :name => 'some name',
86
+ :appname => 'someAppName',
87
+ :environment => Trigonal::LIVE_ENVIRONMENTS.first,
88
+ :gems => [
89
+ { :name => 'foo', :version => '1.2.3' },
90
+ { :name => 'bar', :version => '0.0.1' },
91
+ { :name => 'baz', :version => '0.0.0' }
92
+ ]
93
+ })
94
+ end
95
+ let(:valid_headers) do
96
+ { 'Content-Type' => 'application/json' }
97
+ end
98
+
99
+ before(:each) do
100
+
101
+ subject.stub!(:host_system_software).and_return('linux 2.6.0')
102
+ subject.stub!(:host_ruby).and_return('ruby 1.9.3-p361')
103
+ subject.stub!(:get_host_name).and_return('some_host')
104
+ subject.stub!(:get_name).and_return('some name')
105
+ subject.stub!(:get_appname).and_return('someAppName')
106
+ subject.stub!(:get_environment).and_return('stage')
107
+ subject.stub!(:get_gems_from_host).and_return(
108
+ [
109
+ { :name => 'foo', :version => '1.2.3' },
110
+ { :name => 'bar', :version => '0.0.1' },
111
+ { :name => 'baz', :version => '0.0.0' }
112
+ ]
113
+ )
114
+ end
115
+
116
+ context "credentials are correct" do
117
+ it 'shall post the manifest to the server and get a response' do
118
+ stub_request(:post, subject.server_url).with(
119
+ :body => valid_body, :headers => valid_headers
120
+ )
121
+ subject.post_manifest.should be_true
122
+ end
123
+ end
124
+
125
+ context 'password is not correct' do
126
+ it 'shall raise an InvalidCredentials error' do
127
+ stub_request(:post, subject.server_url).with(
128
+ :body => valid_body, :headers => valid_headers
129
+ ).to_return(:status => [401, "Forbidden"])
130
+
131
+ lambda { subject.post_manifest }.should raise_exception(Trigonal::InvalidCredentialsError)
132
+ end
133
+ end
134
+
135
+ context 'key is not correct' do
136
+ it 'shall raise an InvalidCredentials error' do
137
+ stub_request(:post, subject.server_url).with(
138
+ :body => valid_body, :headers => valid_headers
139
+ ).to_return(:status => [401, "Forbidden"])
140
+
141
+ lambda { subject.post_manifest }.should raise_exception(Trigonal::InvalidCredentialsError)
142
+ end
143
+ end
144
+
145
+ context 'environment is not one of the "live environments"' do
146
+ before(:each) do
147
+ subject.stub!(:get_environment).and_return('development')
148
+ end
149
+ it 'shall return immediately without posting' do
150
+ HTTParty.should_not_receive(:post)
151
+
152
+ subject.post_manifest
153
+ end
154
+
155
+ context '"force" option is passed' do
156
+ it 'shall post' do
157
+ HTTParty.should_receive(:post).and_return(
158
+ mock('httparty', :response => mock('response', :code => "200"))
159
+ )
160
+
161
+ subject.post_manifest(:force => true)
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ describe "#host_system_software" do
168
+ before(:each) do
169
+ class MockUname
170
+ def version
171
+ "Linux Blah 2.6.0"
172
+ end
173
+ end
174
+ class Trigonal::Uname
175
+ def self.uname
176
+ MockUname.new
177
+ end
178
+ end
179
+ end
180
+
181
+ it "shall return the name + version of the software being used on the local system" do
182
+ subject.host_system_software.should == "Linux Blah 2.6.0"
183
+ end
184
+ end
185
+
186
+ describe '#host_ruby' do
187
+ before(:each) do
188
+ RUBY_DESCRIPTION = "ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.2]"
189
+ end
190
+ it 'shall return the current ruby description constant' do
191
+ subject.host_ruby.should == "ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.2]"
192
+ end
193
+ end
194
+
195
+ describe '#get_host_name' do
196
+ before(:each) do
197
+ class Trigonal::Host
198
+ def self.hostname
199
+ 'some.hostname'
200
+ end
201
+ end
202
+ end
203
+ it 'shall return the current system host name' do
204
+ subject.get_host_name.should == 'some.hostname'
205
+ end
206
+ end
207
+
208
+ describe '#get_appname' do
209
+ context 'appname has been set' do
210
+ # this is bad, fix me later
211
+ before(:each) { subject.instance_variable_set(:@appname, 'some appname') }
212
+ it 'shall return the app name' do
213
+ subject.get_appname.should == 'some appname'
214
+ end
215
+ end
216
+ context "appname has not been set" do
217
+ it 'shall return nil' do
218
+ subject.get_appname.should be_nil
219
+ end
220
+ end
221
+ end
222
+
223
+ describe '#get_name' do
224
+ context 'name has been set' do
225
+ # this is bad, fix me later
226
+ before(:each) { subject.instance_variable_set(:@name, 'some name') }
227
+ it 'shall return the name' do
228
+ subject.get_name.should == 'some name'
229
+ end
230
+ end
231
+ context "name has not been set" do
232
+ it 'shall return nil' do
233
+ subject.get_name.should be_nil
234
+ end
235
+ end
236
+ end
237
+
238
+ describe '#get_environment' do
239
+ context 'environment has been set' do
240
+ # this is bad, fix me later
241
+ before(:each) { subject.instance_variable_set(:@environment, 'some environment') }
242
+ it 'shall return the app environment' do
243
+ subject.get_environment.should == 'some environment'
244
+ end
245
+ end
246
+ context "environment has not been set" do
247
+ it 'shall return "development"' do
248
+ subject.get_environment.should == "development"
249
+ end
250
+ end
251
+ end
252
+
253
+ describe "#get_gems" do
254
+ it "shall call #get_gems_from_host" do
255
+ subject.should_receive(:get_gems_from_host)
256
+
257
+ subject.get_gems
258
+ end
259
+ end
260
+
261
+ describe "#get_gems_from_host" do
262
+ let(:mock_gems) do
263
+ mock_gems = []
264
+ 3.times do |i|
265
+ mock_name = "mock_gem_#{i}"
266
+ mock_gems << mock(mock_name, :name => mock_name, :version => "#{i}.#{i}.#{i}")
267
+ end
268
+ mock_gems
269
+ end
270
+ before(:each) do
271
+ Gem::Specification.stub!(:map).and_return(mock_gems.map{|m|{ :name => m.name, :version => m.version }})
272
+ end
273
+ it "shall get a list of gems on the host system" do
274
+
275
+ subject.get_gems_from_host.should == mock_gems.map do |m|
276
+ { :name => m.name, :version => m.version }
277
+ end
278
+
279
+ end
280
+ end
281
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+ require 'trigonal'
3
+
4
+ describe Trigonal do
5
+ end
@@ -0,0 +1,13 @@
1
+ require 'simplecov'
2
+ if ENV["COVERAGE"]
3
+ SimpleCov.start
4
+ end
5
+
6
+ require 'webmock/rspec'
7
+
8
+ RSpec.configure do |config|
9
+ config.treat_symbols_as_metadata_keys_with_true_values = true
10
+ config.run_all_when_everything_filtered = true
11
+ config.order = 'random'
12
+ end
13
+
data/test.rb ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ require './lib/trigonal/errors'
3
+ require './lib/trigonal/trigonal'
4
+
5
+ t = Trigonal.new(:email => 'xunker@pyxidis.org', :password => 'Lenny') do |tt|
6
+ tt.environment 'production'
7
+ end
8
+ t.post_manifest
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.name = "trigonal"
3
+ gem.version = "0.9.0"
4
+ gem.authors = ["Matthew Nielsen"]
5
+ gem.email = ["xunker@pyxidis.org"]
6
+ gem.description = %q{Trigonal reports all the ruby gems in your app to a central server}
7
+ gem.summary = %q{Trigonal reports all the ruby gems in your app to a central server}
8
+ gem.homepage = "https://github.com/xunker/trigonal"
9
+
10
+ gem.files = `git ls-files`.split($/)
11
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
12
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
+ gem.require_paths = ["lib"]
14
+
15
+ gem.add_dependency 'httparty', '~>0.10.2'
16
+ gem.add_dependency 'multi_json', '~>1.7.1'
17
+ gem.add_dependency 'sys-uname', '~>0.9.1'
18
+ gem.add_dependency 'sys-host', '~>0.6.2'
19
+
20
+ gem.add_development_dependency 'rspec', '2.13.0'
21
+ # gem.add_development_dependency 'ZenTest', '4.4.2'
22
+ # gem.add_development_dependency 'autotest', '4.4.6'
23
+ gem.add_development_dependency 'webmock', '1.11.0'
24
+ gem.add_development_dependency 'simplecov'
25
+ end
metadata ADDED
@@ -0,0 +1,176 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trigonal
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matthew Nielsen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: httparty
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.10.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.10.2
30
+ - !ruby/object:Gem::Dependency
31
+ name: multi_json
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.7.1
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.7.1
46
+ - !ruby/object:Gem::Dependency
47
+ name: sys-uname
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.9.1
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.1
62
+ - !ruby/object:Gem::Dependency
63
+ name: sys-host
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.6.2
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.6.2
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - '='
84
+ - !ruby/object:Gem::Version
85
+ version: 2.13.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '='
92
+ - !ruby/object:Gem::Version
93
+ version: 2.13.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: webmock
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - '='
100
+ - !ruby/object:Gem::Version
101
+ version: 1.11.0
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - '='
108
+ - !ruby/object:Gem::Version
109
+ version: 1.11.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: simplecov
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: Trigonal reports all the ruby gems in your app to a central server
127
+ email:
128
+ - xunker@pyxidis.org
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - .autotest
134
+ - .gitignore
135
+ - .rspec
136
+ - Gemfile
137
+ - Gemfile.lock
138
+ - LICENSE.txt
139
+ - README.md
140
+ - Rakefile
141
+ - lib/trigonal.rb
142
+ - lib/trigonal/errors.rb
143
+ - lib/trigonal/trigonal.rb
144
+ - spec/lib/trigonal/trigonal_spec.rb
145
+ - spec/lib/trigonal_spec.rb
146
+ - spec/spec_helper.rb
147
+ - test.rb
148
+ - trigonal.gemspec
149
+ homepage: https://github.com/xunker/trigonal
150
+ licenses: []
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ none: false
157
+ requirements:
158
+ - - ! '>='
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ required_rubygems_version: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project:
169
+ rubygems_version: 1.8.24
170
+ signing_key:
171
+ specification_version: 3
172
+ summary: Trigonal reports all the ruby gems in your app to a central server
173
+ test_files:
174
+ - spec/lib/trigonal/trigonal_spec.rb
175
+ - spec/lib/trigonal_spec.rb
176
+ - spec/spec_helper.rb