ecircle 0.1.3 → 0.1.4

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.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ecircle (0.1.3)
4
+ ecircle (0.1.4)
5
5
  activesupport
6
6
  i18n
7
7
  rake
@@ -10,7 +10,7 @@ PATH
10
10
  GEM
11
11
  remote: http://rubygems.org/
12
12
  specs:
13
- activesupport (3.1.1)
13
+ activesupport (3.1.3)
14
14
  multi_json (~> 1.0)
15
15
  akami (1.0.0)
16
16
  gyoku (>= 0.4.0)
@@ -25,6 +25,9 @@ GEM
25
25
  i18n (0.6.0)
26
26
  linecache19 (0.5.12)
27
27
  ruby_core_source (>= 0.1.4)
28
+ metaclass (0.0.1)
29
+ mocha (0.10.0)
30
+ metaclass (~> 0.0.1)
28
31
  multi_json (1.0.3)
29
32
  nokogiri (1.5.0)
30
33
  nori (1.0.2)
@@ -57,6 +60,10 @@ GEM
57
60
  nokogiri (>= 1.4.0)
58
61
  nori (~> 1.0)
59
62
  wasabi (~> 2.0)
63
+ savon_spec (0.1.6)
64
+ mocha (>= 0.9.8)
65
+ rspec (>= 2.0.0)
66
+ savon (>= 0.8.0)
60
67
  wasabi (2.0.0)
61
68
  nokogiri (>= 1.4.0)
62
69
  yard (0.7.3)
@@ -69,4 +76,5 @@ DEPENDENCIES
69
76
  random_data (= 1.5.2)
70
77
  rspec (= 2.6.0)
71
78
  ruby-debug19
79
+ savon_spec (~> 0.1.6)
72
80
  yard
@@ -24,6 +24,7 @@ Gem::Specification.new do |s|
24
24
  s.add_dependency 'savon', '>=0.9.7'
25
25
  s.add_development_dependency 'random_data', '1.5.2'
26
26
  s.add_development_dependency 'rspec', '2.6.0'
27
+ s.add_development_dependency 'savon_spec', '~> 0.1.6'
27
28
  s.add_development_dependency 'yard'
28
29
  s.add_development_dependency 'ruby-debug19'
29
30
  end
@@ -11,39 +11,9 @@ module Ecircle
11
11
  !!!
12
12
  doc
13
13
 
14
-
15
- #@private
16
- def ensuring_logon &block
17
- begin
18
- @auth_token ||= logon
19
- rescue Savon::SOAP::Fault => e
20
- # If we are here this means that our login credentials are wrong.
21
- wrapped_response = WrappedResponse.new(e)
22
- if wrapped_response.not_authenticated? || wrapped_response.permission_problem?
23
- puts @@help
24
- raise InvalidLoginCredentials
25
- else
26
- raise
27
- end
28
- end
29
-
30
- first_try = true
31
- # -> In case the session token has expired (which means 'not_authenticated') retry once.
32
- # -> In case we can't get a token on second there's nothing we can do, so give up.
33
- # -> In all other cases (regardless if success? is true or false) return the response.
34
- loop do
35
- wrapped_response = block.call
36
- if first_try && wrapped_response.not_authenticated?
37
- first_try = false
38
- @auth_token = logon
39
- elsif wrapped_response.not_authenticated?
40
- puts "!!! Could not re-authenticate after session expired: #{wrapped_response.inspect} !!!"
41
- raise
42
- else
43
- return wrapped_response
44
- end
45
- end
46
- end
14
+ # According to http://developer.ecircle-ag.com/apiwiki/wiki/SynchronousSoapAPI#section-SynchronousSoapAPI-SampleProtocolExcerpt,
15
+ # a session expires after 10 minutes (600 seconds) of idleness. We give ourselves a 30-second margin.
16
+ AUTH_TOKEN_TIMEOUT = 570
47
17
 
48
18
  # @private
49
19
  def client
@@ -62,24 +32,19 @@ module Ecircle
62
32
  # @param [Boolean] send_message send a message by ecircle
63
33
  # @return [WrappedResponse]
64
34
  def create_member user_id, group_id, invite = false, send_message = false
65
- ensuring_logon do
66
- begin
67
- @response = client.request :createMember do
68
- soap.body = {
69
- :session => auth_token,
70
- :userId => user_id,
71
- :groupId => group_id,
72
- :invite => invite.to_s,
73
- :sendMessage => send_message.to_s
74
- }
75
- end
76
- rescue Savon::SOAP::Fault => e
77
- WrappedResponse.new(e)
78
- else
79
- WrappedResponse.new :success => true,
80
- :ecircle_id => @response.body[:create_member_response][:create_member_return].to_s
81
- end
35
+ response = client.request :createMember do
36
+ soap.body = {
37
+ :session => obtain_auth_token,
38
+ :userId => user_id,
39
+ :groupId => group_id,
40
+ :invite => invite.to_s,
41
+ :sendMessage => send_message.to_s
42
+ }
82
43
  end
44
+ WrappedResponse.new :success => true,
45
+ :ecircle_id => response.body[:create_member_response][:create_member_return].to_s
46
+ rescue Savon::SOAP::Fault => e
47
+ WrappedResponse.new(e)
83
48
  end
84
49
 
85
50
  # Create or update group
@@ -89,21 +54,16 @@ module Ecircle
89
54
  # @return [WrappedResponse]
90
55
  # Important note: `email` must be unique across all groups AND must be a subdomain of the system you registered at ecircle.
91
56
  def create_or_update_group group_attributes
92
- ensuring_logon do
93
- begin
94
- @response = client.request :createOrUpdateGroup do
95
- soap.body = {
96
- :session => auth_token,
97
- :groupXml => Helper.build_group_xml(group_attributes)
98
- }
99
- end
100
- rescue Savon::SOAP::Fault => e
101
- WrappedResponse.new(e)
102
- else
103
- WrappedResponse.new :success => true,
104
- :ecircle_id => @response[:create_or_update_group_response][:create_or_update_group_return].to_i
105
- end
57
+ response = client.request :createOrUpdateGroup do
58
+ soap.body = {
59
+ :session => obtain_auth_token,
60
+ :groupXml => Helper.build_group_xml(group_attributes)
61
+ }
106
62
  end
63
+ WrappedResponse.new :success => true,
64
+ :ecircle_id => response[:create_or_update_group_response][:create_or_update_group_return].to_i
65
+ rescue Savon::SOAP::Fault => e
66
+ WrappedResponse.new(e)
107
67
  end
108
68
 
109
69
  # Create or update user by email
@@ -112,22 +72,17 @@ module Ecircle
112
72
  # @param [Hash] user_xml, in it's most simple form a { :email => 'test@test.com' } is sufficient
113
73
  # @return [Integer] the user id
114
74
  def create_or_update_user_by_email user_attributes
115
- ensuring_logon do
116
- begin
117
- @response = client.request :createOrUpdateUserByEmail do
118
- soap.body = {
119
- :session => auth_token, # TODO We can't use @auth_token here cause then the session_id is nil. Why?
120
- :userXml => Helper.build_user_xml(user_attributes),
121
- :sendMessage => 0
122
- }
123
- end
124
- rescue Savon::SOAP::Fault => e
125
- WrappedResponse.new(e)
126
- else
127
- WrappedResponse.new :success => true,
128
- :ecircle_id => @response.body[:create_or_update_user_by_email_response][:create_or_update_user_by_email_return].to_i
129
- end
75
+ response = client.request :createOrUpdateUserByEmail do
76
+ soap.body = {
77
+ :session => obtain_auth_token,
78
+ :userXml => Helper.build_user_xml(user_attributes),
79
+ :sendMessage => 0
80
+ }
130
81
  end
82
+ WrappedResponse.new :success => true,
83
+ :ecircle_id => response.body[:create_or_update_user_by_email_response][:create_or_update_user_by_email_return].to_i
84
+ rescue Savon::SOAP::Fault => e
85
+ WrappedResponse.new(e)
131
86
  end
132
87
 
133
88
  # Delete a member.
@@ -135,20 +90,15 @@ module Ecircle
135
90
  # @param [Integer] group_id ecircle group id
136
91
  # @return [WrappedResponse]
137
92
  def delete_group group_id
138
- ensuring_logon do
139
- begin
140
- @response = client.request :deleteGroup do
141
- soap.body = {
142
- :session => auth_token,
143
- :memberId => group_id
144
- }
145
- end
146
- rescue Savon::SOAP::Fault => e
147
- WrappedResponse.new(e)
148
- else
149
- WrappedResponse.new(:success => true)
150
- end
93
+ response = client.request :deleteGroup do
94
+ soap.body = {
95
+ :session => obtain_auth_token,
96
+ :memberId => group_id
97
+ }
151
98
  end
99
+ WrappedResponse.new(:success => true)
100
+ rescue Savon::SOAP::Fault => e
101
+ WrappedResponse.new(e)
152
102
  end
153
103
 
154
104
  # Delete a member.
@@ -156,34 +106,37 @@ module Ecircle
156
106
  # @param [Integer] member_id ecircle member id
157
107
  # @return [WrappedResponse]
158
108
  def delete_member member_id
159
- ensuring_logon do
160
- begin
161
- @response = client.request :deleteMember do
162
- soap.body = {
163
- :session => auth_token,
164
- :memberId => member_id
165
- }
166
- end
167
- rescue Savon::SOAP::Fault => e
168
- WrappedResponse.new(e)
169
- else
170
- WrappedResponse.new(:success => true)
171
- end
109
+ client.request :deleteMember do
110
+ soap.body = {
111
+ :session => obtain_auth_token,
112
+ :memberId => member_id
113
+ }
172
114
  end
115
+ WrappedResponse.new(:success => true)
116
+ rescue Savon::SOAP::Fault => e
117
+ WrappedResponse.new(e)
173
118
  end
174
119
 
175
120
  # Logon. You don't need to call this explicitly but it's useful for debugging.
176
121
  #
177
122
  # @return [String] the session id
178
123
  def logon
179
- @response = client.request :logon do
124
+ response = client.request :logon do
180
125
  soap.body = {
181
126
  :user => Ecircle.configuration.user,
182
127
  :realm => Ecircle.configuration.sync_realm,
183
128
  :passwd => Ecircle.configuration.password
184
129
  }
185
130
  end
186
- @response.body[:logon_response][:logon_return].to_s
131
+ response.body[:logon_response][:logon_return].to_s
132
+ rescue Savon::SOAP::Fault => e
133
+ wrapped_response = WrappedResponse.new(e)
134
+ if wrapped_response.not_authenticated? || wrapped_response.permission_problem?
135
+ puts @@help
136
+ raise InvalidLoginCredentials
137
+ else
138
+ raise
139
+ end
187
140
  end
188
141
 
189
142
  # Log out. Uses the last session token.
@@ -206,23 +159,28 @@ module Ecircle
206
159
  # @param [Array] the values of the variables you want to interpolate in the template
207
160
  # @return [WrappedResponse]
208
161
  def send_parametrized_single_message_to_user user_id, message_id, names = [], values = []
209
- ensuring_logon do
210
- begin
211
- client.request :sendParametrizedSingleMessageToUser do
212
- soap.body = {
213
- :session => auth_token,
214
- :singleMessageId => message_id,
215
- :userId => user_id,
216
- :names => names,
217
- :values => values
218
- }
219
- end
220
- rescue Savon::SOAP::Fault => e
221
- WrappedResponse.new(e)
222
- else
223
- WrappedResponse.new(:success => true)
224
- end
162
+ client.request :sendParametrizedSingleMessageToUser do
163
+ soap.body = {
164
+ :session => obtain_auth_token,
165
+ :singleMessageId => message_id,
166
+ :userId => user_id,
167
+ :names => names,
168
+ :values => values
169
+ }
225
170
  end
171
+ WrappedResponse.new(:success => true)
172
+ rescue Savon::SOAP::Fault => e
173
+ WrappedResponse.new(e)
174
+ end
175
+
176
+ def obtain_auth_token
177
+ @auth_token = logon unless auth_token_valid?
178
+ @auth_token_last_used_at = Time.now
179
+ @auth_token
180
+ end
181
+
182
+ def auth_token_valid?
183
+ @auth_token_last_used_at && Time.now - @auth_token_last_used_at < AUTH_TOKEN_TIMEOUT
226
184
  end
227
185
  end
228
186
  end
@@ -1,3 +1,3 @@
1
1
  module Ecircle
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.4'
3
3
  end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ecircle::Api do
4
+ describe 'obtain_auth_token' do
5
+ it 'should obtain an auth token for the first time' do
6
+ savon.expects(:logon).returns(:success)
7
+ subject.obtain_auth_token
8
+ end
9
+
10
+ it 'should touch auth_token_last_used_at' do
11
+ savon.expects(:logon).returns(:success)
12
+ before_call = Time.now
13
+ subject.obtain_auth_token
14
+
15
+ auth_token_last_used_at = subject.instance_variable_get('@auth_token_last_used_at')
16
+ before_call.should <= auth_token_last_used_at
17
+ auth_token_last_used_at.should <= Time.now
18
+ end
19
+
20
+ it 'should return the token' do
21
+ savon.expects(:logon).returns(:success)
22
+ subject.obtain_auth_token.should eq('foo')
23
+ end
24
+
25
+ describe 'subsequent calls' do
26
+ before do
27
+ savon.expects(:logon).returns(:success)
28
+ @auth_token = subject.obtain_auth_token
29
+ end
30
+
31
+ it 'should re-use auth token' do
32
+ savon.expects(:logon).never
33
+ subject.obtain_auth_token.should eq(@auth_token)
34
+ end
35
+
36
+ it 'should touch auth_token_last_used_at' do
37
+ before_call = Time.now
38
+ subject.obtain_auth_token
39
+
40
+ auth_token_last_used_at = subject.instance_variable_get('@auth_token_last_used_at')
41
+ before_call.should <= auth_token_last_used_at
42
+ auth_token_last_used_at.should <= Time.now
43
+ end
44
+
45
+ it 'should request another auth token if current one expired' do
46
+ subject.instance_variable_set('@auth_token_last_used_at', Time.now - Ecircle::Api::AUTH_TOKEN_TIMEOUT - 1)
47
+ savon.expects(:logon).returns(:success)
48
+ subject.obtain_auth_token
49
+ end
50
+ end
51
+ end
52
+
53
+ describe 'create_member' do
54
+ it 'should obtain an auth token' do
55
+ savon.stubs(:createMember).returns(:success)
56
+ subject.expects(:obtain_auth_token)
57
+
58
+ subject.create_member(nil, nil)
59
+ end
60
+
61
+ it 'should pass proper parameters' do
62
+ savon.expects(:createMember).
63
+ with(:session => 'foo', :userId => 1, :groupId => 2,
64
+ :invite => 'false', :sendMessage => 'false').
65
+ returns(:success)
66
+ subject.stubs(:obtain_auth_token).returns('foo')
67
+
68
+ wrapped_response = subject.create_member(1, 2)
69
+ end
70
+
71
+ it 'should parse proper response segment' do
72
+ savon.stubs(:createMember).returns(:success)
73
+ subject.stubs(:obtain_auth_token)
74
+
75
+ wrapped_response = subject.create_member(nil, nil)
76
+
77
+ wrapped_response.ecircle_id.should eq('123456')
78
+ end
79
+ end
80
+ end
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><createMemberResponse xmlns="http://webservices.ecircleag.com/rpcns"><createMemberReturn>123456</createMemberReturn></createMemberResponse></soapenv:Body></soapenv:Envelope>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><logonResponse xmlns="http://webservices.ecircleag.com/rpcns"><logonReturn>foo</logonReturn></logonResponse></soapenv:Body></soapenv:Envelope>
@@ -1,7 +1,5 @@
1
- dir = File.dirname(__FILE__)
2
- require File.join(dir, '..', 'lib', 'ecircle')
3
-
4
- require 'random_data'
1
+ Bundler.require
2
+ require 'savon_spec'
5
3
 
6
4
  def random_group_email suffix
7
5
  "apitest#{Random.number(100000)}@#{suffix}"
@@ -17,3 +15,12 @@ end
17
15
  def test_user_id
18
16
  @ecircle_user_id ||= Ecircle.create_or_update_user_by_email(:email => 'apitest@apitest.com').ecircle_id
19
17
  end
18
+
19
+ Savon::Spec::Fixture.path = File.expand_path('../fixtures', __FILE__)
20
+
21
+ RSpec::configure do |c|
22
+ c.include Savon::Spec::Macros
23
+ c.treat_symbols_as_metadata_keys_with_true_values = true
24
+ c.filter_run :focus => true
25
+ c.run_all_when_everything_filtered = true
26
+ end
metadata CHANGED
@@ -1,112 +1,128 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ecircle
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.3
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 0.1.4
6
6
  platform: ruby
7
- authors:
8
- - Timo Rößner
7
+ authors:
8
+ - "Timo R\xC3\xB6\xC3\x9Fner"
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-23 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2011-11-28 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
15
16
  name: activesupport
16
- requirement: &81840600 !ruby/object:Gem::Requirement
17
+ requirement: &id001 !ruby/object:Gem::Requirement
17
18
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
22
23
  type: :runtime
23
24
  prerelease: false
24
- version_requirements: *81840600
25
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
26
27
  name: i18n
27
- requirement: &81840390 !ruby/object:Gem::Requirement
28
+ requirement: &id002 !ruby/object:Gem::Requirement
28
29
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *81840390
36
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
37
38
  name: rake
38
- requirement: &81840180 !ruby/object:Gem::Requirement
39
+ requirement: &id003 !ruby/object:Gem::Requirement
39
40
  none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "0"
44
45
  type: :runtime
45
46
  prerelease: false
46
- version_requirements: *81840180
47
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
48
49
  name: savon
49
- requirement: &81839920 !ruby/object:Gem::Requirement
50
+ requirement: &id004 !ruby/object:Gem::Requirement
50
51
  none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
54
55
  version: 0.9.7
55
56
  type: :runtime
56
57
  prerelease: false
57
- version_requirements: *81839920
58
- - !ruby/object:Gem::Dependency
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
59
60
  name: random_data
60
- requirement: &81839640 !ruby/object:Gem::Requirement
61
+ requirement: &id005 !ruby/object:Gem::Requirement
61
62
  none: false
62
- requirements:
63
- - - =
64
- - !ruby/object:Gem::Version
63
+ requirements:
64
+ - - "="
65
+ - !ruby/object:Gem::Version
65
66
  version: 1.5.2
66
67
  type: :development
67
68
  prerelease: false
68
- version_requirements: *81839640
69
- - !ruby/object:Gem::Dependency
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
70
71
  name: rspec
71
- requirement: &81839350 !ruby/object:Gem::Requirement
72
+ requirement: &id006 !ruby/object:Gem::Requirement
72
73
  none: false
73
- requirements:
74
- - - =
75
- - !ruby/object:Gem::Version
74
+ requirements:
75
+ - - "="
76
+ - !ruby/object:Gem::Version
76
77
  version: 2.6.0
77
78
  type: :development
78
79
  prerelease: false
79
- version_requirements: *81839350
80
- - !ruby/object:Gem::Dependency
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
82
+ name: savon_spec
83
+ requirement: &id007 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: 0.1.6
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
81
93
  name: yard
82
- requirement: &81802840 !ruby/object:Gem::Requirement
94
+ requirement: &id008 !ruby/object:Gem::Requirement
83
95
  none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: '0'
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: "0"
88
100
  type: :development
89
101
  prerelease: false
90
- version_requirements: *81802840
91
- - !ruby/object:Gem::Dependency
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
92
104
  name: ruby-debug19
93
- requirement: &81802590 !ruby/object:Gem::Requirement
105
+ requirement: &id009 !ruby/object:Gem::Requirement
94
106
  none: false
95
- requirements:
96
- - - ! '>='
97
- - !ruby/object:Gem::Version
98
- version: '0'
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: "0"
99
111
  type: :development
100
112
  prerelease: false
101
- version_requirements: *81802590
113
+ version_requirements: *id009
102
114
  description: The ecircle gem aims to be a full-fledged client for all ecircle services.
103
- email:
115
+ email:
104
116
  - timo.roessner@googlemail.com
105
117
  executables: []
118
+
106
119
  extensions: []
120
+
107
121
  extra_rdoc_files: []
108
- files:
122
+
123
+ files:
109
124
  - .gitignore
125
+ - .rspec
110
126
  - .rvmrc
111
127
  - .travis.yml
112
128
  - .yardopts
@@ -123,37 +139,44 @@ files:
123
139
  - lib/ecircle/version.rb
124
140
  - lib/ecircle/wrapped_response.rb
125
141
  - spec/api_spec.rb.disabled
142
+ - spec/ecircle/api_spec.rb
143
+ - spec/fixtures/create_member/success.xml
144
+ - spec/fixtures/logon/success.xml
126
145
  - spec/job_package_spec.rb
127
146
  - spec/spec_helper.rb
128
- homepage: ''
147
+ homepage: ""
129
148
  licenses: []
149
+
130
150
  post_install_message:
131
151
  rdoc_options: []
132
- require_paths:
152
+
153
+ require_paths:
133
154
  - lib
134
- required_ruby_version: !ruby/object:Gem::Requirement
155
+ required_ruby_version: !ruby/object:Gem::Requirement
135
156
  none: false
136
- requirements:
137
- - - ! '>='
138
- - !ruby/object:Gem::Version
139
- version: '0'
140
- segments:
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ hash: -815952973
161
+ segments:
141
162
  - 0
142
- hash: 733065171
143
- required_rubygems_version: !ruby/object:Gem::Requirement
163
+ version: "0"
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
165
  none: false
145
- requirements:
146
- - - ! '>='
147
- - !ruby/object:Gem::Version
148
- version: '0'
149
- segments:
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ hash: -815952973
170
+ segments:
150
171
  - 0
151
- hash: 733065171
172
+ version: "0"
152
173
  requirements: []
174
+
153
175
  rubyforge_project: ecircle
154
- rubygems_version: 1.8.10
176
+ rubygems_version: 1.8.11
155
177
  signing_key:
156
178
  specification_version: 3
157
179
  summary: Ecircle gem
158
180
  test_files: []
181
+
159
182
  has_rdoc: