modular 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +1 -0
- data/lib/modular.rb +3 -14
- data/lib/modular/action_controller_extension.rb +16 -7
- data/lib/modular/components.rb +7 -4
- data/lib/modular/components/base.rb +75 -5
- data/lib/modular/components/container.rb +37 -11
- data/lib/modular/configuration.rb +8 -0
- data/lib/modular/creation.rb +20 -13
- data/lib/{generators → modular/generators}/component/USAGE +0 -0
- data/lib/modular/generators/component/component_generator.rb +18 -0
- data/lib/{generators → modular/generators}/component/templates/component.rb.erb +0 -0
- data/lib/{generators → modular/generators}/component/templates/template.erb +0 -0
- data/lib/modular/mst_rendering.rb +10 -0
- data/lib/modular/railtie.rb +4 -0
- data/lib/modular/rendering.rb +1 -42
- data/lib/modular/version.rb +1 -1
- data/spec/components/{base.rb → base_spec.rb} +12 -6
- data/spec/components/container_spec.rb +27 -0
- data/spec/components/{hello_world.rb → hello_world_spec.rb} +0 -0
- data/spec/components/{helpers_example.rb → helpers_example_spec.rb} +0 -0
- data/spec/components/spec/internal/log/test.log +0 -0
- data/spec/controllers/callback_layout_controller_spec.rb +4 -0
- data/spec/controllers/rendering_spec.rb +33 -0
- data/spec/internal/app/components/mustache_container.rb +5 -0
- data/spec/internal/app/components/mustached.rb +5 -0
- data/spec/internal/app/controllers/callback_layout_controller.rb +5 -5
- data/spec/internal/app/controllers/example_controller.rb +9 -1
- data/spec/internal/app/views/components/mustache_container.mst +3 -0
- data/spec/internal/app/views/components/mustached.mst +1 -0
- data/spec/internal/app/views/example/mustache.html.erb +1 -0
- data/spec/internal/app/views/example/mustache_nested.html.erb +1 -0
- data/spec/internal/config/initializers/modular.rb +11 -6
- data/spec/modular/configuration_spec.rb +6 -6
- data/spec/modular/creation_spec.rb +36 -5
- data/spec/modular/validation_spec.rb +115 -0
- data/templates/components/container.html.erb +7 -0
- data/templates/layout.erb +1 -3
- metadata +23 -47
- data/lib/generators/component/component_generator.rb +0 -16
- data/lib/modular/helpers.rb +0 -74
- data/modular-app/Gemfile +0 -20
- data/modular-app/Rakefile +0 -7
- data/modular-app/config.ru +0 -4
- data/modular-app/config/application.rb +0 -42
- data/modular-app/config/boot.rb +0 -6
- data/modular-app/config/database.yml +0 -22
- data/modular-app/config/environment.rb +0 -5
- data/modular-app/config/environments/development.rb +0 -26
- data/modular-app/config/environments/production.rb +0 -49
- data/modular-app/config/environments/test.rb +0 -35
- data/modular-app/config/initializers/backtrace_silencers.rb +0 -7
- data/modular-app/config/initializers/inflections.rb +0 -10
- data/modular-app/config/initializers/mime_types.rb +0 -5
- data/modular-app/config/initializers/secret_token.rb +0 -7
- data/modular-app/config/initializers/session_store.rb +0 -8
- data/modular-app/config/locales/en.yml +0 -5
- data/modular-app/config/routes.rb +0 -7
- data/modular-app/db/migrate/20110721090602_create_simple_models.rb +0 -12
- data/modular-app/db/schema.rb +0 -20
- data/modular-app/db/seeds.rb +0 -7
- data/modular-app/script/rails +0 -6
- data/modular-app/spec/spec_helper.rb +0 -27
- data/spec/components/container.rb +0 -34
- data/spec/components/validated.rb +0 -15
- data/spec/controllers/example_controller_spec.rb +0 -12
- data/spec/controllers/indirect_render_controller_spec.rb +0 -13
- data/spec/internal/app/components/heavy_task.rb +0 -8
- data/spec/internal/app/controllers/indirect_render_controller.rb +0 -7
- data/spec/internal/app/views/components/container.html.erb +0 -7
- data/spec/internal/app/views/components/heavy_task.html.erb +0 -1
- data/spec/internal/tmp/modular/cached_for_time.html.erb +0 -14
- data/spec/internal/tmp/modular/cached_forever.html.erb +0 -12
- data/spec/internal/tmp/modular/heavy.html.erb +0 -19
- data/spec/internal/tmp/modular/nested.html.erb +0 -28
- data/spec/views/indirect_render/index.html.erb_spec.rb +0 -4
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/lib/modular.rb
CHANGED
@@ -6,24 +6,14 @@ module Modular
|
|
6
6
|
eager_autoload do
|
7
7
|
autoload :Creation
|
8
8
|
autoload :Configuration
|
9
|
+
autoload :Components
|
9
10
|
autoload :LayoutGenerator
|
10
|
-
autoload :
|
11
|
+
autoload :MstRendering
|
11
12
|
end
|
12
13
|
|
13
14
|
delegate :create, :from_json, :to => Creation
|
14
15
|
delegate :config, :configure, :to => Configuration
|
15
|
-
|
16
|
-
def layout(id)
|
17
|
-
if Configuration.config.layouts.has_key?(id)
|
18
|
-
Configuration.config.layouts[id]
|
19
|
-
else
|
20
|
-
raise "Layout '#{id}' not found"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def layouts
|
25
|
-
Configuration.config.layouts
|
26
|
-
end
|
16
|
+
delegate :layout, :layouts, :to => :config
|
27
17
|
|
28
18
|
def generate_rails_layout(id, params = {})
|
29
19
|
LayoutGenerator.generate(id, params)
|
@@ -32,6 +22,5 @@ module Modular
|
|
32
22
|
extend self
|
33
23
|
end
|
34
24
|
|
35
|
-
require "modular/components"
|
36
25
|
require "modular/version"
|
37
26
|
require 'modular/railtie'
|
@@ -1,17 +1,26 @@
|
|
1
1
|
module Modular::ActionControllerExtension
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
|
-
def
|
5
|
-
layout
|
6
|
-
|
4
|
+
def modular_layout(name)
|
5
|
+
render :layout => get_layout_path(name)
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_layout_path(name)
|
9
|
+
if name.is_a?(Symbol)
|
10
|
+
|
11
|
+
name = self.__send__(name)
|
12
|
+
end
|
13
|
+
|
14
|
+
path = '../../../' + Modular.generate_rails_layout(name)
|
15
|
+
#cutting off '.html.erb'
|
16
|
+
path[0, path.length-9]
|
7
17
|
end
|
8
18
|
|
9
19
|
module ClassMethods
|
10
|
-
def modular_layout(name
|
20
|
+
def modular_layout(name)
|
11
21
|
proc = Proc.new do |controller|
|
12
|
-
|
13
|
-
|
14
|
-
path[0, path.length-9]
|
22
|
+
|
23
|
+
controller.send(:get_layout_path, name)
|
15
24
|
end
|
16
25
|
|
17
26
|
layout proc
|
data/lib/modular/components.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
module Modular::Components
|
2
|
-
|
2
|
+
extend ActiveSupport::Autoload
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
eager_autoload do
|
5
|
+
autoload :Base
|
6
|
+
autoload :Container
|
7
|
+
autoload :MainContent
|
8
|
+
end
|
9
|
+
end
|
@@ -1,32 +1,102 @@
|
|
1
1
|
require 'abstract_controller'
|
2
2
|
require "modular/rendering"
|
3
3
|
require "modular/caching"
|
4
|
+
require 'active_model'
|
4
5
|
|
5
6
|
module Modular
|
6
7
|
module Components
|
7
|
-
class Base <
|
8
|
+
class Base < AbstractController::Base
|
8
9
|
#rendering
|
9
10
|
include AbstractController::Rendering
|
10
11
|
include AbstractController::Helpers
|
11
12
|
include Modular::Rendering
|
12
13
|
|
13
|
-
|
14
|
-
true
|
15
|
-
end
|
14
|
+
abstract!
|
16
15
|
|
17
16
|
#slug
|
18
17
|
def self.type
|
19
|
-
self.name.
|
18
|
+
self.name.demodulize.underscore
|
20
19
|
end
|
21
20
|
|
22
21
|
def type
|
23
22
|
self.class.type
|
24
23
|
end
|
25
24
|
|
25
|
+
def self.use_mustached_template!
|
26
|
+
require 'mustache'
|
27
|
+
self.class_eval do
|
28
|
+
include Modular::MstRendering
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
include ActiveModel::Validations
|
33
|
+
include ActiveModel::Conversion
|
34
|
+
extend ActiveModel::Naming
|
35
|
+
|
36
|
+
def self.attr_reader(*fields)
|
37
|
+
fields.each do |field|
|
38
|
+
class_eval <<EOF
|
39
|
+
def #{field}
|
40
|
+
@attributes['#{field}']
|
41
|
+
end
|
42
|
+
EOF
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.attr_writer(*fields)
|
47
|
+
fields.each do |field|
|
48
|
+
class_eval <<EOF
|
49
|
+
def #{field}=(value)
|
50
|
+
@attributes['#{field}']=value
|
51
|
+
end
|
52
|
+
EOF
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.attr_accessor(*fields)
|
57
|
+
fields.each do |field|
|
58
|
+
attr_writer field
|
59
|
+
attr_reader field
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
26
63
|
#params for element itself
|
27
64
|
attr_accessor :title
|
65
|
+
attr_accessor :uniqid
|
66
|
+
attr_accessor :width
|
28
67
|
|
29
68
|
validates :title, :length => {:maximum => 64}
|
69
|
+
|
70
|
+
def initialize(attributes = {})
|
71
|
+
append_view_path(Rails.root.join('app', 'views'))
|
72
|
+
append_view_path(Gem.loaded_specs['modular'].full_gem_path + '/templates')
|
73
|
+
|
74
|
+
@attributes ||= ActiveSupport::HashWithIndifferentAccess.new
|
75
|
+
|
76
|
+
@attributes[:uniqid] = ''
|
77
|
+
@attributes[:width] = 0
|
78
|
+
|
79
|
+
attributes.each do |name, value|
|
80
|
+
@attributes[name.to_s] = value
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def persisted?
|
85
|
+
false
|
86
|
+
end
|
87
|
+
|
88
|
+
def to_hash
|
89
|
+
@attributes.merge({:type => type})
|
90
|
+
end
|
91
|
+
|
92
|
+
def to_json
|
93
|
+
ActiveSupport::JSON.encode to_hash
|
94
|
+
end
|
95
|
+
|
96
|
+
def all_errors
|
97
|
+
valid? #this call is used to make validation calls
|
98
|
+
{ uniqid => errors.to_a }
|
99
|
+
end
|
30
100
|
end
|
31
101
|
end
|
32
102
|
end
|
@@ -1,30 +1,56 @@
|
|
1
1
|
module Modular
|
2
2
|
module Components
|
3
3
|
class Container < Base
|
4
|
-
attr_accessor :
|
4
|
+
attr_accessor :children
|
5
5
|
|
6
6
|
def initialize(attributes = {})
|
7
|
-
@attributes = ActiveSupport::HashWithIndifferentAccess.new(:
|
7
|
+
@attributes = ActiveSupport::HashWithIndifferentAccess.new(:children => [])
|
8
8
|
attributes = attributes.with_indifferent_access
|
9
|
-
attributes["
|
9
|
+
attributes["children"] ||= []
|
10
10
|
|
11
|
-
attributes["
|
12
|
-
if value.is_a? Modular::Components::Base
|
13
|
-
@attributes[:components].push value
|
14
|
-
else
|
15
|
-
@attributes[:components].push(Modular.from_json(value)) rescue ''
|
16
|
-
end
|
11
|
+
attributes["children"].each do |value|
|
12
|
+
@attributes[:children].push value if value.is_a? Modular::Components::Base
|
17
13
|
end
|
18
14
|
|
19
|
-
super(attributes.except("
|
15
|
+
super(attributes.except("children"))
|
20
16
|
end
|
21
17
|
|
22
18
|
def add(type, args = {}, &block)
|
23
19
|
cont = Modular.create(type, args)
|
24
20
|
cont.instance_eval &block if block_given?
|
25
|
-
|
21
|
+
children.push cont
|
22
|
+
end
|
23
|
+
|
24
|
+
def valid_with_children?(context = nil)
|
25
|
+
children.each do |child|
|
26
|
+
return false if child.invalid?
|
27
|
+
end
|
28
|
+
|
29
|
+
valid_with_no_children?
|
26
30
|
end
|
27
31
|
|
32
|
+
alias_method :valid_with_no_children?, :valid?
|
33
|
+
alias_method :valid?, :valid_with_children?
|
34
|
+
|
35
|
+
def all_errors
|
36
|
+
if valid_with_no_children?
|
37
|
+
errs = {}
|
38
|
+
else
|
39
|
+
errs = super
|
40
|
+
end
|
41
|
+
|
42
|
+
children.each do |child|
|
43
|
+
e = child.all_errors
|
44
|
+
e.each do |key, value|
|
45
|
+
unless value.empty?
|
46
|
+
errs[key] ||= []
|
47
|
+
errs[key] += value
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
errs
|
53
|
+
end
|
28
54
|
end
|
29
55
|
end
|
30
56
|
end
|
@@ -15,6 +15,14 @@ module Modular
|
|
15
15
|
instance.instance_eval &block if block_given?
|
16
16
|
instance
|
17
17
|
end
|
18
|
+
|
19
|
+
def layout(id)
|
20
|
+
if layouts.has_key?(id)
|
21
|
+
layouts[id]
|
22
|
+
else
|
23
|
+
raise "Layout '#{id}' not found"
|
24
|
+
end
|
25
|
+
end
|
18
26
|
|
19
27
|
def register_layout(layout, mod = :container, params = {}, &block)
|
20
28
|
@layouts ||= Hash.new.with_indifferent_access
|
data/lib/modular/creation.rb
CHANGED
@@ -4,25 +4,32 @@ module Modular
|
|
4
4
|
return typ if typ.is_a? Modular::Components::Base
|
5
5
|
|
6
6
|
begin
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
component = (Components.name + '::' + typ.to_s.camelize).constantize.new params
|
11
|
-
end
|
12
|
-
rescue Exception => e
|
13
|
-
raise "Unable to create element " + typ.to_s
|
7
|
+
component = typ.to_s.camelize.constantize.new params
|
8
|
+
rescue NameError
|
9
|
+
component = (Components.name + '::' + typ.to_s.camelize).constantize.new params
|
14
10
|
end
|
15
|
-
|
16
|
-
raise "Component has errors: " + component.errors.to_s if component.invalid?
|
17
11
|
|
18
12
|
component
|
19
13
|
end
|
20
14
|
|
21
|
-
def from_json(
|
22
|
-
obj = ActiveSupport::JSON.decode
|
15
|
+
def from_json(obj)
|
16
|
+
obj = ActiveSupport::JSON.decode obj if obj.is_a? String
|
17
|
+
obj = obj.with_indifferent_access
|
18
|
+
|
23
19
|
raise "Type expected in json string" unless obj['type']
|
24
|
-
create(obj['type'], obj.except('type'))
|
25
|
-
|
20
|
+
component = create(obj['type'], obj.except('type').except("children"))
|
21
|
+
|
22
|
+
if obj.has_key?('children') && component.is_a?(Modular::Components::Container)
|
23
|
+
obj['children'].each do |child|
|
24
|
+
if child.is_a? Hash
|
25
|
+
child_component = from_json(child)
|
26
|
+
component.add(child_component)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
component
|
32
|
+
end
|
26
33
|
|
27
34
|
extend self
|
28
35
|
end
|
File without changes
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Modular
|
2
|
+
class ComponentGenerator < Rails::Generators::NamedBase
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
|
5
|
+
def generate_template
|
6
|
+
template "component.rb.erb", "app/components/#{filename}.rb"
|
7
|
+
end
|
8
|
+
|
9
|
+
def generate_controller
|
10
|
+
template "template.erb", "app/views/components/#{filename}.html.erb"
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def filename
|
15
|
+
name.underscore
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
File without changes
|
File without changes
|
data/lib/modular/railtie.rb
CHANGED
data/lib/modular/rendering.rb
CHANGED
@@ -1,59 +1,18 @@
|
|
1
1
|
module Modular::Rendering
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
|
-
def controller_path
|
5
|
-
'components'
|
6
|
-
end
|
7
|
-
|
8
4
|
def action_name
|
9
5
|
type.underscore
|
10
6
|
end
|
11
|
-
|
12
|
-
# def config
|
13
|
-
# ActionController::Base.config
|
14
|
-
# end
|
15
7
|
|
16
8
|
def execute
|
17
9
|
end
|
18
|
-
|
10
|
+
|
19
11
|
def render
|
20
12
|
execute
|
21
13
|
modular_render :render_type => :indirect
|
22
14
|
end
|
23
15
|
|
24
|
-
# configure the different paths correctly
|
25
|
-
def initialize(*args)
|
26
|
-
super()
|
27
|
-
lookup_context.view_paths = Rails.root.join('app', 'views')
|
28
|
-
config.javascripts_dir = Rails.root.join('public', 'javascripts')
|
29
|
-
config.stylesheets_dir = Rails.root.join('public', 'stylesheets')
|
30
|
-
config.assets_dir = Rails.root.join('public')
|
31
|
-
end
|
32
|
-
|
33
|
-
# we are not in a browser, no need for this
|
34
|
-
def protect_against_forgery?
|
35
|
-
false
|
36
|
-
end
|
37
|
-
|
38
|
-
# so that your flash calls still work
|
39
|
-
def flash
|
40
|
-
{}
|
41
|
-
end
|
42
|
-
|
43
|
-
def params
|
44
|
-
{}
|
45
|
-
end
|
46
|
-
|
47
|
-
# # same asset host as the controllers
|
48
|
-
# self.asset_host = ActionController::Base.asset_host
|
49
|
-
|
50
|
-
def initialize(attributes = {})
|
51
|
-
append_view_path(Rails.root.join('app', 'views'))
|
52
|
-
append_view_path(Gem.loaded_specs['modular'].full_gem_path + '/templates')
|
53
|
-
|
54
|
-
super
|
55
|
-
end
|
56
|
-
|
57
16
|
protected
|
58
17
|
def modular_render(args = {})
|
59
18
|
render_to_string :file => 'components/' + action_name, :locals => args
|