para 0.4.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.
Files changed (203) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +65 -0
  4. data/Rakefile +21 -0
  5. data/app/assets/images/para/admin/bg.png +0 -0
  6. data/app/assets/javascripts/admin/app.coffee +1 -0
  7. data/app/assets/javascripts/para/admin/table.coffee +46 -0
  8. data/app/assets/javascripts/para/admin/theme_actions.coffee +26 -0
  9. data/app/assets/javascripts/para/admin/tree.coffee +53 -0
  10. data/app/assets/javascripts/para/admin.coffee +18 -0
  11. data/app/assets/javascripts/para/application.js +13 -0
  12. data/app/assets/javascripts/para/inputs/nested_many.coffee +57 -0
  13. data/app/assets/javascripts/para/lib/ajax.coffee +11 -0
  14. data/app/assets/stylesheets/admin/app.sass +0 -0
  15. data/app/assets/stylesheets/admin/theme.sass +0 -0
  16. data/app/assets/stylesheets/para/admin/theme/_base.sass +170 -0
  17. data/app/assets/stylesheets/para/admin/theme/_breadcrumb.sass +29 -0
  18. data/app/assets/stylesheets/para/admin/theme/_buttons.sass +24 -0
  19. data/app/assets/stylesheets/para/admin/theme/_checkable.sass +107 -0
  20. data/app/assets/stylesheets/para/admin/theme/_commonds.sass +213 -0
  21. data/app/assets/stylesheets/para/admin/theme/_dropdown.sass +53 -0
  22. data/app/assets/stylesheets/para/admin/theme/_form.sass +141 -0
  23. data/app/assets/stylesheets/para/admin/theme/_list.sass +138 -0
  24. data/app/assets/stylesheets/para/admin/theme/_navigation.sass +287 -0
  25. data/app/assets/stylesheets/para/admin/theme/_navtabs.sass +127 -0
  26. data/app/assets/stylesheets/para/admin/theme/_orderable.sass +44 -0
  27. data/app/assets/stylesheets/para/admin/theme/_panel.sass +288 -0
  28. data/app/assets/stylesheets/para/admin/theme/_responsive.sass +123 -0
  29. data/app/assets/stylesheets/para/admin/theme/_sorting.sass +30 -0
  30. data/app/assets/stylesheets/para/admin/theme/_table.sass +24 -0
  31. data/app/assets/stylesheets/para/admin/theme/_tree.sass +74 -0
  32. data/app/assets/stylesheets/para/admin/theme/_variables.sass +31 -0
  33. data/app/assets/stylesheets/para/admin/theme.sass +22 -0
  34. data/app/assets/stylesheets/para/admin.sass +10 -0
  35. data/app/assets/stylesheets/para/application.css +15 -0
  36. data/app/assets/stylesheets/para/lib/_variables.scss +646 -0
  37. data/app/assets/stylesheets/para/overrides/datetimepicker.sass +17 -0
  38. data/app/assets/stylesheets/para/overrides/fuelux.sass +43 -0
  39. data/app/assets/stylesheets/para/overrides/jasny.bootstrap.sass +41 -0
  40. data/app/assets/stylesheets/para/overrides/redactor.sass +88 -0
  41. data/app/assets/stylesheets/para/overrides/responsive.sass +63 -0
  42. data/app/assets/stylesheets/para/overrides/selectize.sass +45 -0
  43. data/app/assets/stylesheets/para/overrides/slider.sass +13 -0
  44. data/app/assets/stylesheets/para/overrides/theme.sass +172 -0
  45. data/app/controllers/concerns/para/admin/resource_controller_concerns.rb +17 -0
  46. data/app/controllers/para/admin/base_controller.rb +46 -0
  47. data/app/controllers/para/admin/component_controller.rb +9 -0
  48. data/app/controllers/para/admin/crud_component_controller.rb +17 -0
  49. data/app/controllers/para/admin/crud_resources_controller.rb +71 -0
  50. data/app/controllers/para/admin/main_controller.rb +8 -0
  51. data/app/controllers/para/admin/resources_controller.rb +163 -0
  52. data/app/controllers/para/admin/settings_component_controller.rb +11 -0
  53. data/app/controllers/para/admin/settings_form_controller.rb +21 -0
  54. data/app/controllers/para/admin/singleton_resource_component_controller.rb +14 -0
  55. data/app/controllers/para/admin/singleton_resources_controller.rb +30 -0
  56. data/app/controllers/para/application_controller.rb +7 -0
  57. data/app/decorators/para/component/base_decorator.rb +48 -0
  58. data/app/decorators/para/component/crud_decorator.rb +32 -0
  59. data/app/decorators/para/component/settings_decorator.rb +11 -0
  60. data/app/decorators/para/component/singleton_resource_decorator.rb +11 -0
  61. data/app/decorators/para/component_section_decorator.rb +4 -0
  62. data/app/helpers/para/admin/base_helper.rb +57 -0
  63. data/app/helpers/para/admin/component_groups_helper.rb +4 -0
  64. data/app/helpers/para/admin/components_helper.rb +4 -0
  65. data/app/helpers/para/admin/resources_helper.rb +27 -0
  66. data/app/helpers/para/application_helper.rb +14 -0
  67. data/app/helpers/para/exports_helper.rb +11 -0
  68. data/app/helpers/para/flash_helper.rb +48 -0
  69. data/app/helpers/para/form_helper.rb +28 -0
  70. data/app/helpers/para/markup_helper.rb +15 -0
  71. data/app/helpers/para/model_helper.rb +38 -0
  72. data/app/helpers/para/navigation_helper.rb +8 -0
  73. data/app/helpers/para/ordering_helper.rb +20 -0
  74. data/app/helpers/para/search_helper.rb +22 -0
  75. data/app/helpers/para/tag_helper.rb +50 -0
  76. data/app/helpers/para/tree_helper.rb +41 -0
  77. data/app/models/para/component/base.rb +70 -0
  78. data/app/models/para/component/crud.rb +45 -0
  79. data/app/models/para/component/resource.rb +33 -0
  80. data/app/models/para/component/settings.rb +17 -0
  81. data/app/models/para/component/singleton_resource.rb +25 -0
  82. data/app/models/para/component_resource.rb +6 -0
  83. data/app/models/para/component_section.rb +18 -0
  84. data/app/views/layouts/para/admin.html.haml +32 -0
  85. data/app/views/layouts/para/application.html.erb +14 -0
  86. data/app/views/para/admin/component_sections/_form.html.haml +10 -0
  87. data/app/views/para/admin/component_sections/edit.html.haml +5 -0
  88. data/app/views/para/admin/component_sections/new.html.haml +5 -0
  89. data/app/views/para/admin/components/_form.html.haml +15 -0
  90. data/app/views/para/admin/components/new.html.haml +4 -0
  91. data/app/views/para/admin/crud_component/show.html.haml +4 -0
  92. data/app/views/para/admin/dashboard.html.haml +10 -0
  93. data/app/views/para/admin/main/index.html.haml +1 -0
  94. data/app/views/para/admin/resources/_exports_menu.html.haml +12 -0
  95. data/app/views/para/admin/resources/_fields.html.haml +5 -0
  96. data/app/views/para/admin/resources/_filters.html.haml +9 -0
  97. data/app/views/para/admin/resources/_form.html.haml +6 -0
  98. data/app/views/para/admin/resources/_list.html.haml +22 -0
  99. data/app/views/para/admin/resources/_table.html.haml +8 -0
  100. data/app/views/para/admin/resources/_tree.html.haml +15 -0
  101. data/app/views/para/admin/resources/_tree_item.html.haml +16 -0
  102. data/app/views/para/admin/resources/edit.html.haml +6 -0
  103. data/app/views/para/admin/resources/new.html.haml +6 -0
  104. data/app/views/para/admin/settings_component/show.html.haml +12 -0
  105. data/app/views/para/admin/shared/_breadcrumb.html.haml +3 -0
  106. data/app/views/para/admin/shared/_header.html.haml +27 -0
  107. data/app/views/para/admin/shared/_navigation.html.haml +21 -0
  108. data/app/views/para/admin/singleton_resource_component/show.html.haml +5 -0
  109. data/app/views/para/inputs/_nested_many.html.haml +10 -0
  110. data/app/views/para/inputs/_nested_many_container.html.haml +19 -0
  111. data/app/views/para/inputs/_nested_one.html.haml +3 -0
  112. data/config/locales/en.yml +86 -0
  113. data/config/locales/fr.yml +101 -0
  114. data/db/migrate/20140911091225_create_para_components.rb +19 -0
  115. data/db/migrate/20140911112150_add_slug_to_para_components.rb +6 -0
  116. data/db/migrate/20140929125733_create_para_component_sections.rb +8 -0
  117. data/db/migrate/20140929131111_add_identifier_to_para_component_sections.rb +5 -0
  118. data/db/migrate/20140930121822_add_position_to_para_component_section.rb +5 -0
  119. data/db/migrate/20150129170710_create_para_component_resources.rb +13 -0
  120. data/db/migrate/20150203173219_add_identifier_to_para_components.rb +5 -0
  121. data/lib/generators/para/admin_user/admin_user_generator.rb +16 -0
  122. data/lib/generators/para/component/component_generator.rb +59 -0
  123. data/lib/generators/para/component/templates/component.rb +3 -0
  124. data/lib/generators/para/component/templates/component_controller.rb +7 -0
  125. data/lib/generators/para/component/templates/show.html.haml +2 -0
  126. data/lib/generators/para/exporter/exporter_generator.rb +42 -0
  127. data/lib/generators/para/exporter/templates/base_exporter.rb +15 -0
  128. data/lib/generators/para/exporter/templates/csv_exporter.rb +13 -0
  129. data/lib/generators/para/form/form_generator.rb +15 -0
  130. data/lib/generators/para/form/templates/_form.html.haml +7 -0
  131. data/lib/generators/para/install/install_generator.rb +112 -0
  132. data/lib/generators/para/install/templates/components.rb +13 -0
  133. data/lib/generators/para/install/templates/initializer.rb +23 -0
  134. data/lib/generators/para/nested_fields/nested_fields_generator.rb +15 -0
  135. data/lib/generators/para/nested_fields/templates/_nested_fields.html.haml +3 -0
  136. data/lib/generators/para/orderable/orderable_generator.rb +53 -0
  137. data/lib/generators/para/orderable/templates/orderable_migration.rb +6 -0
  138. data/lib/generators/para/resource/resource_generator.rb +71 -0
  139. data/lib/generators/para/resource/templates/resource_controller.rb +5 -0
  140. data/lib/generators/para/table/table_generator.rb +34 -0
  141. data/lib/generators/para/table/templates/_table.html.haml +10 -0
  142. data/lib/para/attribute_field/base.rb +77 -0
  143. data/lib/para/attribute_field/belongs_to.rb +29 -0
  144. data/lib/para/attribute_field/boolean.rb +15 -0
  145. data/lib/para/attribute_field/datetime.rb +9 -0
  146. data/lib/para/attribute_field/file.rb +20 -0
  147. data/lib/para/attribute_field/has_many.rb +31 -0
  148. data/lib/para/attribute_field/image.rb +25 -0
  149. data/lib/para/attribute_field/nested_many.rb +26 -0
  150. data/lib/para/attribute_field/nested_one.rb +27 -0
  151. data/lib/para/attribute_field/password.rb +18 -0
  152. data/lib/para/attribute_field/redactor.rb +20 -0
  153. data/lib/para/attribute_field/relation.rb +52 -0
  154. data/lib/para/attribute_field/translation.rb +9 -0
  155. data/lib/para/attribute_field_mappings.rb +82 -0
  156. data/lib/para/cloneable.rb +20 -0
  157. data/lib/para/component/exportable.rb +25 -0
  158. data/lib/para/component.rb +27 -0
  159. data/lib/para/components_configuration.rb +156 -0
  160. data/lib/para/config.rb +21 -0
  161. data/lib/para/engine.rb +59 -0
  162. data/lib/para/errors.rb +15 -0
  163. data/lib/para/exporter/base.rb +27 -0
  164. data/lib/para/exporter/csv.rb +49 -0
  165. data/lib/para/exporter.rb +57 -0
  166. data/lib/para/ext/cancan.rb +26 -0
  167. data/lib/para/ext/paperclip.rb +67 -0
  168. data/lib/para/ext.rb +13 -0
  169. data/lib/para/form_builder/containers.rb +70 -0
  170. data/lib/para/form_builder/field_mappings.rb +9 -0
  171. data/lib/para/form_builder/nested_form.rb +80 -0
  172. data/lib/para/form_builder/ordering.rb +15 -0
  173. data/lib/para/form_builder/settings.rb +24 -0
  174. data/lib/para/form_builder.rb +22 -0
  175. data/lib/para/generators/field_helpers.rb +32 -0
  176. data/lib/para/generators/name_helpers.rb +9 -0
  177. data/lib/para/generators/named_base.rb +7 -0
  178. data/lib/para/generators.rb +11 -0
  179. data/lib/para/inputs/nested_many_input.rb +40 -0
  180. data/lib/para/inputs/nested_one_input.rb +24 -0
  181. data/lib/para/inputs.rb +11 -0
  182. data/lib/para/markup/alert.rb +37 -0
  183. data/lib/para/markup/component.rb +20 -0
  184. data/lib/para/markup/modal.rb +52 -0
  185. data/lib/para/markup/panel.rb +41 -0
  186. data/lib/para/markup/resources_table.rb +178 -0
  187. data/lib/para/markup.rb +10 -0
  188. data/lib/para/model_field_parsers/base.rb +20 -0
  189. data/lib/para/model_field_parsers/devise.rb +37 -0
  190. data/lib/para/model_field_parsers/globalize.rb +23 -0
  191. data/lib/para/model_field_parsers/orderable.rb +15 -0
  192. data/lib/para/model_field_parsers/paperclip.rb +51 -0
  193. data/lib/para/model_field_parsers/redactor.rb +19 -0
  194. data/lib/para/model_field_parsers/relations.rb +67 -0
  195. data/lib/para/model_field_parsers.rb +22 -0
  196. data/lib/para/orderable.rb +44 -0
  197. data/lib/para/routes.rb +49 -0
  198. data/lib/para/version.rb +3 -0
  199. data/lib/para.rb +65 -0
  200. data/lib/rails/relation_length_validator.rb +45 -0
  201. data/lib/rails/routing_mapper.rb +27 -0
  202. data/lib/tasks/para_tasks.rake +22 -0
  203. metadata +595 -0
@@ -0,0 +1,19 @@
1
+ module Para
2
+ module ModelFieldParsers
3
+ class Redactor < Para::ModelFieldParsers::Base
4
+ register :redactor, self
5
+
6
+ def parse!
7
+ %w(content description).each do |field_name|
8
+ field = fields_hash[field_name]
9
+
10
+ if field && field.type == :text
11
+ fields_hash[field_name] = Para::AttributeField::Redactor.new(
12
+ field.model, name: field_name
13
+ )
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,67 @@
1
+ module Para
2
+ module ModelFieldParsers
3
+ class Relations < Para::ModelFieldParsers::Base
4
+ register :relations, self
5
+
6
+ def parse!
7
+ model.reflections.each do |name, reflection|
8
+ # We ensure that name is a symbol and not a string for 4.2+
9
+ # versions of AR
10
+ # We may find a better solution to handle strings, since our
11
+ # `fields_hash` is already a `HashWithIndifferentAccess`
12
+ name = name.to_sym
13
+
14
+ next if name == :component
15
+
16
+ # Remove foreign key, if existing, from fields
17
+ fields_hash.delete(reflection.foreign_key.to_s)
18
+
19
+ if reflection.options[:polymorphic] == true
20
+ fields_hash.delete(reflection.foreign_type.to_s)
21
+ next
22
+ end
23
+
24
+ if model.nested_attributes_options[name]
25
+ if reflection.collection?
26
+ fields_hash[name] = AttributeField::NestedManyField.new(
27
+ model, name: name, type: 'has_many', field_type: 'nested_many'
28
+ )
29
+ else
30
+ fields_hash[name] = AttributeField::NestedOneField.new(
31
+ model, name: name, type: 'belongs_to', field_type: 'nested_one'
32
+ )
33
+ end
34
+ else
35
+ if reflection.collection?
36
+ remove_counter_cache_column!(name, reflection)
37
+
38
+ fields_hash[name] = AttributeField::HasManyField.new(
39
+ model, name: name, type: 'has_many', field_type: 'selectize'
40
+ )
41
+ else
42
+ fields_hash[name] = AttributeField::BelongsToField.new(
43
+ model, name: name, type: 'belongs_to', field_type: 'selectize'
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ # Allows removing counter cache columns from fields from has_many
51
+ # relations, when :inverse_of option is set
52
+ #
53
+ def remove_counter_cache_column!(name, reflection)
54
+ return unless (inverse_relation = reflection.inverse_of)
55
+ return unless (counter_name = inverse_relation.options[:counter_cache])
56
+
57
+ counter_name = if String === counter_name
58
+ counter_name
59
+ else
60
+ "#{ name }_count"
61
+ end
62
+
63
+ fields_hash.delete(counter_name)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,22 @@
1
+ module Para
2
+ module ModelFieldParsers
3
+ def self.registered_parsers
4
+ @registered_parsers ||= {}
5
+ end
6
+
7
+ def self.parse!(model, fields_hash)
8
+ registered_parsers.each do |_, parser_class|
9
+ parser = parser_class.new(model, fields_hash)
10
+ parser.parse! if parser.applicable?
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ require 'para/model_field_parsers/base'
17
+ require 'para/model_field_parsers/devise'
18
+ require 'para/model_field_parsers/paperclip'
19
+ require 'para/model_field_parsers/orderable'
20
+ require 'para/model_field_parsers/relations'
21
+ require 'para/model_field_parsers/redactor'
22
+ require 'para/model_field_parsers/globalize'
@@ -0,0 +1,44 @@
1
+ module Para
2
+ module Orderable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ scope :ordered, -> { order('position ASC') }
7
+ before_create :orederable_assign_position
8
+ end
9
+
10
+ def orederable_assign_position
11
+ last_resource = self.class.order('position DESC')
12
+ .where.not(position: nil)
13
+ .select(:position)
14
+ .first
15
+
16
+ self.position = if last_resource && last_resource.position
17
+ last_resource.position + 1
18
+ else
19
+ 0
20
+ end
21
+ end
22
+ end
23
+
24
+ module ActiveRecordOrderableMixin
25
+ extend ActiveSupport::Concern
26
+
27
+ included do
28
+ class_attribute :orderable
29
+ end
30
+
31
+ module ClassMethods
32
+ def acts_as_orderable
33
+ return if orderable?
34
+
35
+ self.orderable = true
36
+ include Para::Orderable
37
+ end
38
+
39
+ def orderable?
40
+ !!orderable
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,49 @@
1
+ module Para
2
+ class Routes
3
+ attr_reader :router
4
+
5
+ def initialize(router)
6
+ @router = router
7
+ end
8
+
9
+ def draw(mount_location = '/', &block)
10
+ routes = self
11
+
12
+ router.instance_eval do
13
+ scope mount_location do
14
+ scope module: :para do
15
+ namespace :admin do
16
+ get '/' => 'main#index'
17
+
18
+ component :crud do
19
+ scope ':model' do
20
+ resources :crud_resources, path: '/' do
21
+ collection do
22
+ patch :order
23
+ patch :tree
24
+ get :export
25
+ end
26
+
27
+ member do
28
+ post :clone
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ component :singleton_resource, path: 'resource-form' do
35
+ resource :singleton_resource, path: 'resource', only: [:create, :update]
36
+ end
37
+
38
+ component :settings do
39
+ resource :settings_form, controller: 'settings_form', only: [:update]
40
+ end
41
+ end
42
+ end
43
+
44
+ block.call if block
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ module Para
2
+ VERSION = "0.4.0"
3
+ end
data/lib/para.rb ADDED
@@ -0,0 +1,65 @@
1
+ require 'devise'
2
+ require 'paperclip'
3
+ require 'simple_form'
4
+ require 'simple_form_extension'
5
+ require 'active_decorator'
6
+ require 'friendly_id'
7
+ require 'haml-rails'
8
+ require 'truncate_html'
9
+ require 'cocoon'
10
+ require 'cancan'
11
+ require 'request_store'
12
+
13
+ require 'sass-rails'
14
+ require 'selectize-rails'
15
+ require 'bootstrap-sass'
16
+ require 'compass-rails'
17
+ require 'font-awesome-rails'
18
+
19
+ require 'rails/routing_mapper'
20
+ require 'rails/relation_length_validator'
21
+
22
+ require 'para/ext'
23
+ require 'para/errors'
24
+ require 'para/config'
25
+ require 'para/model_field_parsers'
26
+ require 'para/attribute_field_mappings'
27
+ require 'para/inputs'
28
+ require 'para/cloneable'
29
+ require 'para/orderable'
30
+ require 'para/form_builder'
31
+ require 'para/markup'
32
+ require 'para/engine'
33
+ require 'para/components_configuration'
34
+ require 'para/exporter'
35
+
36
+ module Para
37
+ extend ActiveSupport::Autoload
38
+
39
+ eager_autoload do
40
+ autoload :Config
41
+ autoload :Component
42
+ autoload :Generators
43
+ autoload :Routes
44
+ end
45
+
46
+ def self.config(&block)
47
+ if block
48
+ block.call(Para::Config)
49
+ else
50
+ Para::Config
51
+ end
52
+ end
53
+
54
+ def self.components
55
+ Para::Component.config
56
+ end
57
+
58
+ def self.store
59
+ RequestStore.store
60
+ end
61
+
62
+ def self.table_name_prefix
63
+ 'para_'
64
+ end
65
+ end
@@ -0,0 +1,45 @@
1
+ class RelationLengthValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ if smaller?(value)
4
+ record.errors.add(attribute, smaller_error_message, options)
5
+ elsif greater?(value)
6
+ record.errors.add(attribute, greater_error_message, options)
7
+ end
8
+ end
9
+
10
+ private
11
+
12
+ def minimum
13
+ options[:minimum] || 0
14
+ end
15
+
16
+ def maximum
17
+ options[:maximum] || Float::INFINITY
18
+ end
19
+
20
+ def smaller?(value)
21
+ value.length < minimum
22
+ end
23
+
24
+ def greater?(value)
25
+ value.length > minimum
26
+ end
27
+
28
+ def smaller_error_message
29
+ message = options[:message] && options[:message][:minimum]
30
+ message || I18n.t(
31
+ "activerecord.errors.relation_length_is_smaller",
32
+ minimum: minimum,
33
+ default: "must have at least #{ minimum } elements"
34
+ )
35
+ end
36
+
37
+ def greater_error_message
38
+ message = options[:message] && options[:message][:maximum]
39
+ message || I18n.t(
40
+ "activerecord.errors.relation_length_is_greater",
41
+ maximum: maximum,
42
+ default: "must have at most #{ maximum } elements"
43
+ )
44
+ end
45
+ end
@@ -0,0 +1,27 @@
1
+ module ActionDispatch
2
+ module Routing
3
+ class Mapper
4
+ def para_at(mount_location, &block)
5
+ Para::Routes.new(self).draw(mount_location, &block)
6
+ end
7
+
8
+ def para_plugin(plugin_name)
9
+ routes = ['', plugin_name.to_s.camelize, 'Routes'].join('::').constantize
10
+ routes.new(self).draw
11
+ end
12
+
13
+ def component(component_name, options = {}, &block)
14
+ path = options.fetch(:path, component_name.to_s)
15
+ as = options.fetch(:as, component_name)
16
+ controller = options.fetch(:controller, "#{ component_name }_component")
17
+
18
+ endpoint = "#{ path }/:component_id"
19
+
20
+ get endpoint => "#{ controller }#show", as: as
21
+ delete endpoint => "#{ controller }#destroy", as: "destroy_#{as}"
22
+
23
+ scope(endpoint, as: component_name, &block) if block
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,22 @@
1
+ namespace :para do
2
+ namespace :components do
3
+ desc <<-DESC
4
+ Remove all components that are no longer referenced in the components.rb
5
+ configuration file
6
+ DESC
7
+
8
+ task clean: :environment do
9
+ Para::Component::Base.find_each do |component|
10
+ unless Para.components.component_for(component.identifier)
11
+ component.destroy
12
+ end
13
+ end
14
+
15
+ Para::ComponentSection.find_each do |section|
16
+ unless Para.components.section_for(section.identifier)
17
+ section.destroy
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end