hexx-storage 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +2 -0
  3. data/.gitignore +9 -0
  4. data/.metrics +9 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +2 -0
  7. data/.travis.yml +12 -0
  8. data/.yardopts +3 -0
  9. data/Gemfile +12 -0
  10. data/Guardfile +14 -0
  11. data/LICENSE +21 -0
  12. data/README.md +351 -0
  13. data/Rakefile +22 -0
  14. data/config/metrics/STYLEGUIDE +230 -0
  15. data/config/metrics/cane.yml +5 -0
  16. data/config/metrics/churn.yml +6 -0
  17. data/config/metrics/flay.yml +2 -0
  18. data/config/metrics/metric_fu.yml +13 -0
  19. data/config/metrics/reek.yml +1 -0
  20. data/config/metrics/roodi.yml +24 -0
  21. data/config/metrics/rubocop.yml +73 -0
  22. data/config/metrics/saikuro.yml +3 -0
  23. data/config/metrics/simplecov.yml +8 -0
  24. data/config/metrics/yardstick.yml +37 -0
  25. data/hexx-storage.gemspec +28 -0
  26. data/lib/hexx-storage.rb +20 -0
  27. data/lib/hexx/storage.rb +17 -0
  28. data/lib/hexx/storage/base.rb +108 -0
  29. data/lib/hexx/storage/patches.rb +135 -0
  30. data/lib/hexx/storage/repositories.rb +40 -0
  31. data/lib/hexx/storage/repositories/base.rb +70 -0
  32. data/lib/hexx/storage/repositories/memory.rb +33 -0
  33. data/lib/hexx/storage/repositories/sql.rb +78 -0
  34. data/lib/hexx/storage/version.rb +13 -0
  35. data/spec/integration/storage.yml +9 -0
  36. data/spec/integration/storage_spec.rb +56 -0
  37. data/spec/spec_helper.rb +12 -0
  38. data/spec/tests/storage/base_spec.rb +178 -0
  39. data/spec/tests/storage/patches_spec.rb +202 -0
  40. data/spec/tests/storage/repositories/base_spec.rb +120 -0
  41. data/spec/tests/storage/repositories/memory_spec.rb +32 -0
  42. data/spec/tests/storage/repositories/sql_spec.rb +180 -0
  43. data/spec/tests/storage/repositories_spec.rb +66 -0
  44. data/spec/tests/storage_spec.rb +24 -0
  45. metadata +168 -0
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ module Hexx
4
+
5
+ module Storage
6
+
7
+ # The semantic version of the module.
8
+ # @see http://semver.org/ Semantic versioning 2.0
9
+ VERSION = "0.0.2".freeze
10
+
11
+ end # module Storage
12
+
13
+ end # module Hexx
@@ -0,0 +1,9 @@
1
+ ---
2
+ foo:
3
+ bar:
4
+ adapter: :memory
5
+ baz:
6
+ adapter: :sql
7
+ uri: "postgres://localhost/rom"
8
+ user: "postgres"
9
+ log: "tmp/baz.log"
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ require "rom/memory"
4
+ require "rom-sql"
5
+ require "sequel/adapters/postgres"
6
+
7
+ describe "Loading a storage" do
8
+
9
+ let(:migrate) { File.expand_path "../migrate", __FILE__ }
10
+ let(:tmp) { File.expand_path "../tmp", __FILE__ }
11
+ before do
12
+ `mkdir #{ migrate } -p`
13
+ `mkdir #{ tmp } -p`
14
+ end
15
+
16
+ let(:storage) { Hexx::Storage.setup }
17
+
18
+ before do
19
+ storage.root = File.expand_path "..", __FILE__
20
+ storage.load "storage.yml", env: "foo"
21
+ storage[:baz].migrations = migrate
22
+
23
+ ROM.setup storage.settings
24
+ ROM.finalize
25
+
26
+ storage.each do |key, value|
27
+ next unless value.logger
28
+ ROM.env.repositories[key].use_logger value.logger
29
+ end
30
+ end
31
+
32
+ subject { ROM.env.repositories }
33
+
34
+ it "sets repositories" do
35
+ expect(subject.keys).to eq %i(bar baz)
36
+ expect(subject[:bar]).to be_kind_of ROM::Memory::Repository
37
+ expect(subject[:baz]).to be_kind_of ROM::SQL::Repository
38
+ end
39
+
40
+ it "sets loggers" do
41
+ expect(subject[:bar].logger).to be_nil
42
+ expect(subject[:baz].logger).to be_kind_of Logger
43
+ end
44
+
45
+ it "sets sql migrators" do
46
+ repo = subject[:baz]
47
+ expect(repo.migrator).not_to be_nil
48
+ expect(repo.migrator.path).to eq migrate
49
+ end
50
+
51
+ after do
52
+ `rm #{ migrate } -r -f`
53
+ `rm #{ tmp } -r -f`
54
+ end
55
+
56
+ end # specification
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ begin
4
+ require "hexx-suit"
5
+ Hexx::Suit.load_metrics_for(self)
6
+ rescue LoadError
7
+ require "hexx-rspec"
8
+ Hexx::RSpec.load_metrics_for(self)
9
+ end
10
+
11
+ # Loads the code under test
12
+ require "hexx-storage"
@@ -0,0 +1,178 @@
1
+ # encoding: utf-8
2
+
3
+ describe Hexx::Storage::Base do
4
+
5
+ # Stub builder to isolate tests
6
+ let(:settings) { double :settings }
7
+ let(:storage) { double :storage, settings: settings }
8
+ let(:builder) { Hexx::Storage::Repositories }
9
+ before { allow(builder).to receive(:build) { storage } }
10
+
11
+ shared_context "setup" do
12
+ before do
13
+ subject.root = File.expand_path "..", __FILE__
14
+ subject.setup foo: { adapter: :memory }, bar: { adapter: :memory }
15
+ end
16
+ end
17
+
18
+ describe "#root" do
19
+
20
+ it "returns nil by default" do
21
+ expect(subject.root).to be_nil
22
+ end
23
+
24
+ end # describe #root
25
+
26
+ describe "#root=" do
27
+
28
+ let(:folder) { File.expand_path "..", __FILE__ }
29
+ let(:wrong) { File.join folder, "wrong" }
30
+
31
+ it "sets the #root if a folder exists" do
32
+ expect { subject.root = folder }.to change { subject.root }.to folder
33
+ end
34
+
35
+ it "doesn't set the #root if a folder is absent" do
36
+ expect { subject.root = wrong }.not_to change { subject.root }
37
+ end
38
+
39
+ end # describe #root=
40
+
41
+ describe "#setup" do
42
+
43
+ let(:source) do
44
+ { "foo" => { "adapter" => "memory", "uri" => "bar", "log" => "baz" } }
45
+ end
46
+
47
+ context "when #root hasn't been set" do
48
+
49
+ it "raises NotImplementedError" do
50
+ expect { subject.setup(source) }.to raise_error NotImplementedError
51
+ end
52
+
53
+ end # context
54
+
55
+ context "when #root has been set" do
56
+
57
+ let(:root) { File.expand_path "..", __FILE__ }
58
+ before { subject.root = root }
59
+
60
+ it "builds repo storages" do
61
+ expect(builder)
62
+ .to receive(:build)
63
+ .with(root: root, adapter: "memory", uri: "bar", log: "baz")
64
+ subject.setup source
65
+ end
66
+
67
+ it "sets storages" do
68
+ expect { subject.setup source }.to change { subject[:foo] }.to storage
69
+ end
70
+
71
+ end # context
72
+
73
+ end # describe #setup
74
+
75
+ describe "#load" do
76
+
77
+ let(:file) { Tempfile.new %w(foo .yml) }
78
+ let(:path) { file.path }
79
+ let(:name) { File.basename path }
80
+
81
+ before do
82
+ file.write "---\ntest:\n foo:\n adapter: foo\n uri: bar\n"
83
+ file.read
84
+ end
85
+
86
+ context "when #root hasn't been set" do
87
+
88
+ it "raises NotImplementedError" do
89
+ expect { subject.load(name, env: "test") }
90
+ .to raise_error NotImplementedError
91
+ end
92
+
93
+ end # context
94
+
95
+ context "when #root has been set" do
96
+
97
+ let(:root) { File.dirname path }
98
+ before { subject.root = root }
99
+
100
+ it "sets storages from file" do
101
+ expect(subject)
102
+ .to receive(:setup)
103
+ .with("foo" => { "adapter" => "foo", "uri" => "bar" })
104
+ subject.load name, env: "test"
105
+ end
106
+
107
+ end # context
108
+
109
+ end # describe #load
110
+
111
+ describe "#settings" do
112
+
113
+ context "before the #setup" do
114
+
115
+ it "raises NotImplementedError" do
116
+ expect { subject.settings }.to raise_error NotImplementedError
117
+ end
118
+
119
+ end # context
120
+
121
+ context "after the #setup" do
122
+
123
+ include_context "setup"
124
+
125
+ it "returns hash of repositories' settings" do
126
+ expect(subject.settings).to eq(foo: settings, bar: settings)
127
+ end
128
+
129
+ end # context
130
+
131
+ end # describe #settings
132
+
133
+ describe "#[]" do
134
+
135
+ context "by default" do
136
+
137
+ it "returns nil" do
138
+ expect(subject[:foo]).to be_nil
139
+ end
140
+
141
+ end # context
142
+
143
+ context "after setup" do
144
+
145
+ include_context "setup"
146
+ let(:repo_storage_class) { Hexx::Storage::Repositories::Memory }
147
+
148
+ it "returns the repository settings storage" do
149
+ expect(subject[:foo]).to eq storage
150
+ end
151
+
152
+ end # context
153
+
154
+ end # describe #[]
155
+
156
+ describe "#keys" do
157
+
158
+ context "by default" do
159
+
160
+ it "returns []" do
161
+ expect(subject.keys).to eq []
162
+ end
163
+
164
+ end # context
165
+
166
+ context "after setup" do
167
+
168
+ include_context "setup"
169
+
170
+ it "returns names of repositories" do
171
+ expect(subject.keys).to match_array %i(foo bar)
172
+ end
173
+
174
+ end # context
175
+
176
+ end # describe #keys
177
+
178
+ end # describe Hexx::Storage::Base
@@ -0,0 +1,202 @@
1
+ # encoding: utf-8
2
+
3
+ require "tempfile"
4
+
5
+ describe Hexx::Storage::Patches do
6
+ using described_class
7
+
8
+ describe "for Hash" do
9
+
10
+ describe "#normalize" do
11
+
12
+ let(:source) { { "foo" => "bar", 1 => "qux" } }
13
+ let(:target) { { foo: "bar", :"1" => "qux" } }
14
+
15
+ it "normalizes a hash" do
16
+ expect(source.normalize).to eq target
17
+ end
18
+
19
+ end # describe #normalize
20
+
21
+ describe "#sub" do
22
+
23
+ let(:source) { { "foo" => { "bar" => "baz" }, "bar" => "qux" } }
24
+
25
+ context "when a value is a hash" do
26
+
27
+ subject { source.sub :foo }
28
+
29
+ it "returns the value" do
30
+ expect(subject).to eq("bar" => "baz")
31
+ end
32
+
33
+ end # context
34
+
35
+ context "when a value is not a hash" do
36
+
37
+ subject { source.sub :bar }
38
+
39
+ it "returns the {}" do
40
+ expect(subject).to eq({})
41
+ end
42
+
43
+ end # context
44
+
45
+ context "when a key is absent" do
46
+
47
+ subject { source.sub :baz }
48
+
49
+ it "returns the {}" do
50
+ expect(subject).to eq({})
51
+ end
52
+
53
+ end # context
54
+
55
+ end # describe #sub
56
+
57
+ describe "#wrap" do
58
+
59
+ let(:source) { { foo: %w(a b c), bar: %w(c d) } }
60
+
61
+ context "with a block" do
62
+
63
+ subject { source.wrap(&:count) }
64
+ let(:target) { { foo: 3, bar: 2 } }
65
+
66
+ it "sends values to the block" do
67
+ expect(subject).to eq target
68
+ end
69
+
70
+ end # context
71
+
72
+ context "without a block" do
73
+
74
+ subject { source.wrap }
75
+
76
+ it "returns a copy of its own" do
77
+ expect(subject).to eq source
78
+ expect { subject.freeze }.not_to change { source }
79
+ end
80
+
81
+ end # context
82
+
83
+ end # describe #wrap
84
+
85
+ end # describe Hash
86
+
87
+ describe "for Array" do
88
+
89
+ describe "#to_path" do
90
+
91
+ let(:source) { ["foo", nil, "/bar/", "baz"] }
92
+ let(:target) { "foo/bar/baz" }
93
+
94
+ it "converts array to filepath" do
95
+ expect(source.to_path).to eq target
96
+ end
97
+
98
+ it "converts empty array to empty string" do
99
+ expect([].to_path).to eq ""
100
+ end
101
+
102
+ end # describe #to_path
103
+
104
+ end # describe Array
105
+
106
+ describe "for String" do
107
+
108
+ describe "#from_yaml" do
109
+
110
+ context "when the string contains valid yml" do
111
+
112
+ let(:source) { "---\nfoo:\n bar: :baz\n" }
113
+ let(:target) { { "foo" => { "bar" => :baz } } }
114
+
115
+ subject { source.from_yaml }
116
+
117
+ it "converts it to hash" do
118
+ expect(subject).to eq target
119
+ end
120
+
121
+ end # context
122
+
123
+ context "when the string contains invalid yml" do
124
+
125
+ subject { "wrong".from_yaml }
126
+
127
+ it "returns the {}" do
128
+ expect(subject).to eq({})
129
+ end
130
+
131
+ end # context
132
+
133
+ context "when the string is empty" do
134
+
135
+ subject { "".from_yaml }
136
+
137
+ it "returns the {}" do
138
+ expect(subject).to eq({})
139
+ end
140
+
141
+ end # context
142
+
143
+ end # describe #from_yaml
144
+
145
+ describe "#from_file" do
146
+
147
+ context "when the file exists" do
148
+
149
+ let(:file) { Tempfile.create "foo" }
150
+ let(:source) { file.path }
151
+ before { file.write "foobar" }
152
+ let(:target) { file.read }
153
+
154
+ subject { source.from_file }
155
+
156
+ it "returns its content" do
157
+ expect(subject).to eq target
158
+ end
159
+
160
+ end # context
161
+
162
+ context "when the file is absent" do
163
+
164
+ subject { "".from_file }
165
+
166
+ it "returns the empty string" do
167
+ expect(subject).to eq ""
168
+ end
169
+
170
+ end # context
171
+
172
+ end # describe #from_file
173
+
174
+ describe "#to_folder" do
175
+
176
+ context "when a folder exists" do
177
+
178
+ let(:source) { File.expand_path("..", __FILE__) }
179
+ subject { source.to_folder }
180
+
181
+ it "returns a copy of its own if the folder exist" do
182
+ expect(subject).to eq source
183
+ expect { subject.freeze }.not_to change { source }
184
+ end
185
+
186
+ end # context
187
+
188
+ context "when a folder is absent" do
189
+
190
+ subject { ",,".to_folder }
191
+
192
+ it "returns nil if the folder is absent" do
193
+ expect(subject).to be_nil
194
+ end
195
+
196
+ end # context
197
+
198
+ end # describe #to_folder
199
+
200
+ end # describe String
201
+
202
+ end # describe Hexx::Storage::Patches