moe 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ $count = 0
4
+
5
+ describe Moe::Sequence::Collection do
6
+ let(:count) { $count += 1 }
7
+ let(:name) { "collection_test#{count}" }
8
+ let!(:setup) { Moe::Sequence.setup name, 2, 5, 10 }
9
+ let(:collection) { Moe::Sequence::Collection.new name, "owner" }
10
+ let(:collector) { Moe::Sequence::Collector.new name, "owner" }
11
+
12
+ describe "#metadata_items" do
13
+ it "gets all metadata items for a given owner" do
14
+ collector.save({ "foo" => "bar" })
15
+
16
+ expect(
17
+ collection.metadata_items.first.payload
18
+ ).to eq({ "foo" => "bar"})
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,72 @@
1
+ require "spec_helper"
2
+
3
+ $count = 0
4
+
5
+ describe Moe::Sequence::Collection do
6
+ let(:count) { $count += 1 }
7
+ let(:dyna) { Moe::Dyna.new }
8
+ let(:name) { "collector_test#{count}" }
9
+ let!(:setup) { Moe::Sequence.setup name, 2, 5, 10 }
10
+ let(:collection) { Moe::Sequence::Collection.new name, "owner" }
11
+ let(:collector) { Moe::Sequence::Collector.new name, "owner" }
12
+
13
+ describe "#initialize" do
14
+ it "initializes an item array" do
15
+ expect( collector.payloads ).to be_an(Array)
16
+ end
17
+ end
18
+
19
+ describe "#add" do
20
+ it "adds an item to the payloads array" do
21
+ collector.add({ "bar" => "baz" })
22
+
23
+ expect( collector.payloads.first["bar"] ).to eq("baz")
24
+ end
25
+
26
+ it "does not flush before it hits the batch limit" do
27
+ 1.upto(10) do |i|
28
+ collector.add
29
+ end
30
+
31
+ result = dyna.get_item collection.read_tables, { "hash" => { s: "owner" },
32
+ "range" => { s: "10.#{collector.uuid}" } }
33
+
34
+ expect( result ).to be_nil
35
+ end
36
+
37
+ it "flushes when it hits the batch limit" do
38
+ 1.upto(15) do |i|
39
+ collector.add
40
+ end
41
+
42
+ result = dyna.get_item collection.read_tables, { "hash" => { s: "owner" },
43
+ "range" => { s: "15.#{collector.uuid}" } }
44
+
45
+ expect( result["hash"]["s"] ).to eq("owner")
46
+ end
47
+
48
+ it "increments the flushed counter when it flushes" do
49
+ 1.upto(15) do |i|
50
+ collector.add
51
+ end
52
+
53
+ expect( collector.flushed_count ).to eq(15)
54
+ end
55
+
56
+ it "resets the payloads array when it flushes" do
57
+ 1.upto(15) do |i|
58
+ collector.add
59
+ end
60
+
61
+ expect( collector.payloads.size ).to eq(0)
62
+ end
63
+
64
+ it "initializes a v4 uuid" do
65
+ collector.add
66
+
67
+ expect(
68
+ collector.uuid
69
+ ).to match(/[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}/)
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ describe Moe::Sequence::Locksmith::ModuleFunctions do
4
+ describe ".itemize" do
5
+ it "returns a hash" do
6
+ item = Moe::Sequence::Locksmith.itemize 1,2,3,4
7
+
8
+ expect( item ).to be_a(Hash)
9
+ end
10
+ end
11
+
12
+ describe ".key" do
13
+ it "also returns a hash" do
14
+ key = Moe::Sequence::Locksmith.key 1,2,3
15
+
16
+ expect( key ).to be_a(Hash)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ $count = 0
4
+
5
+ describe Moe::Sequence::MetadataItem do
6
+ let(:count) { $count += 1 }
7
+ let(:name) { "metadata_item_test#{count}" }
8
+ let!(:setup) { Moe::Sequence.setup name, 2, 5, 10 }
9
+ let(:collection) { Moe::Sequence::Collection.new name, "owner" }
10
+ let(:collector) { Moe::Sequence::Collector.new name, "owner" }
11
+
12
+ describe "#items" do
13
+ it "returns the associated items" do
14
+ 1.upto(101) do
15
+ collector.add
16
+ end
17
+ collector.save
18
+
19
+ sequences = collection.metadata_items
20
+
21
+ expect( sequences.first.items.size ).to eq(101)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe Moe::Sequence::ModuleFunctions do
4
+ describe ".setup" do
5
+ it "creates a table using the name provided" do
6
+ Moe.configure do |c|
7
+ c.tables = {}
8
+ end
9
+
10
+ Moe::Sequence.setup "seq_setup_test", 1, 5, 10
11
+
12
+ expect(
13
+ Aws.dynamodb.list_tables.table_names.join
14
+ ).to match("seq_setup_test")
15
+ end
16
+
17
+ it "skips creating a table if one is already configured" do
18
+ Moe.configure do |c|
19
+ c.tables = { "seq_skip_test" => [] }
20
+ end
21
+
22
+ expect(
23
+ Moe::Sequence.setup "seq_skip_test", 1, 5, 10
24
+ ).to match("already exists")
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,127 @@
1
+ require "spec_helper"
2
+
3
+ describe Moe::TableManager do
4
+ let(:dyna) { Moe::Dyna.new }
5
+ let(:manager) { Moe::TableManager.new }
6
+
7
+ describe "#initialize" do
8
+ it "creates itself a table if one does not exist" do
9
+ new_manager = Moe::TableManager.new
10
+
11
+ expect(
12
+ dyna.find(new_manager.meta_table_names.first).table.table_name
13
+ ).to eq(new_manager.meta_table_names.first)
14
+ end
15
+ end
16
+
17
+ describe "#build" do
18
+ it "creates a table for a given model" do
19
+ manager.build "build_test"
20
+
21
+ expect(
22
+ dyna.find(manager.table_name "build_test_1").table.table_name
23
+ ).to match("build_test")
24
+ end
25
+
26
+ it "creates additional tables if requested" do
27
+ manager.build "mirror_test", 2
28
+
29
+ expect(
30
+ dyna.find("#{manager.table_name('mirror_test')}_2").table.table_name
31
+ ).to match("mirror_test_2")
32
+ end
33
+
34
+ it "does not create additional tables by default" do
35
+ manager.build "false_mirror_test"
36
+
37
+ expect(
38
+ dyna.find("#{manager.table_name('false_mirror_test')}_2")
39
+ ).to be_false
40
+ end
41
+
42
+ it "munges model names into a DynamoDB-approved format" do
43
+ manager.build "Testy::Model"
44
+
45
+ expect(
46
+ dyna.find(manager.table_name "testy_model_1").table.table_name
47
+ ).to match("testy_model")
48
+ end
49
+ end
50
+
51
+ describe "#increment" do
52
+ it "increments the table" do
53
+ manager.build "increment_test"
54
+
55
+ Timecop.freeze(Date.today + 30) do
56
+ frozen_manager = Moe::TableManager.new
57
+
58
+ frozen_manager.increment "increment_test"
59
+ end
60
+ end
61
+
62
+ it "pitches a fit if run twice on the same day" do
63
+ manager.build "fit_test"
64
+
65
+ expect { manager.increment "fit_test" }.to raise_error
66
+ end
67
+ end
68
+
69
+ describe "#load_metadata" do
70
+ it "loads metadata for a model" do
71
+ metadata = { read_tables: ["load_metadata_test"],
72
+ write_tables: ["load_metadata_test"] }
73
+
74
+ manager.update_metadata "load_metadata_test", metadata
75
+
76
+ expect(
77
+ manager.load_metadata("load_metadata_test")[:write_tables].first
78
+ ).to match("load_metadata_test")
79
+ end
80
+ end
81
+
82
+ describe "#meta_table_name" do
83
+ it "includes the RAILS_ENV if one exists" do
84
+ ENV["RAILS_ENV"] = "test"
85
+
86
+ expect( manager.meta_table_name ).to match("test_manager")
87
+ end
88
+
89
+ it "does not mind if there is no RAILS_ENV" do
90
+ ENV["RAILS_ENV"] = ""
91
+
92
+ expect( manager.meta_table_name ).to match("manager")
93
+ end
94
+ end
95
+
96
+ describe "#table_name" do
97
+ it "includes the RAILS_ENV if one exists" do
98
+ ENV["RAILS_ENV"] = "test"
99
+
100
+ expect( manager.table_name("tetsuo") ).to match("_test_")
101
+ end
102
+
103
+ it "does not mind if there is no RAILS_ENV" do
104
+ ENV["RAILS_ENV"] = ""
105
+
106
+ expect( manager.table_name("tetsuo") ).to match("tetsuo")
107
+ end
108
+
109
+ it "includes the date" do
110
+ expect( manager.table_name("tetsuo") ).to match(manager.date)
111
+ end
112
+ end
113
+
114
+ describe "#update_metadata" do
115
+ it "updates the metadata" do
116
+ manager.update_metadata "testie", { read_tables: ["testie"],
117
+ write_tables: ["testie"] }
118
+
119
+ result = dyna.get_item manager.meta_table_names,
120
+ { "hash" => { s: "testie" } }
121
+
122
+ expect(
123
+ result["payload"]["s"]
124
+ ).to match("testie")
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,28 @@
1
+ require "coveralls"
2
+ Coveralls.wear!
3
+
4
+ require "moe"
5
+ require "pry"
6
+ require "timecop"
7
+
8
+ Aws.config = {
9
+ access_key_id: "xxx",
10
+ secret_access_key: "xxx",
11
+ dynamodb: {
12
+ api_version: "2012-08-10",
13
+ endpoint: "http://localhost:4567"
14
+ },
15
+ region: "us-east-1"
16
+ }
17
+
18
+ Moe.configure do |conf|
19
+ conf.tables = {}
20
+ end
21
+
22
+ RSpec.configure do |conf|
23
+ conf.order = "random"
24
+
25
+ conf.expect_with :rspec do |c|
26
+ c.syntax = :expect
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,210 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: moe
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Fuzz Leonard
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: multi_json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.8'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: coveralls
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.7'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.7'
69
+ - !ruby/object:Gem::Dependency
70
+ name: fake_dynamo
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 0.2.5
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 0.2.5
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.9'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.9'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '10'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '10'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '2'
125
+ - !ruby/object:Gem::Dependency
126
+ name: timecop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.7'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.7'
139
+ description: A toolkit for working with DynamoDB at scale
140
+ email:
141
+ - fuzz@fuzzleonard.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - ".gitignore"
147
+ - ".ruby-version"
148
+ - ".travis.yml"
149
+ - Gemfile
150
+ - LICENSE.txt
151
+ - README.markdown
152
+ - Rakefile
153
+ - lib/moe.rb
154
+ - lib/moe/config.rb
155
+ - lib/moe/dyna.rb
156
+ - lib/moe/sequence.rb
157
+ - lib/moe/sequence/collection.rb
158
+ - lib/moe/sequence/collector.rb
159
+ - lib/moe/sequence/item_fetcher.rb
160
+ - lib/moe/sequence/locksmith.rb
161
+ - lib/moe/sequence/metadata_item.rb
162
+ - lib/moe/table_manager.rb
163
+ - lib/moe/version.rb
164
+ - moe.gemspec
165
+ - spec/lib/config_spec.rb
166
+ - spec/lib/dyna_spec.rb
167
+ - spec/lib/moe_spec.rb
168
+ - spec/lib/sequence/collection_spec.rb
169
+ - spec/lib/sequence/collector_spec.rb
170
+ - spec/lib/sequence/locksmith_spec.rb
171
+ - spec/lib/sequence/metadata_item_spec.rb
172
+ - spec/lib/sequence_spec.rb
173
+ - spec/lib/table_manager_spec.rb
174
+ - spec/spec_helper.rb
175
+ homepage: https://github.com/Geezeo/moe
176
+ licenses:
177
+ - MIT
178
+ metadata: {}
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 2.2.0
196
+ signing_key:
197
+ specification_version: 4
198
+ summary: A toolkit for working with DynamoDB
199
+ test_files:
200
+ - spec/lib/config_spec.rb
201
+ - spec/lib/dyna_spec.rb
202
+ - spec/lib/moe_spec.rb
203
+ - spec/lib/sequence/collection_spec.rb
204
+ - spec/lib/sequence/collector_spec.rb
205
+ - spec/lib/sequence/locksmith_spec.rb
206
+ - spec/lib/sequence/metadata_item_spec.rb
207
+ - spec/lib/sequence_spec.rb
208
+ - spec/lib/table_manager_spec.rb
209
+ - spec/spec_helper.rb
210
+ has_rdoc: