rapid-core 0.1 → 0.2.1
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/.gitignore +1 -0
- data/Gemfile.lock +35 -2
- data/Rakefile +77 -48
- data/doc/server.txt +15 -0
- data/features/settings/double-nested/default.feature +2 -2
- data/features/settings/double-nested/validates/presence_of.feature +1 -1
- data/features/settings/nested/default.feature +1 -1
- data/features/settings/nested/validates/presence_of.feature +1 -1
- data/features/settings/not_found.feature +2 -2
- data/features/step_definitions/settings_steps.rb +7 -3
- data/features/step_definitions/template_steps.rb +3 -1
- data/lib/rapid/check.rb +30 -23
- data/lib/rapid/core.rb +12 -0
- data/lib/rapid/error.rb +1 -0
- data/lib/rapid/module.rb +10 -1
- data/lib/rapid/railtie.rb +6 -0
- data/lib/rapid/setting/base.rb +31 -8
- data/lib/rapid/setting/boolean_setting.rb +20 -1
- data/lib/rapid/setting/definer.rb +11 -47
- data/lib/rapid/setting/integer_setting.rb +7 -7
- data/lib/rapid/setting/module.rb +56 -0
- data/lib/rapid/setting/namespace/base.rb +35 -60
- data/lib/rapid/setting/namespace/instance.rb +195 -28
- data/lib/rapid/setting/string_setting.rb +7 -1
- data/lib/rapid/settings.rb +51 -65
- data/lib/rapid/skeleton/base.rb +39 -18
- data/lib/rapid/skeleton/helpers/directory.rb +5 -6
- data/lib/rapid/skeleton/helpers/files.rb +62 -0
- data/lib/rapid/skeleton/helpers/gem.rb +43 -32
- data/lib/rapid/skeleton/helpers/if_setting.rb +44 -0
- data/lib/rapid/skeleton/helpers/migration.rb +102 -32
- data/lib/rapid/skeleton/helpers/route.rb +8 -12
- data/lib/rapid/skeleton/helpers/script.rb +1 -2
- data/lib/rapid/skeleton/helpers/template.rb +23 -25
- data/lib/rapid/skeleton/helpers/view.rb +7 -7
- data/lib/rapid/spec/template.rb +1 -1
- data/lib/rapid/version.rb +1 -1
- data/lib/rapid/web/base.rb +35 -0
- data/lib/rapid/web/bootstrap.rb +98 -0
- data/lib/rapid/web/controller_helpers.rb +60 -0
- data/lib/rapid/web/navigator.rb +18 -0
- data/lib/rapid/web/select_helpers.rb +63 -0
- data/lib/rapid/web/settings_form_builder.rb +205 -0
- data/lib/rapid/web/static_helpers.rb +28 -0
- data/lib/rapid/web/tasks.rb +10 -0
- data/public/rapid/core/bootstrap-collapse.js +136 -0
- data/public/rapid/core/bootstrap-responsive.min.css +3 -0
- data/public/rapid/core/bootstrap.min.css +556 -0
- data/public/rapid/core/jquery-1.7.1.js +9253 -0
- data/public/rapid/core/prettify.css +30 -0
- data/public/rapid/core/prettify.js +28 -0
- data/rapid-core.gemspec +5 -0
- data/spec/rapid/check_spec.rb +11 -4
- data/spec/rapid/module_spec.rb +18 -0
- data/spec/rapid/setting/base_spec.rb +71 -0
- data/spec/rapid/setting/boolean_setting_spec.rb +95 -0
- data/spec/rapid/setting/definer_spec.rb +7 -13
- data/spec/rapid/setting/integer_setting_spec.rb +49 -0
- data/spec/rapid/setting/module_spec.rb +25 -0
- data/spec/rapid/setting/namespace/base_spec.rb +88 -54
- data/spec/rapid/setting/namespace/instance_spec.rb +308 -5
- data/spec/rapid/setting/string_setting_spec.rb +43 -0
- data/spec/rapid/settings_spec.rb +65 -17
- data/spec/rapid/skeleton/base_spec.rb +113 -7
- data/spec/rapid/skeleton/helpers/directory_spec.rb +8 -6
- data/spec/rapid/skeleton/helpers/files_spec.rb +93 -0
- data/spec/rapid/skeleton/helpers/gem_spec.rb +65 -36
- data/spec/rapid/skeleton/helpers/if_setting_spec.rb +110 -0
- data/spec/rapid/skeleton/helpers/migration_spec.rb +190 -1
- data/spec/rapid/skeleton/helpers/route_spec.rb +13 -12
- data/spec/rapid/skeleton/helpers/script_spec.rb +2 -1
- data/spec/rapid/skeleton/helpers/template_spec.rb +22 -35
- data/spec/rapid/spec/template_spec.rb +1 -1
- data/spec/rapid/web/base_spec.rb +33 -0
- data/spec/rapid/web/bootstrap_spec.rb +72 -0
- data/spec/rapid/web/controller_helpers_spec.rb +86 -0
- data/spec/rapid/web/navigator_spec.rb +17 -0
- data/spec/rapid/web/select_helpers_spec.rb +71 -0
- data/spec/rapid/web/settings_form_builder_spec.rb +255 -0
- data/spec/rapid/web/static_helpers_spec.rb +26 -0
- data/spec/spec_helper.rb +3 -0
- data/views/index.erb +11 -0
- data/views/layout.erb +9 -0
- metadata +107 -12
- data/lib/rapid.rb +0 -37
- data/lib/rapid/setting/class_hash.rb +0 -34
- data/lib/rapid/setting/instance_hash.rb +0 -132
- data/lib/rapid/setting/instance_root.rb +0 -107
- data/spec/rapid/setting/instance_root_spec.rb +0 -161
data/lib/rapid/error.rb
CHANGED
@@ -42,6 +42,7 @@ module Rapid
|
|
42
42
|
class InvalidTemplateError < TemplateError ; end
|
43
43
|
class NotMatchingTemplateError < TemplateError ; end
|
44
44
|
class TemplateNotFoundError < TemplateError ; end
|
45
|
+
class ProjectFileNotFoundError < TemplateError ; end
|
45
46
|
class UnknownMethodTemplateError < TemplateError ; end
|
46
47
|
|
47
48
|
class NotMatchingTemplateError < TemplateError
|
data/lib/rapid/module.rb
CHANGED
@@ -2,7 +2,7 @@ module Rapid
|
|
2
2
|
|
3
3
|
class << self
|
4
4
|
|
5
|
-
attr_accessor :view_path
|
5
|
+
attr_accessor :view_path, :middleware
|
6
6
|
|
7
7
|
# from rspec
|
8
8
|
|
@@ -13,6 +13,7 @@ module Rapid
|
|
13
13
|
def red(text); colorize(text, "\e[31m"); end
|
14
14
|
def green(text); colorize(text, "\e[32m"); end
|
15
15
|
def yellow(text); colorize(text, "\e[33m"); end
|
16
|
+
def gray(text); colorize(text, "\e[90m"); end
|
16
17
|
|
17
18
|
def color_puts type, message
|
18
19
|
case type
|
@@ -25,11 +26,19 @@ module Rapid
|
|
25
26
|
when :error
|
26
27
|
puts red(message)
|
27
28
|
|
29
|
+
when :info
|
30
|
+
puts gray(message)
|
31
|
+
|
28
32
|
else
|
29
33
|
raise "Invalid type: #{type.inspect}"
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
37
|
+
def use_middleware middleware
|
38
|
+
@middleware ||= []
|
39
|
+
@middleware.push middleware
|
40
|
+
end
|
41
|
+
|
33
42
|
end
|
34
43
|
|
35
44
|
end
|
data/lib/rapid/railtie.rb
CHANGED
@@ -11,6 +11,12 @@ module Rapid
|
|
11
11
|
|
12
12
|
ActionController::Base.append_view_path Rapid.view_path
|
13
13
|
ActionMailer::Base.append_view_path Rapid.view_path
|
14
|
+
|
15
|
+
Rails.application.middleware.use Rapid::Web::Navigator
|
16
|
+
|
17
|
+
Rapid.middleware.each do |middleware|
|
18
|
+
Rails.application.middleware.use middleware
|
19
|
+
end
|
14
20
|
end
|
15
21
|
|
16
22
|
end
|
data/lib/rapid/setting/base.rb
CHANGED
@@ -6,26 +6,49 @@ module Rapid
|
|
6
6
|
attr_reader :namespace, :full_name, :name, :default_value
|
7
7
|
|
8
8
|
def initialize name, options = {}
|
9
|
-
@name = name.to_sym
|
9
|
+
@name = name.to_sym if name
|
10
10
|
@namespace = options[:namespace]
|
11
11
|
@default_value = options[:default]
|
12
|
-
|
12
|
+
|
13
|
+
if @namespace
|
14
|
+
@full_name = "#{@namespace.full_name}.#{name}"
|
15
|
+
elsif @name
|
16
|
+
@full_name = name.to_s
|
17
|
+
end
|
13
18
|
|
14
19
|
if Rapid::Settings.reserved_name? @name
|
15
20
|
raise ArgumentError.new("#{@name} is a reserved setting name")
|
16
21
|
end
|
22
|
+
|
23
|
+
if @namespace
|
24
|
+
@namespace.send :add_child, self
|
25
|
+
end
|
17
26
|
end
|
18
27
|
|
19
28
|
def load value
|
20
29
|
raise "Subclass should override this method"
|
21
30
|
end
|
22
31
|
|
23
|
-
def
|
24
|
-
name
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
32
|
+
def define_helpers klass
|
33
|
+
name = self.name
|
34
|
+
getter = name
|
35
|
+
setter = "#{name}="
|
36
|
+
|
37
|
+
klass.class_eval do
|
38
|
+
define_method getter do
|
39
|
+
self[name]
|
40
|
+
end
|
41
|
+
|
42
|
+
define_method "#{getter}?" do
|
43
|
+
self[name] != nil
|
44
|
+
end
|
45
|
+
|
46
|
+
define_method setter do |value|
|
47
|
+
self[name] = value
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
true
|
29
52
|
end
|
30
53
|
|
31
54
|
end
|
@@ -4,13 +4,32 @@ module Rapid
|
|
4
4
|
class BooleanSetting < Base
|
5
5
|
|
6
6
|
def load value
|
7
|
-
if
|
7
|
+
if value == nil || value == ""
|
8
|
+
nil
|
9
|
+
elsif [0, "0", false, "false"].include?(value)
|
8
10
|
false
|
9
11
|
elsif [1, "1", true, "true"].include?(value)
|
10
12
|
true
|
13
|
+
else
|
14
|
+
raise Rapid::InvalidSettingError.new(self, value)
|
11
15
|
end
|
12
16
|
end
|
13
17
|
|
18
|
+
def define_helpers klass
|
19
|
+
super
|
20
|
+
|
21
|
+
name = self.name
|
22
|
+
getter = self.name
|
23
|
+
|
24
|
+
klass.class_eval do
|
25
|
+
define_method "#{getter}?" do
|
26
|
+
self[name] == true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
14
33
|
end
|
15
34
|
|
16
35
|
end
|
@@ -51,7 +51,7 @@ module Rapid
|
|
51
51
|
names.each_with_index do |name, index|
|
52
52
|
if index == 0
|
53
53
|
namespace = @klass.settings[name]
|
54
|
-
|
54
|
+
elsif namespace
|
55
55
|
namespace = namespace[name]
|
56
56
|
end
|
57
57
|
end
|
@@ -65,11 +65,13 @@ module Rapid
|
|
65
65
|
protected
|
66
66
|
|
67
67
|
def find_or_create_namespace *names
|
68
|
-
namespace =
|
68
|
+
namespace = @klass.settings
|
69
69
|
|
70
70
|
names.each_with_index do |name, index|
|
71
71
|
if index == 0
|
72
72
|
new_namespace = @klass.settings[name]
|
73
|
+
elsif !namespace.is_a?(Setting::Namespace::Base)
|
74
|
+
raise Rapid::SettingError.new("#{names.join(@delimiter).inspect} is not a namespace")
|
73
75
|
else
|
74
76
|
new_namespace = namespace[name]
|
75
77
|
end
|
@@ -90,60 +92,22 @@ module Rapid
|
|
90
92
|
setting_name = names.pop.to_sym
|
91
93
|
|
92
94
|
namespace = find_or_create_namespace *names
|
95
|
+
|
96
|
+
if namespace != nil && !namespace.is_a?(Setting::Namespace::Base)
|
97
|
+
raise Rapid::SettingError.new("#{names.join(@delimiter).inspect} is not a namespace")
|
98
|
+
end
|
99
|
+
|
93
100
|
return namespace, setting_name
|
94
101
|
end
|
95
102
|
|
96
103
|
def define_setting setting
|
97
|
-
if setting.namespace.nil?
|
98
|
-
|
99
|
-
else
|
100
|
-
setting.namespace.define_setting setting
|
104
|
+
if setting.namespace.nil? || setting.namespace.name.blank?
|
105
|
+
setting.define_helpers @klass
|
101
106
|
end
|
102
107
|
|
103
108
|
setting
|
104
109
|
end
|
105
110
|
|
106
|
-
def define_base_setting setting
|
107
|
-
define_methods setting
|
108
|
-
push_setting setting
|
109
|
-
end
|
110
|
-
|
111
|
-
def define_methods setting
|
112
|
-
name = setting.name
|
113
|
-
getter = setting.get_helper_name
|
114
|
-
setter = setting.set_helper_name
|
115
|
-
|
116
|
-
@klass.class_eval do
|
117
|
-
define_method getter do
|
118
|
-
settings[name]
|
119
|
-
end
|
120
|
-
|
121
|
-
define_method setter do |value|
|
122
|
-
settings[name] = value
|
123
|
-
end
|
124
|
-
|
125
|
-
if setting.is_a? BooleanSetting
|
126
|
-
define_method "#{getter}?" do
|
127
|
-
settings[name] == true
|
128
|
-
end
|
129
|
-
elsif setting.is_a? Namespace::Base
|
130
|
-
define_method "#{getter}?" do
|
131
|
-
settings[name] != nil && !settings[name].empty?
|
132
|
-
end
|
133
|
-
else
|
134
|
-
define_method "#{getter}?" do
|
135
|
-
settings[name] != nil
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
true
|
141
|
-
end
|
142
|
-
|
143
|
-
def push_setting setting
|
144
|
-
@klass.settings[setting.name] = setting
|
145
|
-
end
|
146
|
-
|
147
111
|
end
|
148
112
|
|
149
113
|
end
|
@@ -4,17 +4,17 @@ module Rapid
|
|
4
4
|
class IntegerSetting < Base
|
5
5
|
|
6
6
|
def load value
|
7
|
-
if value
|
8
|
-
|
7
|
+
if value == nil || value == "" || value == false
|
8
|
+
nil
|
9
9
|
|
10
|
-
elsif value.is_a?(
|
11
|
-
|
10
|
+
elsif value.is_a?(Integer)
|
11
|
+
value
|
12
12
|
|
13
|
-
elsif value.
|
14
|
-
|
13
|
+
elsif value.is_a?(String) && value =~ /[0-9]+/
|
14
|
+
value.to_i
|
15
15
|
|
16
16
|
else
|
17
|
-
value
|
17
|
+
raise InvalidSettingError.new(self, value)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Rapid
|
2
|
+
|
3
|
+
module Settings
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def reserved_names
|
8
|
+
# ActiveModel::Validations
|
9
|
+
@reserved_words ||= %w(_validate_callbacks _validators errors read_attribute_for_validation
|
10
|
+
run_callbacks valid validates_acceptance_of validates_confirmation_of validates_exclusion_of
|
11
|
+
validates_format_of validates_inclusion_of validates_length_of validates_numericality_of
|
12
|
+
validates_presence_of validates_size_of validates_with validation_context) +
|
13
|
+
|
14
|
+
# internal
|
15
|
+
%w(_root empty namespaces scalars validate_nested_settings validate_no_assignment_exceptions
|
16
|
+
load_yaml load_hash to_yaml to_dot_hash to_hash parse_yaml get_binding)
|
17
|
+
end
|
18
|
+
|
19
|
+
def reserved_name? name
|
20
|
+
reserved_names.include? name.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
def extract_nested_namespace full_name
|
24
|
+
return nil, nil if full_name.nil?
|
25
|
+
|
26
|
+
full_name = full_name.to_s
|
27
|
+
if full_name.to_s =~ /^([^\.]+)\.(.+)$/
|
28
|
+
return $1, $2
|
29
|
+
else
|
30
|
+
return nil, full_name
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_dot_hash nested_hash
|
35
|
+
dot_hash = {}
|
36
|
+
flatten = proc { |key, value|
|
37
|
+
|
38
|
+
if value.is_a?(Hash)
|
39
|
+
value.each do |k2, v2|
|
40
|
+
flatten[key + [k2], v2]
|
41
|
+
end
|
42
|
+
else
|
43
|
+
namespace = key.join('.')
|
44
|
+
dot_hash[namespace] = value
|
45
|
+
end
|
46
|
+
}
|
47
|
+
|
48
|
+
flatten[[], nested_hash]
|
49
|
+
dot_hash
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -4,64 +4,71 @@ module Rapid
|
|
4
4
|
|
5
5
|
class Base < Setting::Base
|
6
6
|
|
7
|
-
attr_accessor :
|
8
|
-
|
9
|
-
delegate :[], :to => :delegate
|
10
|
-
delegate :[]=, :to => :delegate
|
7
|
+
attr_accessor :instance_class
|
11
8
|
|
12
9
|
def initialize name, options = {}
|
13
|
-
super
|
10
|
+
super name, options
|
14
11
|
@delegate = HashWithIndifferentAccess.new {}
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
|
13
|
+
# class option isn't provided for the root namespace
|
14
|
+
klass = options[:class]
|
15
|
+
@instance_class = define_instance_class klass if klass
|
18
16
|
end
|
19
17
|
|
20
18
|
def namespaces
|
21
|
-
values = delegate.values
|
19
|
+
values = @delegate.values
|
22
20
|
values.delete_if {|c| !c.is_a?(Namespace::Base) }
|
23
21
|
values
|
24
22
|
end
|
25
23
|
|
26
24
|
def scalars
|
27
|
-
values = delegate.values
|
25
|
+
values = @delegate.values
|
28
26
|
values.delete_if {|c| c.is_a?(Namespace::Base) }
|
29
27
|
values
|
30
28
|
end
|
31
29
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
35
|
-
if value != nil && !value.respond_to?(:to_hash)
|
36
|
-
raise InvalidSettingError.new(self, value)
|
37
|
-
end
|
38
|
-
|
39
|
-
hash = value.to_hash if value
|
30
|
+
def [] key
|
31
|
+
namespace_name, child_name = Rapid::Settings.extract_nested_namespace(key)
|
40
32
|
|
41
|
-
if
|
42
|
-
|
33
|
+
if namespace_name
|
34
|
+
namespace = @delegate[namespace_name]
|
35
|
+
namespace[child_name] if namespace
|
43
36
|
else
|
44
|
-
|
37
|
+
@delegate[key]
|
45
38
|
end
|
46
39
|
end
|
47
40
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
|
41
|
+
def define_helpers klass
|
42
|
+
super
|
43
|
+
name = self.name
|
44
|
+
getter = self.name
|
45
|
+
|
46
|
+
klass.class_eval do
|
47
|
+
define_method "#{getter}?" do
|
48
|
+
val = self[name]
|
49
|
+
val != nil && val.on?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
true
|
52
54
|
end
|
53
55
|
|
54
56
|
protected
|
55
57
|
|
58
|
+
def add_child setting
|
59
|
+
setting.define_helpers @instance_class if @instance_class
|
60
|
+
@delegate[setting.name] = setting
|
61
|
+
end
|
62
|
+
|
56
63
|
def instance_class_name
|
57
64
|
full_name.to_s.gsub('.', '/').camelize.gsub("::", "")
|
58
65
|
end
|
59
66
|
|
60
|
-
def define_instance_class
|
67
|
+
def define_instance_class klass
|
61
68
|
instance_class = eval %(
|
62
|
-
module #{
|
69
|
+
module #{klass.name}::Settings
|
63
70
|
class #{instance_class_name} < Namespace::Instance
|
64
|
-
@setting_name = #{name.
|
71
|
+
@setting_name = #{name.inspect}
|
65
72
|
@full_setting_name = #{full_name.to_s.inspect}
|
66
73
|
|
67
74
|
class << self ; attr_reader :setting_name, :full_setting_name ; end
|
@@ -74,38 +81,6 @@ module Rapid
|
|
74
81
|
instance_class
|
75
82
|
end
|
76
83
|
|
77
|
-
def define_helper_methods_for setting
|
78
|
-
name = setting.name
|
79
|
-
getter = setting.get_helper_name
|
80
|
-
setter = setting.set_helper_name
|
81
|
-
|
82
|
-
@instance_class.class_eval do
|
83
|
-
define_method getter do
|
84
|
-
self[name]
|
85
|
-
end
|
86
|
-
|
87
|
-
define_method setter do |value|
|
88
|
-
self[name] = value
|
89
|
-
end
|
90
|
-
|
91
|
-
if setting.is_a? BooleanSetting
|
92
|
-
define_method "#{getter}?" do
|
93
|
-
self[name] == true
|
94
|
-
end
|
95
|
-
elsif setting.is_a? Namespace::Base
|
96
|
-
define_method "#{getter}?" do
|
97
|
-
self[name] != nil && !self[name].empty?
|
98
|
-
end
|
99
|
-
else
|
100
|
-
define_method "#{getter}?" do
|
101
|
-
self[name] != nil
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
true
|
107
|
-
end
|
108
|
-
|
109
84
|
end
|
110
85
|
|
111
86
|
end
|