lolita 3.2.0.rc.7 → 3.2.0.rc.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (254) hide show
  1. data/.gitignore +31 -0
  2. data/Gemfile +15 -36
  3. data/History.rdoc +9 -3
  4. data/README.md +57 -30
  5. data/Rakefile +1 -44
  6. data/app/assets/javascripts/lolita/list.js +28 -0
  7. data/app/assets/javascripts/lolita/main.js +81 -12
  8. data/app/assets/javascripts/lolita/tab.js +37 -32
  9. data/app/assets/stylesheets/lolita/style.css.erb +58 -18
  10. data/app/controllers/lolita/field_data_controller.rb +13 -9
  11. data/app/controllers/lolita/info_controller.rb +3 -5
  12. data/app/controllers/lolita/rest_controller.rb +53 -24
  13. data/app/helpers/components/lolita/configuration_component.rb +1 -1
  14. data/app/views/components/lolita/configuration/action/_display.html.haml +1 -0
  15. data/app/views/components/lolita/configuration/column/_display.html.haml +4 -0
  16. data/app/views/components/lolita/configuration/column/_first.html.haml +2 -0
  17. data/app/views/components/lolita/configuration/column/_last.html.haml +5 -0
  18. data/app/views/components/lolita/configuration/column/header/_display.html.haml +5 -0
  19. data/app/views/components/lolita/configuration/column/header/_first.html.haml +1 -0
  20. data/app/views/components/lolita/configuration/column/header/_last.html.haml +1 -0
  21. data/app/views/components/lolita/configuration/column/header/_sort.html.haml +6 -0
  22. data/app/views/components/lolita/configuration/columns/_display.html.haml +2 -0
  23. data/app/views/components/lolita/configuration/columns/body/_display.html.haml +3 -0
  24. data/app/views/components/lolita/configuration/columns/body/row/_display.html.haml +5 -0
  25. data/app/views/components/lolita/configuration/columns/header/_display.html.haml +5 -0
  26. data/app/views/components/lolita/configuration/field/_display.html.haml +7 -0
  27. data/app/views/components/lolita/configuration/field/_label.html.haml +1 -0
  28. data/app/views/components/lolita/configuration/field/_object.html.haml +1 -0
  29. data/app/views/components/lolita/configuration/field/array/_display.html.haml +5 -0
  30. data/app/views/components/lolita/configuration/field/array/autocomplete/_display.html.haml +1 -1
  31. data/app/views/components/lolita/configuration/field/array/autocomplete/_input.html.haml +2 -2
  32. data/app/views/components/lolita/configuration/field/array/polymorphic/_display.html.haml +3 -3
  33. data/app/views/components/lolita/configuration/field/array/select/_display.html.haml +1 -0
  34. data/app/views/components/lolita/configuration/field/big_decimal/_display.html.haml +1 -0
  35. data/app/views/components/lolita/configuration/field/boolean/_display.html.haml +1 -0
  36. data/app/views/components/lolita/configuration/field/date/_display.html.haml +1 -0
  37. data/app/views/components/lolita/configuration/field/date_time/_display.html.haml +2 -0
  38. data/app/views/components/lolita/configuration/field/date_time/date/_display.html.haml +1 -0
  39. data/app/views/components/lolita/configuration/field/date_time/time/_display.html.haml +1 -0
  40. data/app/views/components/lolita/configuration/field/float/_display.html.haml +1 -0
  41. data/app/views/components/lolita/configuration/field/integer/_display.html.haml +1 -0
  42. data/app/views/components/lolita/configuration/field/string/_display.html.haml +1 -0
  43. data/app/views/components/lolita/configuration/field/string/disabled/_display.html.haml +2 -0
  44. data/app/views/components/lolita/configuration/field/string/hidden/_display.html.haml +1 -0
  45. data/app/views/components/lolita/configuration/field/string/password/_display.html.haml +1 -0
  46. data/app/views/components/lolita/configuration/field/string/text/_display.html.haml +7 -0
  47. data/app/views/components/lolita/configuration/field/time/_display.html.haml +1 -0
  48. data/app/views/components/lolita/configuration/field_set/_display.html.haml +3 -0
  49. data/app/views/components/lolita/configuration/filter/_display.html.haml +9 -0
  50. data/app/views/components/lolita/configuration/list/_display.html.haml +9 -0
  51. data/app/views/components/lolita/configuration/list/_new_resource.html.haml +4 -0
  52. data/app/views/components/lolita/configuration/list/_paginator.html.haml +1 -0
  53. data/app/views/components/lolita/configuration/list/_title.html.haml +6 -0
  54. data/app/views/components/lolita/configuration/nested_form/_display.html.haml +12 -0
  55. data/app/views/components/lolita/configuration/nested_form/_fields.html.haml +8 -0
  56. data/app/views/components/lolita/configuration/nested_list/_display.html.haml +7 -0
  57. data/app/views/components/lolita/configuration/nested_list/_paginator.html.haml +2 -0
  58. data/app/views/components/lolita/configuration/tab/_display.html.haml +4 -0
  59. data/app/views/components/lolita/configuration/tab/_error_msg.html.haml +14 -0
  60. data/app/views/components/lolita/configuration/tab/_fields.html.haml +6 -0
  61. data/app/views/components/lolita/configuration/tab/_form.html.haml +4 -0
  62. data/app/views/components/lolita/configuration/tab/_title.html.haml +3 -0
  63. data/app/views/components/lolita/configuration/tab/content/_display.html.haml +1 -0
  64. data/app/views/components/lolita/configuration/tab/default/_display.html.haml +2 -0
  65. data/app/views/components/lolita/configuration/tabs/_display.html.haml +10 -0
  66. data/app/views/components/lolita/configuration/tabs/_form.html.haml +7 -0
  67. data/app/views/components/lolita/navigation/_display.html.haml +2 -0
  68. data/app/views/components/lolita/navigation/_tree.html.haml +14 -0
  69. data/app/views/components/lolita/shared/_buttons.html.haml +6 -0
  70. data/app/views/components/lolita/shared/_flash.html.haml +3 -0
  71. data/app/views/components/lolita/shared/_header.html.haml +7 -0
  72. data/app/views/components/lolita/shared/_languages.html.haml +11 -0
  73. data/app/views/components/lolita/shared/_right_sidebar.html.haml +6 -0
  74. data/app/views/components/lolita/shared/_save_button.html.haml +1 -0
  75. data/app/views/layouts/lolita/application.html.haml +36 -0
  76. data/app/views/lolita/rest/form.html.haml +1 -0
  77. data/app/views/lolita/rest/index.html.haml +1 -0
  78. data/app/views/lolita/rest/index.js.erb +1 -0
  79. data/config/locales/en.yml +4 -0
  80. data/config/locales/lv.yml +5 -2
  81. data/lib/generators/lolita/uninstall_generator.rb +76 -0
  82. data/lib/lolita.rb +104 -170
  83. data/lib/lolita/adapter/abstract_adapter.rb +1 -0
  84. data/lib/lolita/adapter/active_record.rb +22 -55
  85. data/lib/lolita/adapter/common_helper.rb +252 -0
  86. data/lib/lolita/adapter/mongoid.rb +11 -55
  87. data/lib/lolita/base.rb +5 -0
  88. data/lib/lolita/builder.rb +3 -3
  89. data/lib/lolita/components/base.rb +12 -0
  90. data/lib/lolita/components/configuration/column_component.rb +31 -0
  91. data/lib/lolita/components/configuration/list_component.rb +11 -0
  92. data/lib/lolita/configuration.rb +61 -0
  93. data/lib/lolita/configuration/action.rb +53 -0
  94. data/lib/lolita/configuration/base.rb +23 -71
  95. data/lib/lolita/configuration/column.rb +50 -16
  96. data/lib/lolita/configuration/columns.rb +51 -23
  97. data/lib/lolita/configuration/core.rb +80 -0
  98. data/lib/lolita/configuration/factory/field.rb +8 -3
  99. data/lib/lolita/configuration/factory/tab.rb +12 -6
  100. data/lib/lolita/configuration/field.rb +8 -11
  101. data/lib/lolita/configuration/field/array.rb +7 -9
  102. data/lib/lolita/configuration/fields.rb +1 -1
  103. data/lib/lolita/configuration/filter.rb +26 -19
  104. data/lib/lolita/configuration/list.rb +143 -80
  105. data/lib/lolita/configuration/nested_list.rb +102 -0
  106. data/lib/lolita/configuration/search.rb +14 -0
  107. data/lib/lolita/configuration/tab.rb +13 -9
  108. data/lib/lolita/configuration/tab/content.rb +6 -0
  109. data/lib/lolita/configuration/tab/default.rb +2 -2
  110. data/lib/lolita/configuration/tabs.rb +35 -82
  111. data/lib/lolita/controller_additions.rb +4 -3
  112. data/lib/lolita/controllers.rb +13 -0
  113. data/lib/lolita/controllers/authentication_helpers.rb +17 -0
  114. data/lib/lolita/controllers/component_helpers.rb +9 -5
  115. data/lib/lolita/controllers/internal_helpers.rb +22 -97
  116. data/lib/lolita/controllers/rails_helpers.rb +132 -0
  117. data/lib/lolita/controllers/url_helpers.rb +1 -1
  118. data/lib/lolita/errors.rb +3 -0
  119. data/lib/lolita/extensions/authentication/default_adapter.rb +24 -0
  120. data/lib/lolita/extensions/authentication/devise_adapter.rb +58 -0
  121. data/lib/lolita/extensions/authentication/proxy.rb +60 -0
  122. data/lib/lolita/extensions/authorization/cancan_adapter.rb +45 -0
  123. data/lib/lolita/extensions/authorization/default_adapter.rb +29 -0
  124. data/lib/lolita/extensions/authorization/proxy.rb +48 -0
  125. data/lib/lolita/extensions/extensions.rb +66 -0
  126. data/lib/lolita/helpers.rb +12 -0
  127. data/lib/lolita/lazy_loader.rb +15 -10
  128. data/lib/lolita/mapping.rb +25 -19
  129. data/lib/lolita/navigation/branch.rb +29 -2
  130. data/lib/lolita/navigation/tree.rb +6 -0
  131. data/lib/lolita/observed_array.rb +1 -1
  132. data/lib/lolita/orm.rb +7 -0
  133. data/lib/lolita/processors/request_processor.rb +38 -0
  134. data/lib/lolita/rails/engine.rb +24 -0
  135. data/lib/lolita/{modules/rest.rb → rails/railtie.rb} +8 -2
  136. data/lib/lolita/rails/routes.rb +26 -29
  137. data/lib/lolita/register.rb +48 -0
  138. data/lib/lolita/ruby_ext/lolita_model_name.rb +37 -0
  139. data/lib/lolita/system_configuration/application.rb +1 -0
  140. data/lib/lolita/system_configuration/base.rb +12 -5
  141. data/lib/lolita/utils.rb +14 -0
  142. data/lib/lolita/version.rb +30 -0
  143. data/lolita.gemspec +26 -398
  144. data/spec/configuration/base_spec.rb +14 -35
  145. data/spec/configuration/column_spec.rb +51 -2
  146. data/spec/configuration/columns_spec.rb +13 -19
  147. data/spec/configuration/core_spec.rb +89 -0
  148. data/spec/configuration/field_spec.rb +17 -5
  149. data/spec/configuration/filter_spec.rb +76 -61
  150. data/spec/configuration/list_spec.rb +339 -45
  151. data/spec/configuration/nested_list_spec.rb +111 -0
  152. data/spec/configuration/search_spec.rb +1 -1
  153. data/spec/configuration/tabs_spec.rb +89 -74
  154. data/spec/controllers/configuration_spec.rb +15 -0
  155. data/spec/controllers/internal_helpers_spec.rb +1 -1
  156. data/spec/controllers/lolita_rest_spec.rb +31 -2
  157. data/spec/coverage_helper.rb +33 -0
  158. data/spec/extensions/authentication/default_adapter_spec.rb +34 -0
  159. data/spec/extensions/authentication/devise_adapter_spec.rb +94 -0
  160. data/spec/extensions/authentication/proxy_spec.rb +55 -0
  161. data/spec/extensions/authorization/cancan_adapter_spec.rb +94 -0
  162. data/spec/extensions/authorization/default_adapter_spec.rb +43 -0
  163. data/spec/extensions/authorization/proxy_spec.rb +60 -0
  164. data/spec/extensions/extensions_spec.rb +45 -0
  165. data/spec/fabricators/category_fabricator.rb +3 -0
  166. data/spec/fabricators/post_fabricator.rb +4 -0
  167. data/spec/fabricators/tag_fabricator.rb +3 -0
  168. data/spec/lolita_spec.rb +1 -0
  169. data/spec/orm/mongoid.rb +1 -0
  170. data/spec/rails_app/app/mongoid/category.rb +14 -1
  171. data/spec/rails_app/app/mongoid/post.rb +9 -1
  172. data/spec/rails_app/config/application.rb +0 -4
  173. data/spec/rails_app/config/boot.rb +1 -2
  174. data/spec/register_spec.rb +50 -0
  175. data/spec/search/simple_spec.rb +4 -4
  176. data/spec/simple_spec_helper.rb +2 -1
  177. data/spec/spec_helper.rb +22 -35
  178. data/vendor/assets/javascripts/tinymce_config.js +5 -3
  179. metadata +202 -180
  180. data/.document +0 -5
  181. data/GUIDELINES.rdoc +0 -22
  182. data/VERSION +0 -1
  183. data/app/helpers/lolita_helper.rb +0 -23
  184. data/app/views/components/lolita/configuration/column/_display.html.erb +0 -4
  185. data/app/views/components/lolita/configuration/column/_header.html.erb +0 -7
  186. data/app/views/components/lolita/configuration/column/_sort.html.erb +0 -7
  187. data/app/views/components/lolita/configuration/columns/_body.html.erb +0 -5
  188. data/app/views/components/lolita/configuration/columns/_display.html.erb +0 -2
  189. data/app/views/components/lolita/configuration/columns/_first.html.erb +0 -3
  190. data/app/views/components/lolita/configuration/columns/_first_column_header.html.erb +0 -3
  191. data/app/views/components/lolita/configuration/columns/_header.html.erb +0 -9
  192. data/app/views/components/lolita/configuration/columns/_last.html.erb +0 -4
  193. data/app/views/components/lolita/configuration/columns/_last_column_header.html.erb +0 -3
  194. data/app/views/components/lolita/configuration/columns/_row.html.erb +0 -7
  195. data/app/views/components/lolita/configuration/field/_display.html.erb +0 -13
  196. data/app/views/components/lolita/configuration/field/_label.html.erb +0 -1
  197. data/app/views/components/lolita/configuration/field/_object.html.erb +0 -1
  198. data/app/views/components/lolita/configuration/field/array/_display.html.erb +0 -5
  199. data/app/views/components/lolita/configuration/field/array/filter/_display.html.erb +0 -1
  200. data/app/views/components/lolita/configuration/field/array/select/_display.html.erb +0 -4
  201. data/app/views/components/lolita/configuration/field/big_decimal/_display.html.erb +0 -1
  202. data/app/views/components/lolita/configuration/field/boolean/_display.html.erb +0 -1
  203. data/app/views/components/lolita/configuration/field/boolean/filter/_display.html.erb +0 -2
  204. data/app/views/components/lolita/configuration/field/date/_display.html.erb +0 -1
  205. data/app/views/components/lolita/configuration/field/date_time/_display.html.erb +0 -1
  206. data/app/views/components/lolita/configuration/field/date_time/date/_display.html.erb +0 -1
  207. data/app/views/components/lolita/configuration/field/date_time/time/_display.html.erb +0 -1
  208. data/app/views/components/lolita/configuration/field/float/_display.html.erb +0 -1
  209. data/app/views/components/lolita/configuration/field/hidden/_display.html.erb +0 -1
  210. data/app/views/components/lolita/configuration/field/integer/_display.html.erb +0 -1
  211. data/app/views/components/lolita/configuration/field/string/_display.html.erb +0 -1
  212. data/app/views/components/lolita/configuration/field/string/disabled/_display.html.erb +0 -1
  213. data/app/views/components/lolita/configuration/field/string/password/_display.html.erb +0 -3
  214. data/app/views/components/lolita/configuration/field/string/text/_display.html.erb +0 -11
  215. data/app/views/components/lolita/configuration/field/time/_display.html.erb +0 -1
  216. data/app/views/components/lolita/configuration/field_set/_display.html.erb +0 -5
  217. data/app/views/components/lolita/configuration/list/_display.html.erb +0 -11
  218. data/app/views/components/lolita/configuration/list/_filter.html.erb +0 -8
  219. data/app/views/components/lolita/configuration/list/_new_resource.html.erb +0 -6
  220. data/app/views/components/lolita/configuration/list/_paginator.html.erb +0 -1
  221. data/app/views/components/lolita/configuration/list/_title.html.erb +0 -10
  222. data/app/views/components/lolita/configuration/nested_form/_display.html.erb +0 -15
  223. data/app/views/components/lolita/configuration/nested_form/_fields.html.erb +0 -13
  224. data/app/views/components/lolita/configuration/tab/_display.html.erb +0 -8
  225. data/app/views/components/lolita/configuration/tab/_error_msg.html.erb +0 -20
  226. data/app/views/components/lolita/configuration/tab/_fields.html.erb +0 -9
  227. data/app/views/components/lolita/configuration/tab/_form.html.erb +0 -8
  228. data/app/views/components/lolita/configuration/tab/content/_display.html.erb +0 -1
  229. data/app/views/components/lolita/configuration/tab/default/_display.html.erb +0 -3
  230. data/app/views/components/lolita/configuration/tabs/_display.html.erb +0 -11
  231. data/app/views/components/lolita/navigation/_display.html.erb +0 -3
  232. data/app/views/components/lolita/navigation/_tree.html.erb +0 -32
  233. data/app/views/components/lolita/shared/_flash.html.erb +0 -5
  234. data/app/views/components/lolita/shared/_header.html.erb +0 -9
  235. data/app/views/components/lolita/shared/_right_sidebar.html.erb +0 -9
  236. data/app/views/components/lolita/shared/_save_button.html.erb +0 -6
  237. data/app/views/layouts/lolita/application.html.erb +0 -37
  238. data/app/views/lolita/rest/form.html.erb +0 -1
  239. data/app/views/lolita/rest/index.html.erb +0 -1
  240. data/config/locales/default/lv.yml +0 -181
  241. data/db/seed.rb +0 -1
  242. data/features/create_page.feature +0 -20
  243. data/features/step_definitions/lolita_steps.rb +0 -7
  244. data/features/step_definitions/web_steps.rb +0 -219
  245. data/features/support/env.rb +0 -73
  246. data/features/support/paths.rb +0 -35
  247. data/lib/lolita/controllers/authorization_helpers.rb +0 -56
  248. data/lib/lolita/controllers/user_helpers.rb +0 -44
  249. data/lib/lolita/modules.rb +0 -6
  250. data/lib/lolita/rails.rb +0 -23
  251. data/lib/lolita/rails/all.rb +0 -11
  252. data/spec/support/factories/category.rb +0 -3
  253. data/spec/support/factories/post.rb +0 -4
  254. data/spec/support/factories/tag.rb +0 -3
@@ -0,0 +1,45 @@
1
+ module Lolita
2
+ module Extensions
3
+ module Authorization
4
+
5
+ class CanCanAdapter
6
+
7
+ def initialize context, options={}
8
+ raise NameError, "CanCan is not defined" unless defined?(CanCan)
9
+ raise Lolita::NoAuthorizationDefinedError, "Lolita.authorization is not defined" unless Lolita.authorization
10
+ @context = context
11
+ @options = options
12
+ set_default_options
13
+ current_ability
14
+ end
15
+
16
+ def can? *args
17
+ current_ability.can?(*args)
18
+ end
19
+
20
+ def cannot? *args
21
+ current_ability.cannot?(*args)
22
+ end
23
+
24
+ def current_ability *args
25
+ unless @current_ability
26
+ @current_ability = Lolita.ability_class.new(@options[:current_user])
27
+ @context && @context.instance_variable_set(:"@current_ability",@current_ability)
28
+ end
29
+ @current_ability
30
+ end
31
+
32
+ def authorize! *args
33
+ current_ability && @context && @context.authorize!(*args) || current_ability.authorize!(*args)
34
+ end
35
+
36
+ private
37
+
38
+ def set_default_options
39
+ @options[:current_user] ||= @context && @context.authentication_proxy.current_user
40
+ end
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,29 @@
1
+ module Lolita
2
+ module Extensions
3
+ module Authorization
4
+
5
+ class DefaultAdapter
6
+
7
+ def initialize *args
8
+ end
9
+
10
+ def can? *args
11
+ true
12
+ end
13
+
14
+ def cannot? *args
15
+ false
16
+ end
17
+
18
+ def current_ability *args
19
+ end
20
+
21
+ def authorize! *args
22
+ true
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,48 @@
1
+ require "#{File.dirname(__FILE__)}/default_adapter"
2
+ require "#{File.dirname(__FILE__)}/cancan_adapter"
3
+
4
+ module Lolita
5
+ class NoAuthorizationDefinedError < ArgumentError ; end
6
+
7
+ module Extensions
8
+ module Authorization
9
+
10
+ class Proxy
11
+ attr_accessor :adapter
12
+
13
+ def initialize context,options={}
14
+ @context = context
15
+ @options = options
16
+ @adapter = get_adapter()
17
+ end
18
+
19
+ def can? *args
20
+ @adapter.can? *args
21
+ end
22
+
23
+ def cannot? *args
24
+ @adapter.cannot? *args
25
+ end
26
+
27
+ def authorize! *args
28
+ @adapter.authorize! *args
29
+ end
30
+
31
+ def current_ability *args
32
+ @adapter.current_ability *args
33
+ end
34
+
35
+ private
36
+
37
+ def get_adapter
38
+ if Lolita.authorization
39
+ "Lolita::Extensions::Authorization::#{Lolita.authorization}Adapter".constantize.new @context, @options
40
+ else
41
+ Lolita::Extensions::Authorization::DefaultAdapter.new @context, @options
42
+ end
43
+ end
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,66 @@
1
+ module Lolita
2
+ # This module provides functionality for extension machinery in Lolita. It loads proxies on demand.
3
+ module Extensions
4
+ EXTENSIONS = []
5
+
6
+ def method_missing method_name, *args, &block
7
+ if method_name[/_proxy$/]
8
+ type = method_name.to_s.sub(/_proxy$/,"")
9
+ self.class_eval <<-EXTENSION,__FILE__,__LINE__+1
10
+ def #{method_name}(*args,&block)
11
+ unless __extensions_proxies[:#{type}]
12
+ load_extension_proxy(:#{type},self,__proxy_options_from_context)
13
+ end
14
+ __extensions_proxies[:#{type}]
15
+ end
16
+ EXTENSION
17
+ send(method_name)
18
+ else
19
+ super
20
+ end
21
+ end
22
+
23
+ def load_extensions_proxies(context=self, options={})
24
+ EXTENSIONS.each do |type|
25
+ load_extension_proxy(type,context,options)
26
+ end
27
+ end
28
+
29
+ def load_extension_proxy type,context=self,options={}
30
+ proxy_class = "Lolita::Extensions::#{type.to_s.camelize}::Proxy".constantize
31
+ initialize_arity = proxy_class.instance_method(:initialize).arity
32
+ __extensions_proxies[type] = if initialize_arity < 0 || initialize_arity > 1
33
+ proxy_class.new(context,options)
34
+ elsif initialize_arity == 0
35
+ proxy_class.new
36
+ else
37
+ proxy_class.new(context)
38
+ end
39
+ end
40
+
41
+ def self.add type
42
+ EXTENSIONS << type unless EXTENSIONS.include?(type)
43
+ end
44
+
45
+ private
46
+
47
+ def __proxy_options_from_context
48
+ if defined?(::ActionController::Base) && self.is_a?(::ActionController::Base)
49
+ {:controller => self, :request => request}
50
+ elsif defined?(::ActionView::Base) && self.is_a?(::ActionView::Base)
51
+ {:request => request}
52
+ end
53
+ end
54
+
55
+ def __extensions_proxies
56
+ @proxies ||= {}
57
+ end
58
+
59
+ end
60
+ end
61
+
62
+ Lolita::Extensions.add :authentication
63
+ Lolita::Extensions.add :authorization
64
+
65
+ require 'lolita/extensions/authorization/proxy'
66
+ require 'lolita/extensions/authentication/proxy'
@@ -0,0 +1,12 @@
1
+ module Lolita
2
+ module Helpers
3
+
4
+ def self.included(base)
5
+ base.class_eval do
6
+ include Lolita::Extensions
7
+ include Lolita::Controllers::ComponentHelpers
8
+ include Lolita::Controllers::AuthenticationHelpers
9
+ end
10
+ end
11
+ end
12
+ end
@@ -4,19 +4,23 @@ module Lolita
4
4
  #attr_reader :lazy_class,:eval_block,:class_instance
5
5
 
6
6
  def self.lazy_load(instance_name,var_name,lazy_class,*args,&block)
7
- temp_var=instance_name.instance_variable_get(var_name)
8
- unless temp_var
9
- temp_var=instance_name.instance_variable_set(var_name,self.new(lazy_class,*args,&block))
7
+ temp_var = instance_name.instance_variable_get(var_name)
8
+ is_loader = temp_var.to_s =~ /Lolita::LazyLoader/
9
+ if !temp_var || ((args && args.any? && is_loader && temp_var.__is_args_diff__(args)) || block_given?)
10
+ temp_var = instance_name.instance_variable_set(var_name,self.new(lazy_class,*args,&block))
10
11
  end
11
- if temp_var.to_s=~/Lolita::LazyLoader/ && temp_var.class_instance
12
- instance_name.instance_variable_set(var_name,temp_var.class_instance)
13
- else
14
- temp_var
12
+ if temp_var.to_s =~ /Lolita::LazyLoader/
13
+ temp_var = instance_name.instance_variable_set(var_name,temp_var.class_instance)
15
14
  end
15
+ temp_var
16
+ end
17
+
18
+ def __is_args_diff__(args)
19
+ @args != args
16
20
  end
17
21
 
18
22
  def initialize(lazy_class,*args,&block)
19
- @args=args
23
+ @args = args || []
20
24
  @lazy_class=lazy_class
21
25
  @eval_block=block
22
26
  end
@@ -27,6 +31,7 @@ module Lolita
27
31
 
28
32
  def method_missing(method_name,*args,&block)
29
33
  unless @class_instance
34
+ @args = @args.empty? && [nil] || @args
30
35
  arity=@lazy_class.instance_method(:initialize).arity
31
36
  if arity==-1 # when expectign *args
32
37
  @class_instance=@lazy_class.new(*@args,&@eval_block)
@@ -37,13 +42,13 @@ module Lolita
37
42
  end
38
43
  end
39
44
  if @class_instance.respond_to?(:after_initialize,true)
40
- @class_instance.send(:after_initialize)
45
+ @class_instance.__send__(:after_initialize)
41
46
  end
42
47
  @class_instance.__send__(method_name,*args,&block)
43
48
  end
44
49
 
45
50
  instance_methods.each { |method|
46
- next if ["hash","respond_to?","__id__","__send__","to_s","object_id","method_missing","class_instance","initialize"].include?(method.to_s)
51
+ next if ["!","__is_args_diff__","hash","respond_to?","__id__","__send__","to_s","object_id","method_missing","class_instance","initialize", "__args__"].include?(method.to_s)
47
52
  eval("undef :#{method}")
48
53
  }
49
54
  end
@@ -17,33 +17,39 @@ module Lolita
17
17
  # what controller to use, what model is related with it and so on. This is used to generate urls and paths.
18
18
  # Also eahc request containers information with mapping related to it.
19
19
  class Mapping
20
- attr_reader :class_name,:path,:singular,:plural,:path_prefix,:module,:controllers,:as
21
- attr_reader :visible, :only, :append_to
20
+ attr_reader :class_name,:path,:singular,:plural,:path_prefix,:module,:as,:controllers
21
+ attr_reader :visible, :only, :append_to, :title
22
22
  alias :name :singular
23
23
 
24
24
 
25
25
  def initialize(name,options={})
26
26
  # TODO how it is when lolita plugin extend default path and there is module is this not break the logic?
27
- @as=options[:as]
28
- @visible = options.keys.include?(:visible) ? options[:visible] : true
29
- @append_to = options[:append_to]
30
- @only = options[:only] || nil
31
- @plural=(options[:as] ? options[:as] : name).to_sym
32
- @singular=(options[:singular] || @plural.to_s.singularize).to_sym
33
- @class_name=(options[:class_name] || name.to_s.classify).to_s
34
- @ref = @class_name.to_s.camelize
35
- @path_prefix=options[:path_prefix]
36
- @path=(options[:path] || "lolita").to_s
37
- @module=options[:module]
38
- mod=@module ? nil : "lolita/"
39
- @controllers=Hash.new{|h,k|
40
- h[k]=options[:controller] || "#{mod}#{k}"
27
+ @as = options[:as]
28
+ @title = options[:title]
29
+ @to = options[:to].is_a?(String) ? options[:to].constantize : options[:to]
30
+ @visible = options.keys.include?(:visible) ? options[:visible] : true
31
+ @append_to = options[:append_to]
32
+ @only = options[:only] || nil
33
+ @plural = (options[:as] ? options[:as] : name).to_sym
34
+ @singular = (options[:singular] || @plural.to_s.singularize).to_sym
35
+ @class_name = (options[:class_name] || name.to_s.classify).to_s
36
+ @ref = @class_name.to_s.camelize
37
+ @path_prefix = options[:path_prefix]
38
+ @path = (options[:path] || "lolita").to_s
39
+ @module = options[:module]
40
+ @default_mod = @module || "lolita"
41
+ @controllers = Hash.new{|h,k|
42
+ h[k]=options[:controller] || "#{!@module && "lolita/"}#{k}"
41
43
  }
42
44
  end
43
45
 
46
+ def controller
47
+ "#{@default_mod}#{@default_mod && "/"}#{@plural}"
48
+ end
49
+
44
50
  # Return class that is related with mapping.
45
51
  def to
46
- @ref.constantize
52
+ @to || (@ref.constantize rescue nil)
47
53
  end
48
54
 
49
55
  # full path of current mapping
@@ -56,7 +62,7 @@ module Lolita
56
62
  end
57
63
 
58
64
  def add_to_navigation_tree
59
- tree = Lolita::Navigation::Tree[:"left_side_navigation"]
65
+ tree = Lolita.navigation
60
66
  if self.visible
61
67
  if self.append_to
62
68
  parent_branch = tree.branches.detect{|b| b.options[:system_name] == self.append_to}
@@ -69,7 +75,7 @@ module Lolita
69
75
  tree = parent_branch.children
70
76
  end
71
77
  unless tree.branches.detect{|b| b.object.is_a?(Lolita::Mapping) && b.object.to==self.to}
72
- tree.append(self)
78
+ tree.append(self, :title => @title)
73
79
  end
74
80
  end
75
81
  end
@@ -26,7 +26,9 @@ module Lolita
26
26
  if @title && @title.respond_to?(:call)
27
27
  @title.call(self)
28
28
  else
29
- @title || self.object.to.model_name.human(:count=>2)
29
+ @title ||
30
+ (self.object.to && (self.object.to.lolita_model_name.human(:count=>2)) || self.object.to.to_s) ||
31
+ ::I18n.t("lolita.navigation.#{object.name}")
30
32
  end
31
33
  end
32
34
 
@@ -63,6 +65,31 @@ module Lolita
63
65
  self.children.branches.any?
64
66
  end
65
67
 
68
+ def populate_url(view)
69
+ self.options[:url] = calculate_url(view)
70
+ end
71
+
72
+ def calculate_url(view)
73
+ if self.options[:url].respond_to?(:call)
74
+ self.options[:url].call(view,self)
75
+ elsif self.options[:url]
76
+ self.options[:url]
77
+ elsif self.object.is_a?(Lolita::Mapping)
78
+ view.send(:lolita_resources_path, self.object)
79
+ else
80
+ self.first_url_in_subtree(view)
81
+ end
82
+ end
83
+
84
+ def first_url_in_subtree(view)
85
+ if self.subtree?
86
+ subtree_branch = self.children.branches.detect{|branch|
87
+ branch.visible?(view)
88
+ }
89
+ subtree_branch.calculate_url(view) if subtree_branch
90
+ end
91
+ end
92
+
66
93
  def siblings
67
94
  index=self.index
68
95
  {
@@ -102,7 +129,7 @@ module Lolita
102
129
 
103
130
  def visible?(view)
104
131
  self_visible = if self.object && self.object.respond_to?(:to)
105
- view.send(:can?,:read,self.object.to)
132
+ view.send(:authorization_proxy).send(:can?,:read,self.object.to)
106
133
  elsif self.options[:visible]
107
134
  if self.options[:visible].respond_to?(:call)
108
135
  self.options[:visible].call(view,self,branch)
@@ -51,6 +51,12 @@ module Lolita
51
51
  }.any?
52
52
  end
53
53
 
54
+ def populate_urls_in_branches(view)
55
+ self.each do |branch|
56
+ branch.populate_url(view)
57
+ end
58
+ end
59
+
54
60
  def method_missing method_name, *args
55
61
  @branches.send(method_name.to_sym,*args)
56
62
  end
@@ -33,6 +33,7 @@ module Lolita
33
33
  module ObservedArray
34
34
 
35
35
  def method_missing(method,*args,&block)
36
+ generate_collection_elements! if self.respond_to?(:generate_collection_elements!)
36
37
  collection_variable.__send__(method,*args,&block)
37
38
  end
38
39
 
@@ -61,7 +62,6 @@ module Lolita
61
62
  collection_variable.each{|collection_element| yield collection_element}
62
63
  end
63
64
 
64
-
65
65
  private
66
66
 
67
67
  def collection_variable
@@ -0,0 +1,7 @@
1
+ require 'lolita/adapter/field_helper'
2
+ require 'lolita/adapter/common_helper'
3
+ require 'lolita/adapter/abstract_adapter'
4
+ require 'lolita/adapter/active_record'
5
+ require 'lolita/adapter/mongoid'
6
+
7
+ require 'lolita/dbi/base'
@@ -0,0 +1,38 @@
1
+ module Lolita
2
+ module Processors
3
+ class RequestProcessor
4
+
5
+ attr_accessor :scope
6
+
7
+ def self.respond_to(mapping,scope,action)
8
+ action_processor = "Lolita::Processors::RequestProcessor::#{action.to_s.camelize}ActionProcessor".constantize.new(mapping,scope)
9
+ action_processor.respond
10
+ end
11
+
12
+ def initialize(mapping,scope)
13
+ @mapping = mapping
14
+ @scope = scope
15
+ end
16
+
17
+ def resource_class
18
+ @scope.resource_class
19
+ end
20
+
21
+ class IndexActionProcessor < self
22
+
23
+ def respond
24
+ build_response = resource_class.lolita.list.build(:page => page)
25
+ scope.instance_variable_set(:"@component_builder",build_response)
26
+ scope.haml :"lolita/rest/index.html", :layout => :"layouts/lolita/application.html"
27
+ end
28
+
29
+ def page
30
+ resource_class.lolita.list.paginate(1)
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ end