lolita 3.1.1 → 3.1.2
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 +3 -3
- data/History.rdoc +19 -1
- data/README.rdoc +42 -0
- data/VERSION +1 -1
- data/app/controllers/lolita/rest_controller.rb +51 -19
- data/lib/lolita.rb +10 -10
- data/lib/lolita/builder.rb +9 -8
- data/lib/lolita/controllers/component_helpers.rb +25 -7
- data/lib/lolita/controllers/internal_helpers.rb +2 -0
- data/lib/lolita/hooks.rb +33 -12
- data/lib/lolita/rails/all.rb +6 -1
- data/lib/lolita/rails/routes.rb +1 -1
- data/lolita.gemspec +6 -2
- data/spec/controllers/internal_helpers_spec.rb +20 -0
- data/spec/controllers/lolita_rest_nested_resources_spec.rb +33 -0
- data/spec/controllers/lolita_rest_spec.rb +11 -0
- data/spec/hooks_spec.rb +67 -2
- data/spec/navigation/branch_spec.rb +80 -0
- data/spec/navigation/tree_spec.rb +2 -2
- data/spec/rails_app/app/mongoid/post.rb +3 -0
- metadata +7 -3
data/Gemfile
CHANGED
@@ -7,9 +7,9 @@ gem "abstract"
|
|
7
7
|
gem "builder", "~> 2.1.2" #cucumber asks for builder 3 but rails supports 2.1
|
8
8
|
|
9
9
|
group :mongoid do
|
10
|
-
gem "mongo"
|
11
|
-
gem "mongoid", "~> 2.0.0
|
12
|
-
gem "bson_ext"
|
10
|
+
gem "mongo", "~> 1.3.0"
|
11
|
+
gem "mongoid", "~> 2.0.0"
|
12
|
+
gem "bson_ext", "~> 1.3.0"
|
13
13
|
end
|
14
14
|
|
15
15
|
#gem 'cover_me', '>= 1.0.0.rc6', :group => :test
|
data/History.rdoc
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
=== Version 3.1.2 / 2011-04-14
|
2
|
+
* Enhancements
|
3
|
+
* Hooks for Lolita::RestController addeed (Arturs Meisters)
|
4
|
+
* Form save response splited in different methods for easy way to override (Arturs Meisters)
|
5
|
+
* Hooks for #render_components (Arturs Meisters)
|
6
|
+
* Hook #run return results from methods and blocks as one big string (Arturs Meisters)
|
7
|
+
* Hooks :run_scope inventend (Arturs Meisters)
|
8
|
+
|
9
|
+
* Bug fixes
|
10
|
+
* Migration detection fixed (Arturs Meisters)
|
11
|
+
* Hooks named fire methods fixed (Arturs Meisters)
|
12
|
+
* Bug fixes in hooks (Arturs Meisters)
|
13
|
+
* Builder bug fix, in production (Arturs Meisters)
|
14
|
+
|
15
|
+
=== Version 3.1.1 / 2011-04-13
|
16
|
+
* Enhancements
|
17
|
+
* Filters for list added (Gatis Tomsons)
|
18
|
+
|
1
19
|
=== Version 3.1.0 / 2011-04-12
|
2
20
|
* Enhancements
|
3
21
|
* Hooks added (Arturs Meisters)
|
@@ -66,5 +84,5 @@
|
|
66
84
|
* New look (Rolands Bondars)
|
67
85
|
|
68
86
|
=== Versions before 3.0.3
|
69
|
-
Lolita 3
|
87
|
+
Lolita 3 is completely different from previous versions and don't have any compability or architecture same as
|
70
88
|
old versions.
|
data/README.rdoc
CHANGED
@@ -48,7 +48,49 @@ to all controllers.
|
|
48
48
|
If you decide to use some newer version, you most likely should copy new assets to your project.
|
49
49
|
This can be done with
|
50
50
|
rails g lolita:assets
|
51
|
+
===Using hooks
|
51
52
|
|
53
|
+
Lolita define hooks for RestController and for components.
|
54
|
+
====RestController hooks
|
55
|
+
|
56
|
+
There are two kind of hooks for all actions - <em>before_[action name]</em> and <em>after_[action name]</em>.
|
57
|
+
Define callbacks for those hooks outside of controller. This will call User#log_action each time when #destroy
|
58
|
+
action is requested.
|
59
|
+
Lolita::RestController.before_destroy do
|
60
|
+
User.log_action("Going to delete #{params[:id]}")
|
61
|
+
end
|
62
|
+
Also you can define callbacks in your controllers that extend Lolita::RestController. This will call #set_default_params
|
63
|
+
each time #new action is requested.
|
64
|
+
class PostController < Lolita::RestController
|
65
|
+
before_new :set_default_params
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def set_default_params
|
70
|
+
params[:post][:title]="-Your title goes here-"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
====Component hooks
|
74
|
+
|
75
|
+
Components have three hooks - <em>before</em>, <em>after</em> and <em>around</em>.
|
76
|
+
Component hooks are different from controller hooks with names. Each component has it's own name, that is used to
|
77
|
+
call component, like
|
78
|
+
render_component :"lolita/configuration/list/display"
|
79
|
+
#same as
|
80
|
+
render_component :"lolita/configuration/list", :display
|
81
|
+
and this name is used to add callback for component. As components is not related to specific class, then there
|
82
|
+
are only one way to define callback for them.
|
83
|
+
Lolita::Hooks.component(:"lolita/configuration/list/display").before do
|
84
|
+
"<div>My Custom text</div>"
|
85
|
+
end
|
86
|
+
That what are inside of blocks depends on place where you define callback if it is in <i>.rb</i> file, than you
|
87
|
+
should put HTML in quotes, if in <i>.erb</i> and similar files then there is no need for that. Also blocks with
|
88
|
+
Ruby code only return last line, so you should probably define HTML as shown in previous example.
|
89
|
+
For <b>around</b> callback if you pass block, then original content will be replaced with that, but if you want
|
90
|
+
to let original content inside of your block content than it is done like this with #let_content method.
|
91
|
+
Lolita::Hooks.component(:"lolita/configuration/list/display").around do
|
92
|
+
"<div style='color:red'>#{let_content}</div>"
|
93
|
+
end
|
52
94
|
==License
|
53
95
|
|
54
96
|
Lolita is under MIT license. See LICENSE.txt[https://github.com/ithouse/lolita/blob/master/LICENSE.txt]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.
|
1
|
+
3.1.2
|
@@ -1,44 +1,57 @@
|
|
1
1
|
class Lolita::RestController < ApplicationController
|
2
2
|
include Lolita::Controllers::UserHelpers
|
3
3
|
include Lolita::Controllers::InternalHelpers
|
4
|
+
|
5
|
+
include Lolita::Hooks
|
6
|
+
add_hook :before_new, :after_new, :before_create,:after_create,:before_edit,:after_edit
|
7
|
+
add_hook :before_update,:after_update,:before_destroy,:after_destroy,:before_index,:after_index
|
8
|
+
add_hook :before_build_resource, :after_build_resource
|
4
9
|
|
5
10
|
before_filter :authenticate_lolita_user!
|
6
11
|
layout "lolita/application"
|
7
12
|
|
8
13
|
def new
|
14
|
+
self.run(:before_new)
|
9
15
|
build_resource
|
10
16
|
show_form
|
11
17
|
end
|
12
18
|
|
13
19
|
def create
|
20
|
+
self.run(:before_create)
|
14
21
|
build_resource
|
15
22
|
save_and_redirect
|
16
23
|
end
|
17
24
|
|
18
25
|
def edit
|
26
|
+
self.run(:before_edit)
|
19
27
|
get_resource
|
20
28
|
show_form
|
21
29
|
end
|
22
30
|
|
23
31
|
def update
|
32
|
+
self.run(:before_update)
|
24
33
|
get_resource
|
25
34
|
if self.resource
|
26
35
|
self.resource=resource_with_attributes(self.resource,resource_attributes)
|
27
36
|
save_and_redirect
|
37
|
+
|
28
38
|
end
|
29
39
|
end
|
30
40
|
|
31
41
|
def destroy
|
42
|
+
self.run(:before_destroy)
|
32
43
|
get_resource
|
33
44
|
if self.resource && self.resource.destroy
|
34
45
|
flash.now[:notice] = I18n.t "lolita.shared.destroy_notice"
|
35
46
|
else
|
36
47
|
flash.now[:alert] = I18n.t "lolita.shared.destroy_alert"
|
37
48
|
end
|
49
|
+
self.run(:after_destroy)
|
38
50
|
redirect_to :action=>"index"
|
39
51
|
end
|
40
52
|
|
41
53
|
def index
|
54
|
+
self.run(:before_index)
|
42
55
|
respond_to do |format|
|
43
56
|
format.html do
|
44
57
|
build_response_for(:list,:page=>page)
|
@@ -47,40 +60,59 @@ class Lolita::RestController < ApplicationController
|
|
47
60
|
render :json=>page
|
48
61
|
end
|
49
62
|
end
|
63
|
+
self.run(:after_index)
|
50
64
|
end
|
51
65
|
|
52
66
|
private
|
53
67
|
|
54
68
|
def show_form
|
55
|
-
#TODO Valdis: ja es extendoju rest_controller un gribu pārdefinēt edit actionu, man vajag lai
|
56
|
-
# varu norādīt citu šablonu, piemēram, manā gadījumā ir services_controller un jamais meklē
|
57
|
-
# "services/form", bet es gribu izmantot to pašu "lolita/rest/form"
|
58
|
-
# tagad man viss šitais jāpārkopē uz projektu
|
59
|
-
|
60
69
|
build_response_for(:tabs)
|
70
|
+
self.run(:"after_#{params[:action]}")
|
61
71
|
if request.xhr?
|
62
|
-
render
|
72
|
+
render "/lolita/rest/form", :layout => false
|
63
73
|
else
|
64
|
-
render
|
74
|
+
render "/lolita/rest/form"
|
65
75
|
end
|
66
76
|
end
|
67
77
|
|
68
78
|
def save_and_redirect
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
end
|
78
|
-
format.json do
|
79
|
-
render :status => self.resource.save ? 200 : 400, :json => self.resource
|
80
|
-
end
|
79
|
+
respond_to do |format|
|
80
|
+
if self.resource.save
|
81
|
+
self.resource.reload
|
82
|
+
format.html{ respond_html_200}
|
83
|
+
format.json{ respond_json_200}
|
84
|
+
else
|
85
|
+
format.html{ respond_html_400 }
|
86
|
+
format.json{ respond_json_400 }
|
81
87
|
end
|
88
|
+
end
|
82
89
|
end
|
83
90
|
|
91
|
+
def respond_html_200
|
92
|
+
response.headers["Validation"] = 'true'
|
93
|
+
flash.now[:notice] = I18n.t "lolita.shared.save_notice"
|
94
|
+
show_form
|
95
|
+
end
|
96
|
+
|
97
|
+
def respond_html_400
|
98
|
+
response.headers["Validation"] = 'true'
|
99
|
+
flash.now[:alert] = I18n.t "lolita.shared.save_alert"
|
100
|
+
show_form
|
101
|
+
end
|
102
|
+
|
103
|
+
def respond_json_200
|
104
|
+
respond_json(200)
|
105
|
+
end
|
106
|
+
|
107
|
+
def respond_json_400
|
108
|
+
respond_json(400)
|
109
|
+
end
|
110
|
+
|
111
|
+
def respond_json(status)
|
112
|
+
self.run(:"after_#{params[:action]}")
|
113
|
+
render :status=>status, :json=>self.resource
|
114
|
+
end
|
115
|
+
|
84
116
|
def to_list
|
85
117
|
builder=build_response_for(:list,:page=>page)
|
86
118
|
render :index
|
data/lib/lolita.rb
CHANGED
@@ -4,16 +4,16 @@ LOLITA_VERSION=File.read(File.expand_path("../../VERSION",__FILE__)).gsub(/[^.\w
|
|
4
4
|
puts "=> Lolita #{LOLITA_VERSION} starting#{defined?(Rails) ? " with Rails" : ""}"
|
5
5
|
|
6
6
|
# TODO should allow run lolita seperated
|
7
|
-
unless (["-d","--debug"] & ARGV).empty?
|
8
|
-
|
9
|
-
|
10
|
-
else
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
7
|
+
# unless (["-d","--debug"] & ARGV).empty?
|
8
|
+
# require "ruby-debug"
|
9
|
+
# Debugger.settings[:autoeval]=true
|
10
|
+
# else
|
11
|
+
# unless self.respond_to?(:debugger)
|
12
|
+
# def debugger
|
13
|
+
# warn "Debugger called at #{caller.first} was ignored, run lolita with -d to attatch debugger."
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
# end
|
17
17
|
|
18
18
|
require 'abstract'
|
19
19
|
require 'active_support/core_ext/numeric/time'
|
data/lib/lolita/builder.rb
CHANGED
@@ -34,14 +34,15 @@ module Lolita
|
|
34
34
|
# default state is <code>:display</code>
|
35
35
|
def get_builder(*value)
|
36
36
|
if value && !value.empty?
|
37
|
-
|
37
|
+
builder_values_from(value)
|
38
38
|
elsif @builder
|
39
|
-
|
39
|
+
builder_values_from(@builder)
|
40
40
|
else
|
41
41
|
unless @builder
|
42
|
-
|
42
|
+
default_builder
|
43
|
+
else
|
44
|
+
@builder
|
43
45
|
end
|
44
|
-
@builder
|
45
46
|
end
|
46
47
|
end
|
47
48
|
|
@@ -52,13 +53,13 @@ module Lolita
|
|
52
53
|
|
53
54
|
private
|
54
55
|
|
55
|
-
def
|
56
|
+
def builder_values_from value
|
56
57
|
if value.is_a?(Hash)
|
57
|
-
|
58
|
+
value
|
58
59
|
elsif value.is_a?(Array)
|
59
|
-
|
60
|
+
{:name=>fix_name(value[0]),:state=>value[1] || default_build_state}
|
60
61
|
else
|
61
|
-
|
62
|
+
{:name=>fix_name(value),:state=>default_build_state}
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
@@ -26,23 +26,41 @@ module Lolita
|
|
26
26
|
# render_component "lolita/list", :display
|
27
27
|
# render_component "lolita/list/display"
|
28
28
|
def render_component *args
|
29
|
-
|
30
29
|
@opts=args.extract_options!
|
31
30
|
name=args[0]
|
32
31
|
state=args[1]
|
33
32
|
format=@opts.delete(:format)
|
33
|
+
|
34
34
|
raise "Can't render component without name!" unless name
|
35
35
|
will_use_component name
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
component_name=File.join(name.to_s,state ? state.to_s : nil)
|
37
|
+
partial_name=File.join("/components",component_name)
|
38
|
+
output=output_component(partial_name,component_name,:format=>format,:locals=>@opts)
|
39
|
+
self.respond_to?(:raw) ? raw(output) : output
|
40
|
+
end
|
41
|
+
|
42
|
+
def output_component(partial_name,name,options={})
|
43
|
+
output=""
|
44
|
+
if options[:format]
|
45
|
+
with_format(options[:format]) do
|
46
|
+
output << output_with_callbacks(partial_name,name,options[:locals])
|
40
47
|
end
|
41
48
|
else
|
42
|
-
|
49
|
+
output << output_with_callbacks(partial_name,name,options[:locals])
|
43
50
|
end
|
51
|
+
output
|
44
52
|
end
|
45
|
-
|
53
|
+
|
54
|
+
def output_with_callbacks(partial_name,name,locals)
|
55
|
+
output= Lolita::Hooks.component(name).run(:before,:run_scope=>self).to_s
|
56
|
+
block_output=Lolita::Hooks.component(name).run(:around, :run_scope=>self) do
|
57
|
+
render(:partial=>partial_name,:locals=>locals)
|
58
|
+
end
|
59
|
+
output << block_output.to_s
|
60
|
+
output << Lolita::Hooks.component(name).run(:after,:run_scope=>self).to_s
|
61
|
+
output
|
62
|
+
end
|
63
|
+
|
46
64
|
def with_format(format, &block)
|
47
65
|
old_formats = formats
|
48
66
|
self.formats = [format]
|
@@ -60,8 +60,10 @@ module Lolita
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def build_resource(attributes=nil)
|
63
|
+
self.run(:before_build_resource)
|
63
64
|
attributes||=resource_attributes
|
64
65
|
self.resource=resource_with_attributes(resource_class.new,attributes)
|
66
|
+
self.run(:after_build_resource)
|
65
67
|
end
|
66
68
|
|
67
69
|
def build_response_for(conf_part,options={})
|
data/lib/lolita/hooks.rb
CHANGED
@@ -92,6 +92,7 @@ module Lolita
|
|
92
92
|
end
|
93
93
|
|
94
94
|
module ClassMethods
|
95
|
+
attr_accessor :hooks_run_scope
|
95
96
|
|
96
97
|
# Setter for #hook_scope.
|
97
98
|
def hooks_scope=(object)
|
@@ -154,14 +155,17 @@ module Lolita
|
|
154
155
|
# MyClass.run(:before_save,:after_save,:scope=>MyClass.new)
|
155
156
|
# # this will call callbacks in MyClass instance scope, that means that self will be MyClass instance.
|
156
157
|
def run(*hook_names,&block)
|
158
|
+
|
159
|
+
result=nil
|
157
160
|
options=hook_names.extract_options!
|
158
161
|
(hook_names || []).each do |hook_name|
|
159
162
|
raise Lolita::HookNotFound, "Hook #{hook_name} is not defined for #{self}." unless self.has_hook?(hook_name)
|
160
|
-
in_hooks_scope(options[:scope]) do
|
163
|
+
in_hooks_scope(options[:scope],options[:run_scope]) do
|
161
164
|
callback=get_callback(hook_name)
|
162
|
-
run_callback(callback,&block)
|
165
|
+
result=run_callback(callback,&block)
|
163
166
|
end
|
164
167
|
end
|
168
|
+
result
|
165
169
|
end
|
166
170
|
|
167
171
|
# Is hook with <em>name</em> is defined for class.
|
@@ -192,7 +196,7 @@ module Lolita
|
|
192
196
|
# Set #method_missing
|
193
197
|
def recognize_hook_methods method_name, *args, &block
|
194
198
|
if method_name.to_s.match(/^run_(\w+)/)
|
195
|
-
self.run($1,&block)
|
199
|
+
self.run($1,*args,&block)
|
196
200
|
true
|
197
201
|
end
|
198
202
|
end
|
@@ -201,46 +205,61 @@ module Lolita
|
|
201
205
|
|
202
206
|
# Switch between self and given <em>scope</em>. Block will be executed with <em>scope</em>.
|
203
207
|
# And after that it will switch back to self.
|
204
|
-
def in_hooks_scope(scope)
|
208
|
+
def in_hooks_scope(scope,run_scope=nil)
|
205
209
|
begin
|
206
210
|
self.hooks_scope=scope||self
|
211
|
+
if run_scope
|
212
|
+
run_scope.define_singleton_method(:let_content) do
|
213
|
+
scope.let_content
|
214
|
+
end
|
215
|
+
end
|
216
|
+
self.hooks_run_scope=run_scope || self.hooks_scope
|
207
217
|
yield
|
208
218
|
ensure
|
209
219
|
self.hooks_scope=self
|
220
|
+
self.hooks_run_scope=self.hooks_scope
|
210
221
|
end
|
211
222
|
end
|
212
223
|
|
213
224
|
# Run callback. Each callback is Hash with <i>:methods</i> Array and </i>:blocks</i> Array
|
214
225
|
def run_callback(callback,&block)
|
215
|
-
run_methods(callback[:methods],&block)
|
216
|
-
run_blocks(callback[:blocks],&block)
|
226
|
+
method_results=run_methods(callback[:methods],&block)
|
227
|
+
block_results=run_blocks(callback[:blocks],&block)
|
228
|
+
method_results+block_results
|
217
229
|
end
|
218
230
|
|
219
231
|
# Run methods from <em>methods</em> Array
|
220
232
|
def run_methods methods, &block
|
233
|
+
result=""
|
221
234
|
(methods||[]).each do |method_name|
|
222
|
-
|
235
|
+
result << (hooks_run_scope.__send__(method_name,&block)).to_s
|
223
236
|
end
|
237
|
+
result
|
224
238
|
end
|
225
239
|
|
226
240
|
# Run blocks from <em>blocks</em> Array. Also it set #given_callback_content if block is given, this
|
227
241
|
# will allow to call #let_content. Each block is runned with #run_block.
|
228
242
|
def run_blocks blocks,&given_block
|
243
|
+
result=""
|
229
244
|
(blocks||[]).each do |block|
|
230
245
|
begin
|
231
246
|
if block_given?
|
232
247
|
self.given_callback_content=given_block
|
233
248
|
end
|
234
|
-
run_block(block,&given_block)
|
249
|
+
result << (run_block(block,&given_block)).to_s
|
235
250
|
ensure
|
236
251
|
self.given_callback_content=nil
|
237
252
|
end
|
238
253
|
end
|
254
|
+
if block_given? && (!blocks || (blocks && blocks.empty?))
|
255
|
+
result << run_block(given_block).to_s
|
256
|
+
end
|
257
|
+
result
|
239
258
|
end
|
240
259
|
|
241
260
|
# Run block in scope.
|
242
261
|
def run_block block, &given_block
|
243
|
-
|
262
|
+
hooks_run_scope.instance_eval(&block)
|
244
263
|
end
|
245
264
|
|
246
265
|
# Return all callbacks
|
@@ -277,8 +296,10 @@ module Lolita
|
|
277
296
|
module InstanceMethods
|
278
297
|
|
279
298
|
# See Lolita::Hooks::ClassMethods#run
|
280
|
-
def run(*hook_names)
|
281
|
-
|
299
|
+
def run(*hook_names,&block)
|
300
|
+
options=hook_names ? hook_names.extract_options! : {}
|
301
|
+
options[:scope]=self
|
302
|
+
self.class.run(*hook_names,options,&block)
|
282
303
|
end
|
283
304
|
|
284
305
|
# See Lolita::Hooks::ClassMethods#let_content
|
@@ -288,7 +309,7 @@ module Lolita
|
|
288
309
|
|
289
310
|
# See Lolita::Hooks::ClassMethods#method_missing
|
290
311
|
def method_missing(*args,&block)
|
291
|
-
unless self.class.recognize_hook_methods(*args,&block)
|
312
|
+
unless self.class.recognize_hook_methods(*args,:scope=>self,&block)
|
292
313
|
super
|
293
314
|
end
|
294
315
|
end
|
data/lib/lolita/rails/all.rb
CHANGED
data/lib/lolita/rails/routes.rb
CHANGED
data/lolita.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{lolita}
|
8
|
-
s.version = "3.1.
|
8
|
+
s.version = "3.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["ITHouse (Latvia) and Arturs Meisters"]
|
12
|
-
s.date = %q{2011-04-
|
12
|
+
s.date = %q{2011-04-14}
|
13
13
|
s.description = %q{Great Rails CMS, that turns your business logic into good-looking, fully functional workspace. }
|
14
14
|
s.email = %q{support@ithouse.lv}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -212,11 +212,13 @@ Gem::Specification.new do |s|
|
|
212
212
|
"spec/configuration/tab_spec.rb",
|
213
213
|
"spec/configuration/tabs_spec.rb",
|
214
214
|
"spec/controllers/internal_helpers_spec.rb",
|
215
|
+
"spec/controllers/lolita_rest_nested_resources_spec.rb",
|
215
216
|
"spec/controllers/lolita_rest_spec.rb",
|
216
217
|
"spec/dbi/base_spec.rb",
|
217
218
|
"spec/hooks_spec.rb",
|
218
219
|
"spec/lolita_spec.rb",
|
219
220
|
"spec/mapping_spec.rb",
|
221
|
+
"spec/navigation/branch_spec.rb",
|
220
222
|
"spec/navigation/tree_spec.rb",
|
221
223
|
"spec/orm/mongoid.rb",
|
222
224
|
"spec/rails_app/app/controllers/application_controller.rb",
|
@@ -326,11 +328,13 @@ Gem::Specification.new do |s|
|
|
326
328
|
"spec/configuration/tab_spec.rb",
|
327
329
|
"spec/configuration/tabs_spec.rb",
|
328
330
|
"spec/controllers/internal_helpers_spec.rb",
|
331
|
+
"spec/controllers/lolita_rest_nested_resources_spec.rb",
|
329
332
|
"spec/controllers/lolita_rest_spec.rb",
|
330
333
|
"spec/dbi/base_spec.rb",
|
331
334
|
"spec/hooks_spec.rb",
|
332
335
|
"spec/lolita_spec.rb",
|
333
336
|
"spec/mapping_spec.rb",
|
337
|
+
"spec/navigation/branch_spec.rb",
|
334
338
|
"spec/navigation/tree_spec.rb",
|
335
339
|
"spec/orm/mongoid.rb",
|
336
340
|
"spec/rails_app/app/controllers/application_controller.rb",
|
@@ -5,6 +5,21 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
5
5
|
|
6
6
|
class MyController < ApplicationController
|
7
7
|
include Lolita::Controllers::InternalHelpers
|
8
|
+
include Lolita::Hooks
|
9
|
+
add_hook :before_build_resource,:after_build_resource
|
10
|
+
add_hook :before_index
|
11
|
+
before_index :modify
|
12
|
+
|
13
|
+
def index
|
14
|
+
@@temp=1
|
15
|
+
self.run_before_index
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def modify
|
21
|
+
@@temp=3
|
22
|
+
end
|
8
23
|
end
|
9
24
|
|
10
25
|
describe MyController do
|
@@ -12,6 +27,11 @@ describe MyController do
|
|
12
27
|
@controller.request.env["lolita.mapping"]=Lolita.mappings[:post]
|
13
28
|
end
|
14
29
|
|
30
|
+
it "should call hook in #index" do
|
31
|
+
@controller.index
|
32
|
+
@controller.class.class_variable_get(:"@@temp").should == 3
|
33
|
+
end
|
34
|
+
|
15
35
|
it "should get resource name" do
|
16
36
|
@controller.resource_name.should == :post
|
17
37
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe Lolita::RestController do
|
4
|
+
render_views
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@controller.request.env["lolita.mapping"]=Lolita.mappings[:post]
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should create new nested resources together with base resource"
|
11
|
+
# do
|
12
|
+
# p = {:title=>"Post 1"}
|
13
|
+
# p[:comments_attributes] = [{:body=>"Comment 1"}, {:body=>"Comment 2"}]
|
14
|
+
# post :create, :post=>p
|
15
|
+
# Post.last.title.should == "Post 1"
|
16
|
+
# puts Comment.all.to_a.inspect
|
17
|
+
# Post.first.comments.length.should == 2
|
18
|
+
# Post.first.comments.last.body.should == "Comment 2"
|
19
|
+
# end
|
20
|
+
|
21
|
+
it "should create new nested resources for existing base resource"
|
22
|
+
|
23
|
+
it "should add new nested resources for existing base resource with existing nested resourcer"
|
24
|
+
|
25
|
+
it "should remove nested resources from base resource"
|
26
|
+
|
27
|
+
it "should modify nested resources for given base resource"
|
28
|
+
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
|
@@ -7,6 +7,17 @@ describe Lolita::RestController do
|
|
7
7
|
@controller.request.env["lolita.mapping"]=Lolita.mappings[:post]
|
8
8
|
end
|
9
9
|
|
10
|
+
describe "hooks" do
|
11
|
+
it "should call hooks on #index action" do
|
12
|
+
@controller.class.class_variable_set(:"@@temp",1)
|
13
|
+
@controller.before_index do
|
14
|
+
@@temp=2
|
15
|
+
end
|
16
|
+
get :index
|
17
|
+
@controller.class.class_variable_get(:"@@temp").should == 2
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
10
21
|
it "should render list component for index action" do
|
11
22
|
get :index
|
12
23
|
response.should render_template("index")
|
data/spec/hooks_spec.rb
CHANGED
@@ -26,6 +26,7 @@ class Counter
|
|
26
26
|
@value
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
29
30
|
describe Lolita::Hooks do
|
30
31
|
after(:each) do
|
31
32
|
MyClass.clear_hooks if MyClass.respond_to?(:clear_hooks)
|
@@ -116,20 +117,75 @@ describe Lolita::Hooks do
|
|
116
117
|
end
|
117
118
|
|
118
119
|
|
120
|
+
describe "block content" do
|
121
|
+
it "should return block content" do
|
122
|
+
MyClass.after_load do
|
123
|
+
"My name"+
|
124
|
+
let_content.to_s
|
125
|
+
end
|
126
|
+
|
127
|
+
output=MyClass.run(:after_load) do
|
128
|
+
" is Earl"
|
129
|
+
end
|
130
|
+
|
131
|
+
output.should == "My name is Earl"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
119
135
|
context "wrap around" do
|
120
136
|
|
121
137
|
it "should allow to wrap around when #run receive block" do
|
122
138
|
MyClass.after_load do
|
123
139
|
value("first")
|
124
140
|
let_content()
|
125
|
-
value("second")
|
126
141
|
end
|
127
142
|
|
128
143
|
MyClass.run(:after_load) do
|
129
|
-
value(
|
144
|
+
value("second")
|
130
145
|
end
|
131
146
|
MyClass.value.should == "second"
|
132
147
|
end
|
148
|
+
|
149
|
+
it "should call default block when no block passed as callback" do
|
150
|
+
MyClass.run(:after_load) do
|
151
|
+
value("inblock")
|
152
|
+
end
|
153
|
+
|
154
|
+
MyClass.value.should=="inblock"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
context "methods as callbacks" do
|
159
|
+
class MethodTestClass
|
160
|
+
include Lolita::Hooks
|
161
|
+
add_hook :before_save
|
162
|
+
before_save :set_name
|
163
|
+
|
164
|
+
def save
|
165
|
+
self.run_before_save
|
166
|
+
end
|
167
|
+
|
168
|
+
private
|
169
|
+
|
170
|
+
def self.set_name
|
171
|
+
@name="Class name"
|
172
|
+
end
|
173
|
+
|
174
|
+
def set_name
|
175
|
+
@name="Name"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should call callback for method on class" do
|
180
|
+
MethodTestClass.run_before_save
|
181
|
+
MethodTestClass.instance_variable_get(:"@name").should == "Class name"
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should run callbac on instance" do
|
185
|
+
object=MethodTestClass.new
|
186
|
+
object.save
|
187
|
+
object.instance_variable_get(:"@name").should == "Name"
|
188
|
+
end
|
133
189
|
end
|
134
190
|
end
|
135
191
|
|
@@ -174,6 +230,15 @@ describe Lolita::Hooks do
|
|
174
230
|
Counter.get.should == 2
|
175
231
|
end
|
176
232
|
|
233
|
+
it "should execute run block when no callback block given" do
|
234
|
+
Lolita::Hooks.components.add_hook(:around)
|
235
|
+
Counter.set(0)
|
236
|
+
Lolita::Hooks.components.run(:around) do
|
237
|
+
Counter.set(1)
|
238
|
+
end
|
239
|
+
Counter.get.should==1
|
240
|
+
end
|
241
|
+
|
177
242
|
it "should run all named hook callbacks when runned on named collection" do
|
178
243
|
pending "Need to update functionality to work."
|
179
244
|
Lolita::Hooks.components.add_hook(:after)
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../simple_spec_helper')
|
2
|
+
|
3
|
+
describe Lolita::Navigation::Branch do
|
4
|
+
let(:tree){Lolita::Navigation::Tree.new("test tree")}
|
5
|
+
|
6
|
+
describe "attributes" do
|
7
|
+
let(:branch){Lolita::Navigation::Branch.new}
|
8
|
+
|
9
|
+
it "should have title" do
|
10
|
+
branch.title="Pages"
|
11
|
+
branch.title.should == "Pages"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should have default name" do
|
15
|
+
branch.name.should match(/branch/)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should not have level when branch is not in tree" do
|
19
|
+
branch.level.should be_nil
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should have options, that may containe any values needed" do
|
23
|
+
branch.options[:url]="/"
|
24
|
+
branch.options[:url].should == "/"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should belongs to tree" do
|
28
|
+
branch.tree.should be_nil
|
29
|
+
lambda{
|
30
|
+
branch.tree=Object.new
|
31
|
+
}.should raise_error(ArgumentError)
|
32
|
+
end
|
33
|
+
|
34
|
+
context "relationships" do
|
35
|
+
|
36
|
+
it "should have parent" do
|
37
|
+
branch=tree.add(Object)
|
38
|
+
branch.parent.should == tree.root
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should have childern" do
|
42
|
+
branch.append(Lolita::Navigation::Branch.new)
|
43
|
+
branch.children.class.should == Lolita::Navigation::Tree
|
44
|
+
branch.children.should have(1).item
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should have siblings" do
|
48
|
+
tree.add(Object)
|
49
|
+
branch=tree.add(String)
|
50
|
+
branch.siblings[:before].should_not be_nil
|
51
|
+
branch.siblings[:after].should be_nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "adding" do
|
57
|
+
let(:new_branch){Lolita::Navigation::Branch.new}
|
58
|
+
|
59
|
+
it "should append to existing branch" do
|
60
|
+
new_branch.append(Lolita::Navigation::Branch.new)
|
61
|
+
new_branch.append(Object)
|
62
|
+
new_branch.append("Pages")
|
63
|
+
new_branch.children.should have(3).items
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should prepend to exsiting branch" do
|
67
|
+
new_branch.append(Object)
|
68
|
+
new_branch.prepend(String)
|
69
|
+
new_branch.children.first.object.should == String
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should add before and after branch" do
|
73
|
+
branch=tree.add(Object)
|
74
|
+
branch.before(Lolita::Navigation::Branch.new)
|
75
|
+
branch.after(Object)
|
76
|
+
branch.siblings.values.compact.should have(2).items
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -27,7 +27,7 @@ describe Lolita::Navigation::Tree do
|
|
27
27
|
|
28
28
|
context "#add" do
|
29
29
|
it "should accept object, position and options" do
|
30
|
-
tree.add(Object,:append,:url=>"/mypath")
|
30
|
+
tree.add(Object.new,:append,:url=>"/mypath")
|
31
31
|
tree.should have(1).branch
|
32
32
|
end
|
33
33
|
end
|
@@ -38,7 +38,7 @@ describe Lolita::Navigation::Tree do
|
|
38
38
|
|
39
39
|
it "should iterate through all branches" do
|
40
40
|
0.upto(3){|i|
|
41
|
-
tree.add(Object,:append,:url=>"/#{i}",:name=>"branch#{i}")
|
41
|
+
tree.add(Object.new,:append,:url=>"/#{i}",:name=>"branch#{i}")
|
42
42
|
}
|
43
43
|
tree.each_with_index do |branch,index|
|
44
44
|
branch.name.should == "branch#{index}"
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: lolita
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 3.1.
|
5
|
+
version: 3.1.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- ITHouse (Latvia) and Arturs Meisters
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-04-
|
13
|
+
date: 2011-04-14 00:00:00 +03:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -372,11 +372,13 @@ files:
|
|
372
372
|
- spec/configuration/tab_spec.rb
|
373
373
|
- spec/configuration/tabs_spec.rb
|
374
374
|
- spec/controllers/internal_helpers_spec.rb
|
375
|
+
- spec/controllers/lolita_rest_nested_resources_spec.rb
|
375
376
|
- spec/controllers/lolita_rest_spec.rb
|
376
377
|
- spec/dbi/base_spec.rb
|
377
378
|
- spec/hooks_spec.rb
|
378
379
|
- spec/lolita_spec.rb
|
379
380
|
- spec/mapping_spec.rb
|
381
|
+
- spec/navigation/branch_spec.rb
|
380
382
|
- spec/navigation/tree_spec.rb
|
381
383
|
- spec/orm/mongoid.rb
|
382
384
|
- spec/rails_app/app/controllers/application_controller.rb
|
@@ -480,7 +482,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
480
482
|
requirements:
|
481
483
|
- - ">="
|
482
484
|
- !ruby/object:Gem::Version
|
483
|
-
hash:
|
485
|
+
hash: 43629427
|
484
486
|
segments:
|
485
487
|
- 0
|
486
488
|
version: "0"
|
@@ -511,11 +513,13 @@ test_files:
|
|
511
513
|
- spec/configuration/tab_spec.rb
|
512
514
|
- spec/configuration/tabs_spec.rb
|
513
515
|
- spec/controllers/internal_helpers_spec.rb
|
516
|
+
- spec/controllers/lolita_rest_nested_resources_spec.rb
|
514
517
|
- spec/controllers/lolita_rest_spec.rb
|
515
518
|
- spec/dbi/base_spec.rb
|
516
519
|
- spec/hooks_spec.rb
|
517
520
|
- spec/lolita_spec.rb
|
518
521
|
- spec/mapping_spec.rb
|
522
|
+
- spec/navigation/branch_spec.rb
|
519
523
|
- spec/navigation/tree_spec.rb
|
520
524
|
- spec/orm/mongoid.rb
|
521
525
|
- spec/rails_app/app/controllers/application_controller.rb
|