finexclub 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +7 -0
- data/Rakefile +58 -0
- data/VERSION +1 -0
- data/bin/finexclub_updater +120 -0
- data/config.ru +4 -0
- data/finexclub.gemspec +100 -0
- data/lib/finexclub/app.rb +29 -0
- data/lib/finexclub/chart.rb +42 -0
- data/lib/finexclub/core.rb +36 -0
- data/lib/finexclub/document.rb +116 -0
- data/lib/finexclub/fabrication.rb +60 -0
- data/lib/finexclub/images.rb +38 -0
- data/lib/finexclub/manager.rb +103 -0
- data/lib/finexclub/signal.rb +27 -0
- data/lib/finexclub/signals/alpha.rb +28 -0
- data/lib/finexclub/signals/zeta.rb +26 -0
- data/lib/finexclub.rb +45 -0
- data/samples/egg.png +0 -0
- data/spec/finexclub/alpha_spec.rb +47 -0
- data/spec/finexclub/app_spec.rb +89 -0
- data/spec/finexclub/chart_spec.rb +51 -0
- data/spec/finexclub/core_spec.rb +91 -0
- data/spec/finexclub/document_spec.rb +203 -0
- data/spec/finexclub/images_spec.rb +49 -0
- data/spec/finexclub/manager_spec.rb +99 -0
- data/spec/finexclub/signal_spec.rb +38 -0
- data/spec/finexclub/zeta_spec.rb +52 -0
- data/spec/spec_helper.rb +34 -0
- metadata +185 -0
@@ -0,0 +1,203 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe 'Finexclub::Document' do
|
4
|
+
before do
|
5
|
+
@core = mock_core
|
6
|
+
class Foo
|
7
|
+
include Finexclub::Document
|
8
|
+
end
|
9
|
+
@object = Foo.new
|
10
|
+
@object.stub!(:core).and_return(@core)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should swallow when assigned to _id' do
|
14
|
+
lambda {
|
15
|
+
@object._id = 111
|
16
|
+
}.should.not.raise
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '.apply_meta' do
|
20
|
+
before do
|
21
|
+
@meta = {
|
22
|
+
:foo => :string,
|
23
|
+
:index => :integer,
|
24
|
+
:rate => :float,
|
25
|
+
:symbol => :symbol,
|
26
|
+
:updated => :timestamp,
|
27
|
+
:screenshot => :image
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should save meta as class variable' do
|
32
|
+
@object.apply_meta(@meta)
|
33
|
+
Foo.meta.should == @meta
|
34
|
+
end
|
35
|
+
|
36
|
+
[
|
37
|
+
:string,
|
38
|
+
:integer,
|
39
|
+
:float,
|
40
|
+
:timestamp,
|
41
|
+
:image
|
42
|
+
].each do |field_type|
|
43
|
+
it "should define methods for #{field_type} type" do
|
44
|
+
Foo.should.receive("define_#{field_type}_fields".to_sym).with(:foo)
|
45
|
+
@object.apply_meta({:foo => field_type})
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '.to_doc' do
|
51
|
+
before do
|
52
|
+
class Foo
|
53
|
+
field :symbol, :symbol
|
54
|
+
field :index, :integer
|
55
|
+
field :foo, :string
|
56
|
+
|
57
|
+
doc_fields :foo, :index
|
58
|
+
end
|
59
|
+
@object = Foo.new
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should only export specified fields' do
|
63
|
+
@object.build(:symbol => "eurusd", :index => 100, :foo => "bar")
|
64
|
+
@object.to_doc.should == {:index => 100, :foo => "bar"}
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '.build' do
|
69
|
+
before do
|
70
|
+
@object.apply_meta({:foo => :string})
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should assign attribute values from symbols hash' do
|
74
|
+
@object.should.receive("foo=".to_sym).with("bar")
|
75
|
+
@object.build(:foo => "bar")
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should assign attribute values from string hash' do
|
79
|
+
@object.should.receive("foo=".to_sym).with("bar")
|
80
|
+
@object.build("foo" => "bar")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe 'string fields' do
|
85
|
+
before do
|
86
|
+
@object.apply_meta({:foo => :string})
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should covert to string' do
|
90
|
+
@object.foo = 100
|
91
|
+
@object.foo.should == "100"
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should assign and read strings' do
|
95
|
+
@object.foo = "bar"
|
96
|
+
@object.foo.should == "bar"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe 'integer fields' do
|
101
|
+
before do
|
102
|
+
@object.apply_meta({:foo => :integer})
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should convert integers from strings' do
|
106
|
+
@object.foo = "100"
|
107
|
+
@object.foo.should == 100
|
108
|
+
@object.foo.class.should == Fixnum
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should assign and read integers' do
|
112
|
+
@object.foo = 100
|
113
|
+
@object.foo.should == 100
|
114
|
+
@object.foo.class.should == Fixnum
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe 'float fields' do
|
119
|
+
before do
|
120
|
+
@object.apply_meta({:foo => :float})
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should convert to float from string' do
|
124
|
+
@object.foo = "1.1234"
|
125
|
+
@object.foo.should == 1.1234
|
126
|
+
@object.foo.class.should == Float
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'should assign and read floats' do
|
130
|
+
@object.foo = 1.5
|
131
|
+
@object.foo.should == 1.5
|
132
|
+
@object.foo.class.should == Float
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe 'timestamp field' do
|
137
|
+
before do
|
138
|
+
@object.apply_meta({:updated => :timestamp})
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'initialize from Time instance' do
|
142
|
+
ts = Time.now
|
143
|
+
@object.updated = ts
|
144
|
+
@object.updated.should == ts.to_i
|
145
|
+
@object.updated.class.should == Fixnum
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'assign and read timestamp' do
|
149
|
+
@object.updated = 123123
|
150
|
+
@object.updated.should == 123123
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'should provide updated_at as UTC Time' do
|
154
|
+
@object.updated = 123123
|
155
|
+
@object.updated_at.should == Time.at(123123).utc
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'should provide updated_date date' do
|
159
|
+
# 2010-10-05
|
160
|
+
@object.updated = 1286236800
|
161
|
+
@object.updated_date.should == '2010-10-05'
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe 'symbol field' do
|
166
|
+
before do
|
167
|
+
@object.apply_meta({:symbol => :symbol})
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'should convert to lowercase' do
|
171
|
+
@object.symbol = "EURUSD"
|
172
|
+
@object.symbol.should == "eurusd"
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should ignore case if lowercase' do
|
176
|
+
@object.symbol = "eurusd"
|
177
|
+
@object.symbol.should == "eurusd"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
describe 'image field' do
|
182
|
+
before do
|
183
|
+
@object.apply_meta({:screenshot => :image})
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'should store file if assigned to screenshot_filename' do
|
187
|
+
@core.images.should.receive(:store).with("egg.png").and_return("image_uid")
|
188
|
+
@object.screenshot_filename = "egg.png"
|
189
|
+
@object.screenshot.should == "image_uid"
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'should assign and read image id' do
|
193
|
+
@object.screenshot = "image_uid"
|
194
|
+
@object.screenshot.should == "image_uid"
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'should provide access to image' do
|
198
|
+
@core.images.should.receive(:fetch).with("image_uid").and_return(img=mock('job'))
|
199
|
+
@object.screenshot = "image_uid"
|
200
|
+
@object.screenshot_image.should == img
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe 'Finexclub::Images' do
|
4
|
+
before do
|
5
|
+
@core = mock_core
|
6
|
+
@images = Finexclub::Images.new(@core)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should initialize Dragonfly application' do
|
10
|
+
@images.app.should == Dragonfly[:images]
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
describe 'configuring' do
|
15
|
+
it 'should allow configuring screenshot_path' do
|
16
|
+
@images.screenshot_path = "ololo"
|
17
|
+
@images.screenshot_path.should == "ololo"
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should forward configure_with' do
|
21
|
+
@images.app.should.receive(:configure_with).with(:rmagick)
|
22
|
+
@images.configure_with(:rmagick)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should forward configure' do
|
26
|
+
@images.app.should.receive(:configure)
|
27
|
+
@images.configure {|app| }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '.store' do
|
32
|
+
before do
|
33
|
+
@images.screenshot_path = TEST_IMAGES_PATH
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should store given file using Dragonfly' do
|
37
|
+
File.should.receive(:new).with("#{TEST_IMAGES_PATH}/egg.png").and_return(image_file = mock('file'))
|
38
|
+
@images.app.should.receive(:store).with(image_file).and_return("image_uid")
|
39
|
+
@images.store("egg.png").should == "image_uid"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '.fetch' do
|
44
|
+
it 'should respond to .fetch' do
|
45
|
+
@images.app.should.receive(:fetch).with('image_uid').and_return(job = mock('job'))
|
46
|
+
@images.fetch('image_uid').should == job
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe 'Finexclub::Manager' do
|
4
|
+
before do
|
5
|
+
@core = mock_core
|
6
|
+
@manager = Finexclub::Manager.new(@core)
|
7
|
+
@manager.db = mock_mongo
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'mongo' do
|
11
|
+
before do
|
12
|
+
@mongo = mock('mongo')
|
13
|
+
@manager.db = @mongo
|
14
|
+
end
|
15
|
+
it 'should provide mongo instance' do
|
16
|
+
@manager.db.should == @mongo
|
17
|
+
end
|
18
|
+
it 'should have collection accessor' do
|
19
|
+
@mongo.stub!(:collection).and_return(coll = mock('coll'))
|
20
|
+
@manager.collection.should == coll
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.find' do
|
25
|
+
it 'should call find on collection and return Cursor' do
|
26
|
+
@manager.collection.should.receive(:find).with({:date => "2010-10-01"}, {}).and_return(c = mock('cursor'))
|
27
|
+
@manager.find(:date => "2010-10-01")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '.find_one' do
|
32
|
+
it 'should call find on collection' do
|
33
|
+
@manager.collection.should.receive(:find_one).with({:date => "2010-10-01", :symbol => "eurusd" }, {}).and_return({})
|
34
|
+
@manager.find_one(:date => "2010-10-01", :symbol => "eurusd").class == Finexclub::Chart
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should return nil if nothing found' do
|
38
|
+
@manager.collection.should.receive(:find_one).with({:date => "2010-10-01", :symbol => "eurusd"}, {}).and_return(nil)
|
39
|
+
@manager.find_one(:date => "2010-10-01", :symbol => "eurusd").should == nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '.last_updated' do
|
44
|
+
before do
|
45
|
+
@cursor = mock('cursor', :first => {"updated" => 123})
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should search for the latest timestamp in collection' do
|
49
|
+
@manager.collection.should.receive(:find).with({}, :fields => {:updated => 1}, :sort => [['updated', :desc]], :limit => 1).and_return(@cursor)
|
50
|
+
@manager.last_updated.should == Time.at(123)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should return nil if nothing found' do
|
54
|
+
@manager.collection.stub!(:find).and_return(mock('cursor', :first => nil))
|
55
|
+
@manager.last_updated.should == nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '.add_signal' do
|
60
|
+
before do
|
61
|
+
class Omega < Finexclub::Signal
|
62
|
+
field :symbol, :symbol
|
63
|
+
field :updated, :timestamp
|
64
|
+
field :foo, :string
|
65
|
+
|
66
|
+
doc_fields :foo, :updated
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should update collection' do
|
71
|
+
#Mon Oct 04 18:10:20 0700 2010
|
72
|
+
ts = 1286190620
|
73
|
+
|
74
|
+
Finexclub::Signal.stub!(:handler_for).with(:omega).and_return(Omega)
|
75
|
+
@manager.collection.should.receive(:update).with(
|
76
|
+
{
|
77
|
+
:date => '2010-10-04',
|
78
|
+
:symbol => 'eurusd'
|
79
|
+
},
|
80
|
+
{
|
81
|
+
"$push" => {:omega => {:foo => "bar", :updated => 1286190620}},
|
82
|
+
"$set" => {:updated => 1286190620}
|
83
|
+
},
|
84
|
+
:upsert => true
|
85
|
+
)
|
86
|
+
|
87
|
+
Timecop.travel(Time.at(ts))
|
88
|
+
@manager.add_signal(:omega, {"foo" => "bar", "symbol" => "EURUSD"})
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe 'Cursor' do
|
93
|
+
before do
|
94
|
+
@mongo_cursor = mock('mongo_cursor')
|
95
|
+
class Foo; end
|
96
|
+
@cursor = Finexclub::Manager::Cursor.new(@core, Foo, @mongo_cursor)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe 'Finexclub::Signal' do
|
4
|
+
before do
|
5
|
+
@core = mock_core
|
6
|
+
@signal = Finexclub::Signal.new(@core)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'self.build' do
|
10
|
+
before do
|
11
|
+
class Finexclub::Signals::Foo < Finexclub::Signal
|
12
|
+
field :foo, :integer
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'self.handler_for' do
|
17
|
+
it 'should return valid signal class' do
|
18
|
+
Finexclub::Signal.handler_for(:foo).should == Finexclub::Signals::Foo
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should raise with unknown handler' do
|
22
|
+
lambda {
|
23
|
+
Finexclub::Signal.handler_for(:bar)
|
24
|
+
}.should.raise(NameError)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should create new signal instance and initialize it with params' do
|
29
|
+
Finexclub::Signals::Foo.should.receive(:new).with(@core).and_return(sig = mock('signal'))
|
30
|
+
params = mock('params')
|
31
|
+
sig.should.receive(:build).with(params)
|
32
|
+
|
33
|
+
Finexclub::Signal.build(@core, :foo, params).should == sig
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe 'Finexclub::Signals::Zeta' do
|
4
|
+
before do
|
5
|
+
@core = mock_core
|
6
|
+
@zeta = Finexclub::Signals::Zeta.new(@core)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should have meta' do
|
10
|
+
Finexclub::Signals::Zeta.meta.should == {
|
11
|
+
:updated => :timestamp,
|
12
|
+
:symbol => :symbol,
|
13
|
+
:up_support => :float,
|
14
|
+
:up_resist => :float,
|
15
|
+
:down_support => :float,
|
16
|
+
:down_resist => :float,
|
17
|
+
:screenshot => :image
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should build from doc' do
|
22
|
+
@zeta.build(:up_support => 1.1, :up_resist => 1.2, :down_support => 2.1, :down_resist => 2.2, :symbol => "eurusd", :screenshot => "image_uid")
|
23
|
+
@zeta.up_support.should == 1.1
|
24
|
+
@zeta.up_resist.should == 1.2
|
25
|
+
@zeta.down_support.should == 2.1
|
26
|
+
@zeta.down_resist.should == 2.2
|
27
|
+
@zeta.symbol.should == "eurusd"
|
28
|
+
@zeta.screenshot.should == "image_uid"
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should respond to #up_channel? / #down_channel' do
|
32
|
+
@zeta.build(:up_support => 0, :up_resist => 0)
|
33
|
+
@zeta.up_channel?.should == false
|
34
|
+
|
35
|
+
@zeta.build(:down_support => 0, :down_resist => 0)
|
36
|
+
@zeta.down_channel?.should == false
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should export valid doc' do
|
40
|
+
@core.images.stub!(:store).and_return('image_uid')
|
41
|
+
@zeta.build("up_support" => "1.1", "up_resist" => "1.2", "down_support" => "2.1", "down_resist" => "2.2", "updated" => 123, "screenshot_filename" => "egg.png")
|
42
|
+
@zeta.to_doc.should == {
|
43
|
+
:updated => 123,
|
44
|
+
:up_support => 1.1,
|
45
|
+
:up_resist => 1.2,
|
46
|
+
:down_support => 2.1,
|
47
|
+
:down_resist => 2.2,
|
48
|
+
:screenshot => 'image_uid'
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bacon"
|
3
|
+
require "facon"
|
4
|
+
require "ap"
|
5
|
+
require "timecop"
|
6
|
+
require "chronic"
|
7
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/finexclub')
|
8
|
+
|
9
|
+
TEST_IMAGES_PATH = File.expand_path(File.dirname(__FILE__) + "/../samples")
|
10
|
+
|
11
|
+
class Bacon::Context
|
12
|
+
include Finexclub::Fabrication
|
13
|
+
|
14
|
+
def mock_core(extra_stubs = {})
|
15
|
+
mock('core', {
|
16
|
+
:images => mock('images', :store => 'image_uid'),
|
17
|
+
:signals => mock('signals')
|
18
|
+
}.merge(extra_stubs)
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
def mock_mongo(extra_stubs = {})
|
23
|
+
mock('mongo', {
|
24
|
+
:collection => mock('collection', :update => true)
|
25
|
+
}.merge(extra_stubs)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_core
|
30
|
+
Finexclub::Core.send(:new)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Bacon.summary_on_exit
|
metadata
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: finexclub
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Alex Levin
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-10-06 00:00:00 +07:00
|
18
|
+
default_executable: finexclub_updater
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: bacon
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 1
|
30
|
+
- 0
|
31
|
+
version: 1.1.0
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: facon
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 4
|
44
|
+
- 1
|
45
|
+
version: 0.4.1
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: mongo
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 1
|
57
|
+
- 0
|
58
|
+
- 8
|
59
|
+
version: 1.0.8
|
60
|
+
type: :runtime
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: dragonfly
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
- 7
|
72
|
+
- 6
|
73
|
+
version: 0.7.6
|
74
|
+
type: :runtime
|
75
|
+
version_requirements: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: sinatra
|
78
|
+
prerelease: false
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 1
|
85
|
+
- 0
|
86
|
+
- 0
|
87
|
+
version: 1.0.0
|
88
|
+
type: :runtime
|
89
|
+
version_requirements: *id005
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: awesome_print
|
92
|
+
prerelease: false
|
93
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
- 2
|
100
|
+
- 1
|
101
|
+
version: 0.2.1
|
102
|
+
type: :runtime
|
103
|
+
version_requirements: *id006
|
104
|
+
description: Finexclub gem stores and retrieves Forex signals and screenshots. It is the heart of the http://trendsonforex.com and http://finexclub.net
|
105
|
+
email: clubfinex@gmail.com
|
106
|
+
executables:
|
107
|
+
- finexclub_updater
|
108
|
+
extensions: []
|
109
|
+
|
110
|
+
extra_rdoc_files:
|
111
|
+
- LICENSE
|
112
|
+
- README.rdoc
|
113
|
+
files:
|
114
|
+
- .document
|
115
|
+
- .gitignore
|
116
|
+
- LICENSE
|
117
|
+
- README.rdoc
|
118
|
+
- Rakefile
|
119
|
+
- VERSION
|
120
|
+
- bin/finexclub_updater
|
121
|
+
- config.ru
|
122
|
+
- finexclub.gemspec
|
123
|
+
- lib/finexclub.rb
|
124
|
+
- lib/finexclub/app.rb
|
125
|
+
- lib/finexclub/chart.rb
|
126
|
+
- lib/finexclub/core.rb
|
127
|
+
- lib/finexclub/document.rb
|
128
|
+
- lib/finexclub/fabrication.rb
|
129
|
+
- lib/finexclub/images.rb
|
130
|
+
- lib/finexclub/manager.rb
|
131
|
+
- lib/finexclub/signal.rb
|
132
|
+
- lib/finexclub/signals/alpha.rb
|
133
|
+
- lib/finexclub/signals/zeta.rb
|
134
|
+
- samples/egg.png
|
135
|
+
- spec/finexclub/alpha_spec.rb
|
136
|
+
- spec/finexclub/app_spec.rb
|
137
|
+
- spec/finexclub/chart_spec.rb
|
138
|
+
- spec/finexclub/core_spec.rb
|
139
|
+
- spec/finexclub/document_spec.rb
|
140
|
+
- spec/finexclub/images_spec.rb
|
141
|
+
- spec/finexclub/manager_spec.rb
|
142
|
+
- spec/finexclub/signal_spec.rb
|
143
|
+
- spec/finexclub/zeta_spec.rb
|
144
|
+
- spec/spec_helper.rb
|
145
|
+
has_rdoc: true
|
146
|
+
homepage: http://github.com/alexlevin/finexclub
|
147
|
+
licenses: []
|
148
|
+
|
149
|
+
post_install_message:
|
150
|
+
rdoc_options:
|
151
|
+
- --charset=UTF-8
|
152
|
+
require_paths:
|
153
|
+
- lib
|
154
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
segments:
|
159
|
+
- 0
|
160
|
+
version: "0"
|
161
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
segments:
|
166
|
+
- 0
|
167
|
+
version: "0"
|
168
|
+
requirements: []
|
169
|
+
|
170
|
+
rubyforge_project:
|
171
|
+
rubygems_version: 1.3.6
|
172
|
+
signing_key:
|
173
|
+
specification_version: 3
|
174
|
+
summary: Little helper to maintain Forex signals and screenshots
|
175
|
+
test_files:
|
176
|
+
- spec/finexclub/signal_spec.rb
|
177
|
+
- spec/finexclub/manager_spec.rb
|
178
|
+
- spec/finexclub/app_spec.rb
|
179
|
+
- spec/finexclub/alpha_spec.rb
|
180
|
+
- spec/finexclub/core_spec.rb
|
181
|
+
- spec/finexclub/images_spec.rb
|
182
|
+
- spec/finexclub/chart_spec.rb
|
183
|
+
- spec/finexclub/document_spec.rb
|
184
|
+
- spec/finexclub/zeta_spec.rb
|
185
|
+
- spec/spec_helper.rb
|