locomotive_plugins 1.0.0.beta4 → 1.0.0.beta5
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/CHANGELOG +3 -1
- data/README.md +40 -15
- data/lib/locomotive/plugin.rb +36 -72
- data/lib/locomotive/plugin/class_tracker.rb +54 -0
- data/lib/locomotive/plugin/config_ui.rb +11 -4
- data/lib/locomotive/plugin/liquid.rb +94 -35
- data/lib/locomotive/plugin/liquid/context_helpers.rb +47 -0
- data/lib/locomotive/plugin/liquid/drop_extension.rb +36 -0
- data/lib/locomotive/plugin/liquid/prefixed_filter_module.rb +22 -15
- data/lib/locomotive/plugin/liquid/tag_subclass_methods.rb +16 -14
- data/lib/locomotive_plugins.rb +0 -36
- data/lib/version.rb +1 -1
- data/spec/lib/locomotive/plugin/class_tracker_spec.rb +48 -0
- data/spec/lib/locomotive/plugin/liquid/context_helpers_spec.rb +75 -0
- data/spec/lib/locomotive/plugin/liquid_spec.rb +70 -77
- data/spec/lib/locomotive/plugin_spec.rb +8 -10
- data/spec/support/plugins/my_plugin.rb +18 -3
- metadata +7 -9
- data/lib/locomotive/plugin/db_model.rb +0 -10
- data/lib/locomotive/plugin/db_model_container.rb +0 -18
- data/lib/locomotive/plugin/db_models.rb +0 -111
- data/spec/lib/locomotive/plugin/db_models_spec.rb +0 -206
- data/spec/lib/locomotive_plugins_spec.rb +0 -29
- data/spec/support/plugins/plugin_with_db_model.rb +0 -19
- data/spec/support/plugins/plugin_with_db_model_relationships.rb +0 -22
@@ -14,21 +14,19 @@ module Locomotive
|
|
14
14
|
@plugin.custom_attribute.should == 'Value'
|
15
15
|
end
|
16
16
|
|
17
|
-
it 'should call the
|
17
|
+
it 'should call the given block before custom initialization methods' do
|
18
18
|
@plugin = MyPlugin.new(@config) do |obj|
|
19
19
|
obj.custom_attribute.should be_nil
|
20
20
|
end
|
21
21
|
@plugin.custom_attribute.should_not be_nil
|
22
22
|
end
|
23
23
|
|
24
|
-
it 'should
|
25
|
-
@plugin.
|
26
|
-
@plugin.
|
27
|
-
@plugin.
|
28
|
-
|
29
|
-
|
30
|
-
it 'should have an empty array of before_filters by default' do
|
31
|
-
@useless_plugin.before_filters.should == []
|
24
|
+
it 'should have filter callbacks' do
|
25
|
+
@plugin.expects(:my_method1)
|
26
|
+
@plugin.expects(:my_method2)
|
27
|
+
@plugin.expects(:my_method3)
|
28
|
+
@plugin.run_callbacks(:filter) do
|
29
|
+
end
|
32
30
|
end
|
33
31
|
|
34
32
|
it 'should optionally return a liquid drop' do
|
@@ -42,7 +40,7 @@ module Locomotive
|
|
42
40
|
end
|
43
41
|
|
44
42
|
it 'should optionally return liquid tags' do
|
45
|
-
|
43
|
+
UselessPlugin.liquid_tags.should == {}
|
46
44
|
PluginWithTags.liquid_tags.should == {
|
47
45
|
:paragraph => PluginWithTags::Paragraph,
|
48
46
|
:newline => PluginWithTags::Newline
|
@@ -4,13 +4,20 @@ module Locomotive
|
|
4
4
|
include Locomotive::Plugin
|
5
5
|
|
6
6
|
module Filters
|
7
|
+
def filter(input)
|
8
|
+
input
|
9
|
+
end
|
7
10
|
end
|
8
11
|
|
9
12
|
class MyDrop < ::Liquid::Drop
|
10
13
|
end
|
11
14
|
|
15
|
+
class MyTag < ::Liquid::Tag
|
16
|
+
end
|
17
|
+
|
12
18
|
before_filter :my_method1
|
13
|
-
|
19
|
+
after_filter :my_method2
|
20
|
+
around_filter :my_method3
|
14
21
|
|
15
22
|
attr_accessor :custom_attribute
|
16
23
|
|
@@ -31,12 +38,20 @@ module Locomotive
|
|
31
38
|
Filters
|
32
39
|
end
|
33
40
|
|
41
|
+
def self.liquid_tags
|
42
|
+
{ 'my_tag' => MyTag }
|
43
|
+
end
|
44
|
+
|
34
45
|
def my_method1
|
35
|
-
'This is my
|
46
|
+
'This is my before filter!'
|
36
47
|
end
|
37
48
|
|
38
49
|
def my_method2
|
39
|
-
'This is my
|
50
|
+
'This is my after filter!'
|
51
|
+
end
|
52
|
+
|
53
|
+
def my_method3
|
54
|
+
'This is my around filter!'
|
40
55
|
end
|
41
56
|
end
|
42
57
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: locomotive_plugins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta5
|
5
5
|
prerelease: 6
|
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:
|
12
|
+
date: 2013-01-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: locomotive_liquid
|
@@ -115,12 +115,12 @@ extensions: []
|
|
115
115
|
extra_rdoc_files: []
|
116
116
|
files:
|
117
117
|
- Rakefile
|
118
|
-
- lib/locomotive/plugin/db_model_container.rb
|
119
118
|
- lib/locomotive/plugin/liquid.rb
|
119
|
+
- lib/locomotive/plugin/class_tracker.rb
|
120
120
|
- lib/locomotive/plugin/liquid/prefixed_filter_module.rb
|
121
|
+
- lib/locomotive/plugin/liquid/drop_extension.rb
|
121
122
|
- lib/locomotive/plugin/liquid/tag_subclass_methods.rb
|
122
|
-
- lib/locomotive/plugin/
|
123
|
-
- lib/locomotive/plugin/db_model.rb
|
123
|
+
- lib/locomotive/plugin/liquid/context_helpers.rb
|
124
124
|
- lib/locomotive/plugin/config_ui.rb
|
125
125
|
- lib/locomotive/plugin.rb
|
126
126
|
- lib/version.rb
|
@@ -133,16 +133,14 @@ files:
|
|
133
133
|
- spec/support/plugins/plugin_with_filter.rb
|
134
134
|
- spec/support/plugins/plugin_with_many_filter_modules.rb
|
135
135
|
- spec/support/plugins/my_plugin.rb
|
136
|
-
- spec/support/plugins/plugin_with_db_model_relationships.rb
|
137
|
-
- spec/support/plugins/plugin_with_db_model.rb
|
138
136
|
- spec/support/factories.rb
|
139
137
|
- spec/fixtures/config_template.haml
|
140
138
|
- spec/fixtures/config_template.html
|
139
|
+
- spec/lib/locomotive/plugin/class_tracker_spec.rb
|
140
|
+
- spec/lib/locomotive/plugin/liquid/context_helpers_spec.rb
|
141
141
|
- spec/lib/locomotive/plugin/liquid_spec.rb
|
142
|
-
- spec/lib/locomotive/plugin/db_models_spec.rb
|
143
142
|
- spec/lib/locomotive/plugin/config_ui_spec.rb
|
144
143
|
- spec/lib/locomotive/plugin_spec.rb
|
145
|
-
- spec/lib/locomotive_plugins_spec.rb
|
146
144
|
- README.md
|
147
145
|
- CHANGELOG
|
148
146
|
homepage: https://github.com/colibri-software/locomotive_plugins
|
@@ -1,18 +0,0 @@
|
|
1
|
-
|
2
|
-
module Locomotive
|
3
|
-
module Plugin
|
4
|
-
# The superclass of the DBModelContainer object for each plugin. This
|
5
|
-
# container has the actual relationships to the database objects
|
6
|
-
class DBModelContainer
|
7
|
-
include Mongoid::Document
|
8
|
-
|
9
|
-
field :container_name
|
10
|
-
|
11
|
-
def self.for_name(container_name)
|
12
|
-
where(container_name: container_name).first || \
|
13
|
-
new(container_name: container_name)
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,111 +0,0 @@
|
|
1
|
-
|
2
|
-
module Locomotive
|
3
|
-
module Plugin
|
4
|
-
|
5
|
-
# Utility methods for dealing with DB Models
|
6
|
-
module DBModels
|
7
|
-
|
8
|
-
# @private
|
9
|
-
def self.included(base)
|
10
|
-
base.extend ClassMethods
|
11
|
-
end
|
12
|
-
|
13
|
-
# @private
|
14
|
-
module ClassMethods
|
15
|
-
|
16
|
-
def add_db_model_class_methods(base)
|
17
|
-
base.class_eval <<-CODE
|
18
|
-
class DBModelContainer < ::Locomotive::Plugin::DBModelContainer
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.db_model_container_class
|
22
|
-
DBModelContainer
|
23
|
-
end
|
24
|
-
CODE
|
25
|
-
base.extend DBModelClassMethods
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
# @private
|
31
|
-
module DBModelClassMethods
|
32
|
-
|
33
|
-
protected
|
34
|
-
|
35
|
-
def create_has_many_relationship(name, klass)
|
36
|
-
self.db_model_container_class.has_many(name,
|
37
|
-
class_name: klass.to_s, inverse_of: :db_model_container,
|
38
|
-
autosave: true, dependent: :destroy)
|
39
|
-
klass.belongs_to(:db_model_container,
|
40
|
-
class_name: db_model_container_class.to_s, inverse_of: name)
|
41
|
-
|
42
|
-
self.define_passthrough_methods_to_container(name, "#{name}=",
|
43
|
-
"#{name}_ids", "#{name}_ids=")
|
44
|
-
end
|
45
|
-
|
46
|
-
def create_has_one_relationship(name, klass)
|
47
|
-
self.db_model_container_class.has_one(name,
|
48
|
-
class_name: klass.to_s, inverse_of: :db_model_container,
|
49
|
-
autosave: true, dependent: :destroy)
|
50
|
-
klass.belongs_to(:db_model_container,
|
51
|
-
class_name: db_model_container_class.to_s, inverse_of: name)
|
52
|
-
|
53
|
-
self.define_passthrough_methods_to_container(name, "#{name}=",
|
54
|
-
"build_#{name}", "create_#{name}")
|
55
|
-
end
|
56
|
-
|
57
|
-
def define_passthrough_methods_to_container(*methods)
|
58
|
-
class_eval do
|
59
|
-
methods.each do |meth|
|
60
|
-
define_method(meth) do |*args|
|
61
|
-
db_model_container.send(meth, *args)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
# Save the DB Model container
|
70
|
-
def save_db_model_container
|
71
|
-
self.db_model_container.save
|
72
|
-
end
|
73
|
-
|
74
|
-
# Get the DB Model container
|
75
|
-
def db_model_container
|
76
|
-
@db_model_containers ||= {}
|
77
|
-
name = self.current_db_model_container_name
|
78
|
-
@db_model_containers[name] ||= load_db_model_container(name)
|
79
|
-
end
|
80
|
-
|
81
|
-
# Set the current DB Model container
|
82
|
-
def use_db_model_container(name)
|
83
|
-
@current_db_model_container_name = name
|
84
|
-
end
|
85
|
-
|
86
|
-
# Reset to the default DB Model container
|
87
|
-
def reset_current_db_model_container
|
88
|
-
self.use_db_model_container(nil)
|
89
|
-
end
|
90
|
-
|
91
|
-
# Set the current DB Model container for the duration of the block
|
92
|
-
def with_db_model_container(name, &block)
|
93
|
-
old_name = self.current_db_model_container_name
|
94
|
-
self.use_db_model_container(name)
|
95
|
-
block.call
|
96
|
-
self.use_db_model_container(old_name)
|
97
|
-
end
|
98
|
-
|
99
|
-
# The name of the current container being used
|
100
|
-
attr_reader :current_db_model_container_name
|
101
|
-
|
102
|
-
protected
|
103
|
-
|
104
|
-
def load_db_model_container(name)
|
105
|
-
self.class.db_model_container_class.for_name(name)
|
106
|
-
end
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
end
|
111
|
-
end
|
@@ -1,206 +0,0 @@
|
|
1
|
-
|
2
|
-
module Locomotive
|
3
|
-
module Plugin
|
4
|
-
describe DBModels do
|
5
|
-
|
6
|
-
before(:each) do
|
7
|
-
plugin = PluginWithDBModel.new({})
|
8
|
-
plugin.build_visit_count(count: 5)
|
9
|
-
plugin.items.build(name: 'First Item')
|
10
|
-
plugin.items.build(name: 'Second Item')
|
11
|
-
plugin.save_db_model_container.should be_true
|
12
|
-
|
13
|
-
# Reload from the database
|
14
|
-
@plugin_with_db_model = PluginWithDBModel.new({})
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'should persist DBModel items' do
|
18
|
-
@plugin_with_db_model.visit_count.count.should == 5
|
19
|
-
|
20
|
-
@plugin_with_db_model.items.count.should == 2
|
21
|
-
@plugin_with_db_model.items[0].name.should == 'First Item'
|
22
|
-
@plugin_with_db_model.items[1].name.should == 'Second Item'
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'should allow mongoid queries on persisted DBModel items' do
|
26
|
-
@plugin_with_db_model.items.where(name: /First/).count.should == 1
|
27
|
-
@plugin_with_db_model.items.where(name: /First/).first.name.should == 'First Item'
|
28
|
-
|
29
|
-
@plugin_with_db_model.items.where(name: /Item/).count.should == 2
|
30
|
-
@plugin_with_db_model.items.where(name: /Item/)[0].name.should == 'First Item'
|
31
|
-
@plugin_with_db_model.items.where(name: /Item/)[1].name.should == 'Second Item'
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should reference DBModel items in a document for the plugin class' do
|
35
|
-
@plugin_with_db_model.visit_count.db_model_container.kind_of?(
|
36
|
-
PluginWithDBModel::DBModelContainer).should be_true
|
37
|
-
@plugin_with_db_model.items.first.db_model_container.kind_of?(
|
38
|
-
PluginWithDBModel::DBModelContainer).should be_true
|
39
|
-
|
40
|
-
@plugin_with_db_model.visit_count.relations[
|
41
|
-
'db_model_container'].relation.should \
|
42
|
-
== Mongoid::Relations::Referenced::In
|
43
|
-
@plugin_with_db_model.items.relations[
|
44
|
-
'db_model_container'].relation.should \
|
45
|
-
== Mongoid::Relations::Referenced::In
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'should run all validations for DBModel items' do
|
49
|
-
@plugin_with_db_model.items.build(name: '')
|
50
|
-
@plugin_with_db_model.save_db_model_container.should be_false
|
51
|
-
|
52
|
-
@plugin_with_db_model.db_model_container.errors.messages.should == {
|
53
|
-
:items => [ 'is invalid' ]
|
54
|
-
}
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'should destroy the contained objects when the container is destroyed' do
|
58
|
-
vc = @plugin_with_db_model.visit_count
|
59
|
-
i0 = @plugin_with_db_model.items[0]
|
60
|
-
i1 = @plugin_with_db_model.items[1]
|
61
|
-
|
62
|
-
DBModel.all.for_ids(vc.id, i0.id, i1.id).count.should == 3
|
63
|
-
|
64
|
-
@plugin_with_db_model.db_model_container.destroy
|
65
|
-
|
66
|
-
DBModel.all.for_ids(vc.id, i0.id, i1.id).count.should == 0
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'should allow relationships between DBModels' do
|
70
|
-
plugin = PluginWithDBModelRelationships.new({})
|
71
|
-
|
72
|
-
t1 = plugin.teachers.build(name: 'Mr. Adams')
|
73
|
-
t2 = plugin.teachers.build(name: 'Ms. Boudreau')
|
74
|
-
|
75
|
-
s1 = plugin.students.build(name: 'Alex', teacher: t1)
|
76
|
-
s2 = plugin.students.build(name: 'Billy', teacher: t1)
|
77
|
-
s3 = plugin.students.build(name: 'Caitlyn', teacher: t2)
|
78
|
-
|
79
|
-
plugin.save_db_model_container.should be_true
|
80
|
-
|
81
|
-
# Reload from database
|
82
|
-
plugin = PluginWithDBModelRelationships.new({})
|
83
|
-
|
84
|
-
# Check all the names and relationships to make sure they were
|
85
|
-
# persisted
|
86
|
-
teachers = plugin.teachers.to_a
|
87
|
-
students = plugin.students.to_a
|
88
|
-
|
89
|
-
teachers[0].name.should == 'Mr. Adams'
|
90
|
-
teachers[0].students.count.should == 2
|
91
|
-
teachers[0].students.should include(s1)
|
92
|
-
teachers[0].students.should include(s2)
|
93
|
-
|
94
|
-
teachers[1].name.should == 'Ms. Boudreau'
|
95
|
-
teachers[1].students.count.should == 1
|
96
|
-
teachers[1].students.should include(s3)
|
97
|
-
|
98
|
-
s1.name.should == 'Alex'
|
99
|
-
s1.teacher.should == t1
|
100
|
-
s2.name.should == 'Billy'
|
101
|
-
s2.teacher.should == t1
|
102
|
-
s3.name.should == 'Caitlyn'
|
103
|
-
s3.teacher.should == t2
|
104
|
-
end
|
105
|
-
|
106
|
-
context 'with multiple containers' do
|
107
|
-
|
108
|
-
it 'should save the data in the correct container' do
|
109
|
-
plugin = PluginWithDBModel.new({})
|
110
|
-
|
111
|
-
plugin.with_db_model_container('my_container') do
|
112
|
-
plugin.build_visit_count(count: 10)
|
113
|
-
end
|
114
|
-
|
115
|
-
plugin.use_db_model_container('my_other_container')
|
116
|
-
plugin.build_visit_count(count: 20)
|
117
|
-
plugin.save_db_model_container.should be_true
|
118
|
-
plugin.reset_current_db_model_container
|
119
|
-
|
120
|
-
plugin.use_db_model_container('my_container')
|
121
|
-
plugin.db_model_container.changed?.should be_true
|
122
|
-
plugin.save_db_model_container.should be_true
|
123
|
-
plugin.db_model_container.changed?.should be_false
|
124
|
-
|
125
|
-
# Reload from the database
|
126
|
-
@plugin_with_db_model = PluginWithDBModel.new({})
|
127
|
-
|
128
|
-
# Make sure everything is in the right container and make sure we can
|
129
|
-
# access the containers how we want
|
130
|
-
@plugin_with_db_model.with_db_model_container('my_other_container') do
|
131
|
-
@plugin_with_db_model.current_db_model_container_name.should ==
|
132
|
-
'my_other_container'
|
133
|
-
@plugin_with_db_model.visit_count.count.should == 20
|
134
|
-
end
|
135
|
-
|
136
|
-
@plugin_with_db_model.use_db_model_container('my_container')
|
137
|
-
@plugin_with_db_model.current_db_model_container_name.should ==
|
138
|
-
'my_container'
|
139
|
-
@plugin_with_db_model.visit_count.count.should == 10
|
140
|
-
|
141
|
-
@plugin_with_db_model.reset_current_db_model_container
|
142
|
-
@plugin_with_db_model.current_db_model_container_name.should be_nil
|
143
|
-
@plugin_with_db_model.visit_count.count.should == 5
|
144
|
-
end
|
145
|
-
|
146
|
-
it 'should revert the current container name after using with_db_model_container' do
|
147
|
-
@plugin_with_db_model.use_db_model_container('fake_container')
|
148
|
-
@plugin_with_db_model.current_db_model_container_name.should ==
|
149
|
-
'fake_container'
|
150
|
-
|
151
|
-
@plugin_with_db_model.with_db_model_container('my_container') do
|
152
|
-
@plugin_with_db_model.current_db_model_container_name.should ==
|
153
|
-
'my_container'
|
154
|
-
end
|
155
|
-
|
156
|
-
@plugin_with_db_model.current_db_model_container_name.should ==
|
157
|
-
'fake_container'
|
158
|
-
end
|
159
|
-
|
160
|
-
it 'should only load each container once' do
|
161
|
-
container_names = %w{my_container my_other_container}
|
162
|
-
|
163
|
-
# The default container has already been loaded
|
164
|
-
@plugin_with_db_model.expects(:load_db_model_container).with(nil).never
|
165
|
-
|
166
|
-
# The others should only be called once. Just return something
|
167
|
-
# non-nil
|
168
|
-
container_names.each do |name|
|
169
|
-
@plugin_with_db_model.expects(:load_db_model_container).with(
|
170
|
-
name).returns(1).once
|
171
|
-
end
|
172
|
-
|
173
|
-
3.times do
|
174
|
-
container_names.each do |name|
|
175
|
-
@plugin_with_db_model.with_db_model_container(name) do
|
176
|
-
# Access the container
|
177
|
-
@plugin_with_db_model.db_model_container
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
it 'should not share containers between plugin objects' do
|
184
|
-
p0 = PluginWithDBModel.new({})
|
185
|
-
p1 = PluginWithDBModelRelationships.new({})
|
186
|
-
|
187
|
-
# Default container
|
188
|
-
p0.save_db_model_container.should be_true
|
189
|
-
p1.save_db_model_container.should be_true
|
190
|
-
p0.db_model_container.should_not == p1.db_model_container
|
191
|
-
|
192
|
-
# Named container
|
193
|
-
p0.with_db_model_container('my_container') do
|
194
|
-
p1.with_db_model_container('my_container') do
|
195
|
-
p0.save_db_model_container.should be_true
|
196
|
-
p1.save_db_model_container.should be_true
|
197
|
-
p0.db_model_container.should_not == p1.db_model_container
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
end
|
203
|
-
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|