trigonal 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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