finexclub 0.5.3 → 0.5.5

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.3
1
+ 0.5.5
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{finexclub}
8
- s.version = "0.5.3"
8
+ s.version = "0.5.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alex Levin"]
12
- s.date = %q{2011-02-04}
12
+ s.date = %q{2011-02-07}
13
13
  s.default_executable = %q{finexclub_updater}
14
14
  s.description = %q{Finexclub gem stores and retrieves Forex signals and screenshots. It is the heart of the http://trendsonforex.com and http://finexclub.net}
15
15
  s.email = %q{clubfinex@gmail.com}
@@ -26,7 +26,7 @@ module Finexclub
26
26
  indicator_data = params[indicator].is_a?(Array) ? params[indicator] : [ params[indicator] ]
27
27
  indicator_data.each do |s|
28
28
  ap s.merge(:updated => Time.now.utc)
29
- Finexclub.signals.add_signal(indicator, s, Time.now.utc)
29
+ Finexclub.signals.store(indicator, s, Time.now.utc)
30
30
  end
31
31
 
32
32
  status 200
@@ -24,19 +24,30 @@ module Finexclub
24
24
  self.class.handler_for(indicator)
25
25
  end
26
26
 
27
- def self.build_new(core, symbol, tf, time)
27
+ def self.timeframe_range(tf, time)
28
28
  time = time.is_a?(Time) ? time : Time.at(time).utc
29
29
 
30
- delta = self.timeframe_delta(tf)
30
+ delta = case tf
31
+ when 'h1', :h1 then 1
32
+ when 'h4', :h4 then 4
33
+ when 'd1', :d1 then 24
34
+ else 1
35
+ end
31
36
  starts = Time.utc(time.year, time.month, time.day, (time.hour/delta)*delta, 0)
32
37
  expires = starts + delta*60*60
38
+
39
+ { :starts => starts.to_i, :expires => expires.to_i }
40
+ end
41
+
42
+ def self.build_new(core, symbol, tf, time)
43
+ tf_hash = self.timeframe_range(tf, time)
33
44
 
34
45
  c = Chart.new(core)
35
46
  c.updated= time.to_i
36
47
  c.symbol= symbol
37
48
  c.timeframe = tf
38
- c.starts = starts.to_i
39
- c.expires = expires.to_i
49
+ c.starts = tf_hash[:starts]
50
+ c.expires = tf_hash[:expires]
40
51
  c
41
52
  end
42
53
 
@@ -70,14 +81,5 @@ module Finexclub
70
81
  indicator_handler :zeta, Finexclub::Signals::Zeta
71
82
  indicator_handler :octopus, Finexclub::Signals::Octopus
72
83
  indicator_handler :prognosis, Finexclub::Signals::Prognosis
73
-
74
- def self.timeframe_delta(tf)
75
- case tf
76
- when 'h1', :h1 then 1
77
- when 'h4', :h4 then 4
78
- when 'd1', :d1 then 24
79
- end
80
- end
81
-
82
84
  end
83
85
  end
@@ -9,6 +9,7 @@ module Finexclub
9
9
 
10
10
  def initialize(core)
11
11
  @core = core
12
+ @db = nil
12
13
  end
13
14
 
14
15
  def collection
@@ -23,24 +24,32 @@ module Finexclub
23
24
  def find_one(symbol, tf, time = nil)
24
25
  time ||= Time.now.utc
25
26
  time = time.respond_to?(:to_i) ? time.to_i : time
26
- find({:symbol => symbol, :timeframe => tf, :starts => {:$lte => time}, :expires => {:$gt => time}}, :limit => 1, :sort => [[:expires, -1]]).first
27
+ find({:symbol => symbol, :timeframe => tf, :starts => {:$lte => time}, :expires => {:$gt => time}}, :limit => 1, :sort => [[:expires, :desc]]).first
27
28
  end
28
29
 
29
30
  def find_many(symbol_or_array, tf, time = nil)
30
31
  time ||= Time.now.utc
31
32
  time = time.respond_to?(:to_i) ? time.to_i : time
32
- find({:symbol => {:$in => symbol_or_array}, :timeframe => tf, :starts => {:$lte => time}, :expires => {:$gt => time}}, :limit => 1, :sort => [[:expires, -1]])
33
+ find({:symbol => {:$in => symbol_or_array}, :timeframe => tf, :starts => {:$lte => time}, :expires => {:$gt => time}}, :limit => 1, :sort => [[:expires, :desc]])
33
34
  end
34
35
 
35
36
  def find_latest(symbol, tf)
36
37
  find({:symbol => symbol, :timeframe => tf}, :sort => [[:expires, :desc]], :limit => 1).first
37
38
  end
38
39
 
39
- def find_one_or_create(symbol, tf, time)
40
+ def find_one_or_duplicate(symbol, tf, time)
40
41
  chart = find_one(symbol, tf, time)
41
42
  return chart if chart
42
43
 
43
- id = collection.insert(Chart.build_new(core, symbol, tf, time).to_doc)
44
+ latest = find_latest(symbol, tf)
45
+ if latest
46
+ chart = latest
47
+ chart.build(Chart.timeframe_range(tf, time))
48
+ else
49
+ chart = Chart.build_new(core, symbol, tf, time)
50
+ end
51
+
52
+ id = collection.insert( chart.to_doc )
44
53
  find({"_id" => id}).first
45
54
  end
46
55
 
@@ -54,19 +63,13 @@ module Finexclub
54
63
  ts.nil? ? nil : Time.at(ts).utc
55
64
  end
56
65
 
57
- def add_signal(indicator, params, time)
66
+ def store(indicator, params, time)
58
67
  time = time.respond_to?(:to_i) ? time.to_i : time
59
68
 
60
69
  signal = Signal.build(core, indicator, params.merge(:updated => time))
61
- chart = find_one_or_create(signal.symbol, signal.timeframe, time)
62
-
63
- c = if chart._id
64
- {"_id" => chart._id}
65
- else
66
- chart.to_doc
67
- end
70
+ chart = find_one_or_duplicate(signal.symbol, signal.timeframe, time)
68
71
 
69
- collection.update(c, {"$set" => {:updated => signal.updated, "indicators.#{indicator}" => signal.to_doc}}, :upsert => true)
72
+ collection.update({"_id" => chart._id}, {"$set" => {:updated => signal.updated, "indicators.#{indicator}" => signal.to_doc}}, :upsert => true)
70
73
  end
71
74
 
72
75
  class Cursor
@@ -33,7 +33,7 @@ describe 'Finexclub::Chart' do
33
33
  describe '#omega signal accessor' do
34
34
  before do
35
35
  @omega_doc = {:symbol => 'usdjpy', :timeframe => 'h1', :foo => "Ololo!"}
36
- Finexclub.signals.add_signal(:omega, @omega_doc, Time.utc(2010, 12, 27, 11, 5))
36
+ Finexclub.signals.store(:omega, @omega_doc, Time.utc(2010, 12, 27, 11, 5))
37
37
  @chart = Finexclub.signals.find_one('usdjpy', 'h1', Time.utc(2010, 12, 27, 11, 10))
38
38
  end
39
39
 
@@ -60,10 +60,10 @@ describe 'Finexclub::Chart' do
60
60
 
61
61
  describe 'complex chart with default indicators' do
62
62
  before do
63
- Finexclub.signals.add_signal(:alpha, {:symbol => 'eurusd', :timeframe => 'h1'}, Time.now.utc)
64
- Finexclub.signals.add_signal(:zeta, {:symbol => 'eurusd', :timeframe => 'h1'}, Time.now.utc)
65
- Finexclub.signals.add_signal(:octopus, {:symbol => 'eurusd', :timeframe => 'h1'}, Time.now.utc)
66
- Finexclub.signals.add_signal(:prognosis, {:symbol => 'eurusd', :timeframe => 'h1'}, Time.now.utc)
63
+ Finexclub.signals.store(:alpha, {:symbol => 'eurusd', :timeframe => 'h1'}, Time.now.utc)
64
+ Finexclub.signals.store(:zeta, {:symbol => 'eurusd', :timeframe => 'h1'}, Time.now.utc)
65
+ Finexclub.signals.store(:octopus, {:symbol => 'eurusd', :timeframe => 'h1'}, Time.now.utc)
66
+ Finexclub.signals.store(:prognosis, {:symbol => 'eurusd', :timeframe => 'h1'}, Time.now.utc)
67
67
  end
68
68
 
69
69
  {
@@ -87,24 +87,7 @@ describe 'Finexclub::Chart' do
87
87
  describe 'Chart.build_signal(indicator, params)' do
88
88
  end
89
89
 
90
- describe 'Chart.build_new(symbol, tf, time)' do
91
- describe 'h1 timeframe' do
92
- it 'should return valid new (unsaved) chart instance' do
93
- chart = Finexclub::Chart.build_new(@core, 'eurusd', 'h1', Time.utc(2010, 12, 27, 11, 30).to_i)
94
- chart._id.should == nil
95
- chart.symbol.should == 'eurusd'
96
- chart.timeframe.should == 'h1'
97
- chart.starts.should == Time.utc(2010, 12, 27, 11, 0).to_i
98
- chart.expires.should == Time.utc(2010, 12, 27, 12, 0).to_i
99
- chart.updated.should == Time.utc(2010, 12, 27, 11, 30).to_i
100
- chart.indicators.should == {}
101
- end
102
-
103
- it 'should build valid chart given time as Time object' do
104
- Finexclub::Chart.build_new(@core, 'eurusd', 'h1', Time.utc(2010, 12, 27, 11, 30)).starts.should == Time.utc(2010, 12, 27, 11, 0).to_i
105
- end
106
- end
107
-
90
+ describe 'Chart.tf_boundaries(tf, time)' do
108
91
  {
109
92
  :h1 => {
110
93
  [2010, 12, 27, 00, 00] => [[2010, 12, 27, 00, 00], [2010, 12, 27, 01, 00]],
@@ -124,33 +107,45 @@ describe 'Finexclub::Chart' do
124
107
  [2010, 12, 27, 16, 37] => [[2010, 12, 27, 00, 00], [2010, 12, 28, 00, 00]],
125
108
  [2010, 12, 27, 23, 59] => [[2010, 12, 27, 00, 00], [2010, 12, 28, 00, 00]]
126
109
  }
127
- }.each do |tf, time_table|
110
+ }.each do |tf, examples|
128
111
  describe "#{tf} timeframe" do
129
- time_table.each do |initial_time, tf_boundary|
112
+ examples.each do |initial_time, tf_range|
130
113
  time = Time.utc(*initial_time)
131
- starts = Time.utc(*tf_boundary.first)
132
- expires = Time.utc(*tf_boundary.last)
114
+ starts = Time.utc(*tf_range.first)
115
+ expires = Time.utc(*tf_range.last)
133
116
 
134
- describe "chart at #{time}" do
117
+ describe "range for #{time}" do
135
118
  it "should start at #{starts}, expire at #{expires}" do
136
- chart = Finexclub::Chart.build_new(@core, 'eurusd', tf, time)
137
- chart.starts.should == starts.to_i
138
- chart.expires.should == expires.to_i
119
+ tf_hash = Finexclub::Chart.timeframe_range(tf, time)
120
+ tf_hash[:starts].should == starts.to_i
121
+ tf_hash[:expires].should == expires.to_i
139
122
  end
140
123
  end
141
124
  end
142
-
143
125
  end
144
126
  end
127
+ end
145
128
 
129
+ describe 'Chart.build_new(symbol, tf, time)' do
130
+ it 'should return valid new (unsaved) chart instance' do
131
+ chart = Finexclub::Chart.build_new(@core, 'eurusd', 'h1', Time.utc(2010, 12, 27, 11, 30).to_i)
132
+ chart._id.should == nil
133
+ chart.symbol.should == 'eurusd'
134
+ chart.timeframe.should == 'h1'
135
+ chart.starts.should == Time.utc(2010, 12, 27, 11, 0).to_i
136
+ chart.expires.should == Time.utc(2010, 12, 27, 12, 0).to_i
137
+ chart.updated.should == Time.utc(2010, 12, 27, 11, 30).to_i
138
+ chart.indicators.should == {}
139
+ end
140
+
141
+ it 'should build valid chart given time as Time object' do
142
+ chart = Finexclub::Chart.build_new(@core, 'eurusd', 'h1', Time.utc(2010, 12, 27, 11, 30))
143
+ chart.starts.should == Time.utc(2010, 12, 27, 11, 0).to_i
144
+ end
146
145
  end
147
-
148
146
 
149
- describe 'instance' do
147
+ describe 'Chart instance' do
150
148
  before do
151
- @a1, @a2 = mock('a1'), mock('a2')
152
- @z1 = mock('z1')
153
-
154
149
  @chart_doc = {
155
150
  :symbol => 'eurusd',
156
151
  :timeframe => 'h1',
@@ -158,24 +153,62 @@ describe 'Finexclub::Chart' do
158
153
  :expires => Time.utc(2010, 12, 27, 12, 0).to_i,
159
154
  :updated => Time.utc(2010, 12, 27, 11, 5).to_i,
160
155
  :indicators => {
161
- :alpha => @a1,
162
- :zeta => @z1
156
+ :omega => {:foo => 'bar'},
157
+ :gamma => {:ololo => 'piu'},
163
158
  }
164
159
  }
165
160
 
166
161
  @chart.build(@chart_doc)
167
162
  end
168
163
 
169
- it 'should provide access to raw indicator documents' do
170
- @chart.indicators[:alpha].should == @a1
171
- @chart.indicators[:zeta].should == @z1
164
+ describe 'common attributes' do
165
+ it 'should provide common accessors' do
166
+ @chart.symbol.should == 'eurusd'
167
+ @chart.timeframe.should == 'h1'
168
+ @chart.updated.should == @chart_doc[:updated]
169
+ @chart.starts.should == @chart_doc[:starts]
170
+ @chart.expires.should == @chart_doc[:expires]
171
+ @chart.indicators.should == @chart_doc[:indicators]
172
+ end
172
173
  end
173
174
 
174
- it 'should update raw indicator document' do
175
- @chart.indicators[:alpha] = @a2
176
- @chart.indicators[:alpha].should == @a2
175
+ describe 'Chart.indicators' do
176
+ it 'should access raw indications' do
177
+ @chart.indicators[:omega].should == {:foo => 'bar'}
178
+ @chart.indicators[:gamma].should == {:ololo => 'piu'}
179
+ end
180
+
181
+ it 'should update indication' do
182
+ @chart.indicators[:gamma] = {:ololo => 'yarr!'}
183
+ @chart.indicators[:gamma].should == {:ololo => 'yarr!'}
184
+ end
177
185
  end
178
186
 
187
+ describe 'Chart.to_doc' do
188
+ it 'should export valid document' do
189
+ @chart.to_doc.should == @chart_doc
190
+ end
191
+ end
192
+ end
193
+
194
+ describe 'Chart.build(doc_hash)' do
195
+ before do
196
+ @chart_doc = {
197
+ :symbol => 'eurusd',
198
+ :timeframe => 'h1',
199
+ :starts => Time.utc(2010, 12, 27, 11, 0).to_i,
200
+ :expires => Time.utc(2010, 12, 27, 12, 0).to_i,
201
+ :updated => Time.utc(2010, 12, 27, 11, 5).to_i,
202
+ :indicators => {
203
+ :omega => {:foo => 'bar'},
204
+ :gamma => {:ololo => 'piu'},
205
+ }
206
+ }
207
+
208
+ @chart.build(@chart_doc)
209
+ end
210
+
211
+
179
212
  it 'should provide common accessors' do
180
213
  @chart.symbol.should == 'eurusd'
181
214
  @chart.timeframe.should == 'h1'
@@ -2,19 +2,12 @@ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe 'Finexclub::Manager' do
4
4
  before do
5
- @core = mock_core
6
- @manager = Finexclub::Manager.new(@core)
5
+ @core = test_core
7
6
 
8
- @mongo = test_mongo
9
- @manager.db = @mongo
7
+ @manager = Finexclub::Manager.new(@core)
8
+ @manager.db = test_mongo
10
9
 
11
- @mongo.collection("charts").drop
12
- end
13
-
14
- describe '.db' do
15
- it 'should return mongo instance' do
16
- @manager.db.should == @mongo
17
- end
10
+ @manager.collection.drop
18
11
  end
19
12
 
20
13
  describe '.collection' do
@@ -31,7 +24,7 @@ describe 'Finexclub::Manager' do
31
24
 
32
25
  describe 'finding charts' do
33
26
  before do
34
- charts = @mongo.collection('charts')
27
+ charts = @manager.collection
35
28
  charts.drop
36
29
  @c1 = {:symbol => 'eurusd', :timeframe => 'h1', :starts => Time.utc(2010, 12, 27, 11, 0).to_i, :expires => Time.utc(2010, 12, 27, 12, 0).to_i, :updated => Time.utc(2010, 12, 27, 11, 3).to_i}
37
30
  @c2 = {:symbol => 'eurusd', :timeframe => 'h1', :starts => Time.utc(2010, 12, 27, 12, 0).to_i, :expires => Time.utc(2010, 12, 27, 13, 0).to_i, :updated => Time.utc(2010, 12, 27, 12, 5).to_i}
@@ -89,20 +82,22 @@ describe 'Finexclub::Manager' do
89
82
  end
90
83
  end
91
84
 
92
- describe '.find_one_or_create(symbol, tf, time)' do
85
+ describe '.find_one_or_duplicate(symbol, tf, time)' do
93
86
  it 'should return existing chart for given symbol, timeframe and time' do
94
- c = @manager.find_one_or_create('eurusd', 'h1', Time.utc(2010, 12, 27, 11, 30))
87
+ c = @manager.find_one_or_duplicate('eurusd', 'h1', Time.utc(2010, 12, 27, 11, 30))
95
88
  c._id.should == @id1
96
89
  end
97
90
 
98
- #it 'should build valid chart if no chart exists' do
99
- #Finexclub::Chart.should.receive(:build_new).with(@core, 'eurusd', 'h1', Time.utc(2010, 12, 27, 13, 5)).and_return(c = mock('chart'))
100
- #@manager.find_one_or_create('eurusd', 'h1', Time.utc(2010, 12, 27, 13, 5)).should == c
101
- #end
91
+ it 'should create duplicate latest chart if no chart exists' do
92
+ indicators = {
93
+ "omega" => {"foo" => 'ololo!'}
94
+ }
95
+ @manager.collection.update({:_id => @id2}, {:$set => {:indicators => indicators}})
102
96
 
103
- it 'should create a new chart if no chart exists' do
104
- c = @manager.find_one_or_create('eurusd', 'h1', Time.utc(2010, 12, 27, 13, 5))
97
+ # this should insert after @c2 copying indications from there
98
+ c = @manager.find_one_or_duplicate('eurusd', 'h1', Time.utc(2010, 12, 27, 13, 5))
105
99
  c._id.should.not.be.nil?
100
+ c.indicators.should == indicators
106
101
  end
107
102
  end
108
103
 
@@ -158,7 +153,7 @@ describe 'Finexclub::Manager' do
158
153
 
159
154
  end
160
155
 
161
- describe 'saving signals' do
156
+ describe 'storing signals' do
162
157
  before do
163
158
  class Omega < Finexclub::Signal
164
159
  field :symbol, :symbol
@@ -170,7 +165,17 @@ describe 'Finexclub::Manager' do
170
165
  end
171
166
  Finexclub::Chart.indicator_handler(:omega, Omega)
172
167
 
173
- charts = @mongo.collection('charts')
168
+ class Gamma < Finexclub::Signal
169
+ field :symbol, :symbol
170
+ field :timeframe, :string
171
+ field :updated, :timestamp
172
+ field :ololo, :string
173
+
174
+ doc_fields :ololo, :updated
175
+ end
176
+ Finexclub::Chart.indicator_handler(:gamma, Gamma)
177
+
178
+ charts = @manager.collection
174
179
  charts.drop
175
180
  @c1 = {
176
181
  :symbol => 'eurusd',
@@ -194,9 +199,13 @@ describe 'Finexclub::Manager' do
194
199
  @id2 = charts.insert(@c2)
195
200
  end
196
201
 
197
- describe '.add_signal(indicator, raw_params, time)' do
202
+ describe '.store(indicator, raw_params, time)' do
198
203
  it 'should add signal to existing chart' do
199
- @manager.add_signal(:omega, {"symbol" => "EURUSD", "timeframe" => "h1", "foo" => "bar"}, Time.utc(2010, 12, 27, 11, 5))
204
+ @manager.store(
205
+ :omega,
206
+ {"symbol" => "EURUSD", "timeframe" => "h1", "foo" => "bar"},
207
+ Time.utc(2010, 12, 27, 11, 5)
208
+ )
200
209
 
201
210
  c = @manager.collection.find_one({"_id" => @id1})
202
211
  c["symbol"].should == 'eurusd'
@@ -211,7 +220,11 @@ describe 'Finexclub::Manager' do
211
220
  end
212
221
 
213
222
  it 'should update existing signal on existing chart' do
214
- @manager.add_signal(:omega, {"symbol" => "USDCAD", "timeframe" => "h1", "foo" => "ololo!"}, Time.utc(2010, 12, 27, 11, 30))
223
+ @manager.store(
224
+ :omega,
225
+ {"symbol" => "USDCAD", "timeframe" => "h1", "foo" => "ololo!"},
226
+ Time.utc(2010, 12, 27, 11, 30)
227
+ )
215
228
 
216
229
  c = @manager.collection.find_one({"_id" => @id2})
217
230
  c["symbol"].should == 'usdcad'
@@ -225,28 +238,36 @@ describe 'Finexclub::Manager' do
225
238
  }
226
239
  end
227
240
 
228
- it 'should add signals to non-existent chart' do
229
- @manager.add_signal(:omega, {"symbol" => "EURUSD", "timeframe" => "h4", "foo" => "bar"}, Time.utc(2010, 12, 27, 11, 5))
241
+ describe 'no chart mathes for given time' do
242
+ before do
243
+ # store signal after @c2 and transfer @c2.omega indications
244
+ @manager.store(
245
+ :gamma,
246
+ {"symbol" => "USDCAD", "timeframe" => "h1", "ololo" => "yarr!"},
247
+ Time.utc(2010, 12, 27, 12, 5)
248
+ )
249
+ @c = @manager.collection.find({:symbol => 'usdcad', :timeframe => 'h1'}).sort([[:expires, :desc]]).first
250
+ end
230
251
 
231
- c = @manager.collection.find_one({:symbol => 'eurusd', :timeframe => 'h4'})
232
- c["symbol"].should == 'eurusd'
233
- c["timeframe"].should == 'h4'
234
- c["starts"].should == Time.utc(2010, 12, 27, 8, 0).to_i
235
- c["expires"].should == Time.utc(2010, 12, 27, 12, 0).to_i
236
- c["updated"].should == Time.utc(2010, 12, 27, 11, 5).to_i
237
- c["indicators"]["omega"].should == {
238
- "foo" => "bar",
239
- "updated" => Time.utc(2010, 12, 27, 11, 5).to_i
240
- }
241
- end
242
- end
243
- end
252
+ it 'should add signals to new valid chart' do
253
+ @c["symbol"].should == 'usdcad'
254
+ @c["timeframe"].should == 'h1'
255
+ @c["starts"].should == Time.utc(2010, 12, 27, 12, 0).to_i
256
+ @c["expires"].should == Time.utc(2010, 12, 27, 13, 0).to_i
257
+ @c["updated"].should == Time.utc(2010, 12, 27, 12, 5).to_i
258
+ @c["indicators"]["gamma"].should == {
259
+ "ololo" => "yarr!",
260
+ "updated" => Time.utc(2010, 12, 27, 12, 5).to_i
261
+ }
262
+ end
244
263
 
245
- describe 'Cursor' do
246
- before do
247
- @mongo_cursor = mock('mongo_cursor')
248
- class Foo; end
249
- @cursor = Finexclub::Manager::Cursor.new(@core, Foo, @mongo_cursor)
264
+ it 'should transfer indications from latest chart' do
265
+ @c["indicators"]["omega"].should == {
266
+ "foo" => "bar",
267
+ "updated" => Time.utc(2010, 12, 27, 11, 3).to_i
268
+ }
269
+ end
270
+ end
250
271
  end
251
272
  end
252
273
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 5
8
- - 3
9
- version: 0.5.3
8
+ - 5
9
+ version: 0.5.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Alex Levin
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-02-04 00:00:00 +07:00
17
+ date: 2011-02-07 00:00:00 +07:00
18
18
  default_executable: finexclub_updater
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency