mongoid_silo 0.1.2 → 0.2.0
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/Gemfile +1 -1
- data/Guardfile +14 -4
- data/app/workers/mongoid_silo/update_silo_worker.rb +0 -1
- data/lib/mongoid/silo.rb +50 -1
- data/lib/mongoid_silo/version.rb +1 -1
- data/spec/factories/block_project_factory.rb +5 -0
- data/spec/factories/block_project_item_factory.rb +6 -0
- data/spec/factories/multi_silo_project_factory.rb +1 -1
- data/spec/models/silo_spec.rb +48 -3
- data/spec/spec_helper.rb +12 -5
- data/spec/support/models/block_project.rb +13 -0
- data/spec/support/models/block_project_item.rb +8 -0
- data/spec/support/models/multi_silo_project.rb +1 -1
- data/spec/support/silovators/make_block_project_grain_belt.rb +16 -0
- data/spec/support/silovators/make_location_grain_belt.rb +1 -1
- metadata +12 -2
data/Gemfile
CHANGED
data/Guardfile
CHANGED
@@ -5,9 +5,19 @@ guard :bundler do
|
|
5
5
|
watch("Gemfile")
|
6
6
|
end
|
7
7
|
|
8
|
-
guard :
|
9
|
-
watch(
|
8
|
+
guard :spork, :rspec_env => { 'RAILS_ENV' => 'test', 'RACK_ENV' => 'test' } do
|
9
|
+
watch('Gemfile')
|
10
|
+
watch('Gemfile.lock')
|
11
|
+
watch('spec/spec_helper.rb') { :rspec }
|
12
|
+
watch(%r{spec/support/}) { :spork }
|
13
|
+
end
|
14
|
+
|
15
|
+
guard :rspec, cli: "--drb --color --fail-fast" do
|
16
|
+
watch(%r{^app/models/(.+)\.rb$}) { |m| "spec/models/#{m[1]}_spec.rb" }
|
10
17
|
watch(%r{^app/workers/(.+)\.rb$}) { "spec" }
|
18
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/models/silo_spec.rb" }
|
11
19
|
watch(%r{^spec/.+_spec\.rb$})
|
12
|
-
watch('spec/spec_helper.rb')
|
13
|
-
end
|
20
|
+
watch('spec/spec_helper.rb') { "spec" }
|
21
|
+
end
|
22
|
+
|
23
|
+
|
data/lib/mongoid/silo.rb
CHANGED
@@ -6,7 +6,27 @@ module Mongoid
|
|
6
6
|
|
7
7
|
module ClassMethods
|
8
8
|
def silo name=:default, opts={}
|
9
|
-
opts
|
9
|
+
opts = if block_given?
|
10
|
+
opts = ActiveSupport::OrderedOptions.new
|
11
|
+
opts.dependents = []
|
12
|
+
yield(opts)
|
13
|
+
opts.generator ||= "MongoidSilo::GrainBelt"
|
14
|
+
opts
|
15
|
+
else
|
16
|
+
opts[:generator] ||= "MongoidSilo::GrainBelt"
|
17
|
+
opts[:dependents] = []
|
18
|
+
opts
|
19
|
+
end
|
20
|
+
setup_own_silo name, opts
|
21
|
+
if opts[:dependents].length != 0
|
22
|
+
setup_listeners name, opts[:dependents], opts[:generator]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
protected
|
29
|
+
def setup_own_silo name, opts
|
10
30
|
define_method "#{name}_silo" do
|
11
31
|
from_silo name
|
12
32
|
end
|
@@ -19,6 +39,35 @@ module Mongoid
|
|
19
39
|
destroy_silo name
|
20
40
|
end
|
21
41
|
end
|
42
|
+
|
43
|
+
def setup_listeners name, dependents, generator
|
44
|
+
registry = dependents.each_with_object([]) do |dep, arr|
|
45
|
+
next unless dep[:class_name]
|
46
|
+
out = {class_name: dep[:class_name], parent_class: self.to_s, silo_name: name.to_s, generator: generator}
|
47
|
+
if dep[:foreign_key]
|
48
|
+
out[:foreign_key] = dep[:foreign_key]
|
49
|
+
else
|
50
|
+
out[:foreign_key] = self.to_s.underscore.singularize + "_id"
|
51
|
+
end
|
52
|
+
arr << out
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
registry.each do |key|
|
57
|
+
puts key.inspect
|
58
|
+
key[:class_name].classify.constantize.class_eval <<-EOS, __FILE__, __LINE__+1
|
59
|
+
set_callback :save, :after do
|
60
|
+
ident = key[:foreign_key].to_sym
|
61
|
+
MongoidSilo::UpdateSiloWorker.perform_async(self.__send__(ident), "#{key[:parent_class]}", "#{key[:silo_name]}", :save, "#{key[:generator]}")
|
62
|
+
end
|
63
|
+
|
64
|
+
set_callback :destroy, :after do
|
65
|
+
ident = key[:foreign_key].to_sym
|
66
|
+
MongoidSilo::UpdateSiloWorker.perform_async(self.__send__(ident), "#{key[:parent_class]}", "#{key[:silo_name]}", :destroy)
|
67
|
+
end
|
68
|
+
EOS
|
69
|
+
end
|
70
|
+
end
|
22
71
|
end
|
23
72
|
|
24
73
|
def update_silo name, generator
|
data/lib/mongoid_silo/version.rb
CHANGED
data/spec/models/silo_spec.rb
CHANGED
@@ -83,6 +83,51 @@ describe Silo do
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
+
context "Block based constructors:" do
|
87
|
+
|
88
|
+
subject(:block_project) { create(:block_project) }
|
89
|
+
|
90
|
+
it "defines an accessor based on the declared silo name" do
|
91
|
+
block_project.should respond_to(:block_silo)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should create the required silo" do
|
95
|
+
block_project.block_silo["name"].should eq(block_project.name)
|
96
|
+
end
|
97
|
+
|
98
|
+
it "updates the parent when a child is saved" do
|
99
|
+
project_item = create(:block_project_item, block_project_id: block_project.id)
|
100
|
+
block_project.block_silo["items"][0]["name"].should eq(project_item.name)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "updates the parent when a child is updated" do
|
104
|
+
project_item = create(:block_project_item, block_project_id: block_project.id)
|
105
|
+
project_item.name = Faker::Name.name
|
106
|
+
project_item.save
|
107
|
+
block_project.block_silo["items"][0]["name"].should eq(project_item.name)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "updates when there are many children" do
|
111
|
+
project_item1 = create(:block_project_item, block_project_id: block_project.id)
|
112
|
+
project_item2 = create(:block_project_item, block_project_id: block_project.id)
|
113
|
+
project_item3 = create(:block_project_item, block_project_id: block_project.id)
|
114
|
+
block_project.block_silo["items"].length.should eq(3)
|
115
|
+
|
116
|
+
puts "Name was: " + project_item2.name
|
117
|
+
|
118
|
+
project_item2.name = Faker::Name.name
|
119
|
+
project_item2.save
|
120
|
+
|
121
|
+
puts project_item2._save_callbacks.inspect
|
122
|
+
bp = BlockProject.find block_project.id
|
123
|
+
|
124
|
+
bp.block_silo["items"].map{|i| i["name"]}.sort.should eq(
|
125
|
+
[project_item1.name, project_item2.name, project_item3.name].sort
|
126
|
+
)
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
86
131
|
context "Multiple silo constructors:" do
|
87
132
|
before do
|
88
133
|
@multi_silo_project = create(:multi_silo_project)
|
@@ -102,14 +147,14 @@ describe Silo do
|
|
102
147
|
it "Correctly populates the Location silo" do
|
103
148
|
_expectation = {
|
104
149
|
"city" => @multi_silo_project.city,
|
105
|
-
"
|
150
|
+
"county" => @multi_silo_project.county
|
106
151
|
}
|
107
152
|
@multi_silo_project.location_silo.should eq(_expectation)
|
108
153
|
end
|
109
154
|
|
110
155
|
it "Correctly updates both silos" do
|
111
156
|
@multi_silo_project.city = Faker::Address.city
|
112
|
-
@multi_silo_project.
|
157
|
+
@multi_silo_project.county = Faker::AddressUK.county
|
113
158
|
@multi_silo_project.name = Faker::Name.name
|
114
159
|
@multi_silo_project.save
|
115
160
|
_name_silo_expectation = {
|
@@ -117,7 +162,7 @@ describe Silo do
|
|
117
162
|
}
|
118
163
|
_location_silo_expectation = {
|
119
164
|
"city" => @multi_silo_project.city,
|
120
|
-
"
|
165
|
+
"county" => @multi_silo_project.county
|
121
166
|
}
|
122
167
|
@multi_silo_project.name_silo.should eq(_name_silo_expectation)
|
123
168
|
@multi_silo_project.location_silo.should eq(_location_silo_expectation)
|
data/spec/spec_helper.rb
CHANGED
@@ -5,15 +5,16 @@ require 'guard/rspec'
|
|
5
5
|
require 'rspec'
|
6
6
|
|
7
7
|
Spork.prefork do
|
8
|
-
require '
|
8
|
+
require 'sidekiq'
|
9
|
+
require 'mongoid'
|
9
10
|
require 'factory_girl'
|
10
11
|
require 'database_cleaner'
|
11
|
-
require '
|
12
|
+
require 'ffaker'
|
12
13
|
require 'sidekiq/testing/inline'
|
13
14
|
# Loading more in this block will cause your tests to run faster. However,
|
14
15
|
# if you change any configuration or code from libraries loaded here, you'll
|
15
16
|
# need to restart spork for it take effect.
|
16
|
-
|
17
|
+
|
17
18
|
|
18
19
|
Mongoid.load!(File.expand_path("../mongoid.yml", __FILE__), :test)
|
19
20
|
|
@@ -21,6 +22,9 @@ Spork.prefork do
|
|
21
22
|
|
22
23
|
RSpec.configure do |config|
|
23
24
|
config.include FactoryGirl::Syntax::Methods
|
25
|
+
config.filter_run :focus => true
|
26
|
+
config.run_all_when_everything_filtered = true
|
27
|
+
config.backtrace_clean_patterns << /gems\//
|
24
28
|
|
25
29
|
config.before(:suite) do
|
26
30
|
DatabaseCleaner.strategy = :truncation
|
@@ -32,11 +36,14 @@ Spork.prefork do
|
|
32
36
|
end
|
33
37
|
end
|
34
38
|
|
35
|
-
|
39
|
+
|
36
40
|
end
|
37
41
|
|
38
42
|
Spork.each_run do
|
39
|
-
|
43
|
+
require 'mongoid_silo'
|
44
|
+
FactoryGirl.find_definitions
|
45
|
+
# Dir['./app/**/*.rb'].each { |file| require file }
|
46
|
+
Dir['./spec/support/**/*.rb'].each{ |file| require file }
|
40
47
|
end
|
41
48
|
|
42
49
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative './block_project_item'
|
2
|
+
class BlockProject
|
3
|
+
include Mongoid::Document
|
4
|
+
include Mongoid::Silo
|
5
|
+
|
6
|
+
silo :block do |conf|
|
7
|
+
conf.generator = "MakeBlockProjectGrainBelt"
|
8
|
+
conf.dependents << {class_name: "BlockProjectItem"}
|
9
|
+
end
|
10
|
+
|
11
|
+
field :name, type: String
|
12
|
+
has_many :block_project_items
|
13
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class MakeBlockProjectGrainBelt < MongoidSilo::GrainBelt
|
2
|
+
def generate
|
3
|
+
{
|
4
|
+
name: name,
|
5
|
+
items: item_array
|
6
|
+
}
|
7
|
+
end
|
8
|
+
|
9
|
+
def item_array
|
10
|
+
block_project_items.each_with_object([]) do |itm, arr|
|
11
|
+
arr << {
|
12
|
+
name: itm.name
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_silo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -82,6 +82,8 @@ files:
|
|
82
82
|
- lib/mongoid_silo/railtie.rb
|
83
83
|
- lib/mongoid_silo/version.rb
|
84
84
|
- mongoid_silo.gemspec
|
85
|
+
- spec/factories/block_project_factory.rb
|
86
|
+
- spec/factories/block_project_item_factory.rb
|
85
87
|
- spec/factories/complex_project_factory.rb
|
86
88
|
- spec/factories/multi_silo_project_factory.rb
|
87
89
|
- spec/factories/project_factory.rb
|
@@ -89,9 +91,12 @@ files:
|
|
89
91
|
- spec/models/silo_spec.rb
|
90
92
|
- spec/mongoid.yml
|
91
93
|
- spec/spec_helper.rb
|
94
|
+
- spec/support/models/block_project.rb
|
95
|
+
- spec/support/models/block_project_item.rb
|
92
96
|
- spec/support/models/complex_project.rb
|
93
97
|
- spec/support/models/multi_silo_project.rb
|
94
98
|
- spec/support/models/project.rb
|
99
|
+
- spec/support/silovators/make_block_project_grain_belt.rb
|
95
100
|
- spec/support/silovators/make_complex_grain_belt.rb
|
96
101
|
- spec/support/silovators/make_location_grain_belt.rb
|
97
102
|
- spec/support/silovators/make_name_grain_belt.rb
|
@@ -120,6 +125,8 @@ signing_key:
|
|
120
125
|
specification_version: 3
|
121
126
|
summary: MongoidSilo is a bit like a Grain Elevator, but without the grain.
|
122
127
|
test_files:
|
128
|
+
- spec/factories/block_project_factory.rb
|
129
|
+
- spec/factories/block_project_item_factory.rb
|
123
130
|
- spec/factories/complex_project_factory.rb
|
124
131
|
- spec/factories/multi_silo_project_factory.rb
|
125
132
|
- spec/factories/project_factory.rb
|
@@ -127,9 +134,12 @@ test_files:
|
|
127
134
|
- spec/models/silo_spec.rb
|
128
135
|
- spec/mongoid.yml
|
129
136
|
- spec/spec_helper.rb
|
137
|
+
- spec/support/models/block_project.rb
|
138
|
+
- spec/support/models/block_project_item.rb
|
130
139
|
- spec/support/models/complex_project.rb
|
131
140
|
- spec/support/models/multi_silo_project.rb
|
132
141
|
- spec/support/models/project.rb
|
142
|
+
- spec/support/silovators/make_block_project_grain_belt.rb
|
133
143
|
- spec/support/silovators/make_complex_grain_belt.rb
|
134
144
|
- spec/support/silovators/make_location_grain_belt.rb
|
135
145
|
- spec/support/silovators/make_name_grain_belt.rb
|