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.
Files changed (89) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile.lock +35 -2
  3. data/Rakefile +77 -48
  4. data/doc/server.txt +15 -0
  5. data/features/settings/double-nested/default.feature +2 -2
  6. data/features/settings/double-nested/validates/presence_of.feature +1 -1
  7. data/features/settings/nested/default.feature +1 -1
  8. data/features/settings/nested/validates/presence_of.feature +1 -1
  9. data/features/settings/not_found.feature +2 -2
  10. data/features/step_definitions/settings_steps.rb +7 -3
  11. data/features/step_definitions/template_steps.rb +3 -1
  12. data/lib/rapid/check.rb +30 -23
  13. data/lib/rapid/core.rb +12 -0
  14. data/lib/rapid/error.rb +1 -0
  15. data/lib/rapid/module.rb +10 -1
  16. data/lib/rapid/railtie.rb +6 -0
  17. data/lib/rapid/setting/base.rb +31 -8
  18. data/lib/rapid/setting/boolean_setting.rb +20 -1
  19. data/lib/rapid/setting/definer.rb +11 -47
  20. data/lib/rapid/setting/integer_setting.rb +7 -7
  21. data/lib/rapid/setting/module.rb +56 -0
  22. data/lib/rapid/setting/namespace/base.rb +35 -60
  23. data/lib/rapid/setting/namespace/instance.rb +195 -28
  24. data/lib/rapid/setting/string_setting.rb +7 -1
  25. data/lib/rapid/settings.rb +51 -65
  26. data/lib/rapid/skeleton/base.rb +39 -18
  27. data/lib/rapid/skeleton/helpers/directory.rb +5 -6
  28. data/lib/rapid/skeleton/helpers/files.rb +62 -0
  29. data/lib/rapid/skeleton/helpers/gem.rb +43 -32
  30. data/lib/rapid/skeleton/helpers/if_setting.rb +44 -0
  31. data/lib/rapid/skeleton/helpers/migration.rb +102 -32
  32. data/lib/rapid/skeleton/helpers/route.rb +8 -12
  33. data/lib/rapid/skeleton/helpers/script.rb +1 -2
  34. data/lib/rapid/skeleton/helpers/template.rb +23 -25
  35. data/lib/rapid/skeleton/helpers/view.rb +7 -7
  36. data/lib/rapid/spec/template.rb +1 -1
  37. data/lib/rapid/version.rb +1 -1
  38. data/lib/rapid/web/base.rb +35 -0
  39. data/lib/rapid/web/bootstrap.rb +98 -0
  40. data/lib/rapid/web/controller_helpers.rb +60 -0
  41. data/lib/rapid/web/navigator.rb +18 -0
  42. data/lib/rapid/web/select_helpers.rb +63 -0
  43. data/lib/rapid/web/settings_form_builder.rb +205 -0
  44. data/lib/rapid/web/static_helpers.rb +28 -0
  45. data/lib/rapid/web/tasks.rb +10 -0
  46. data/public/rapid/core/bootstrap-collapse.js +136 -0
  47. data/public/rapid/core/bootstrap-responsive.min.css +3 -0
  48. data/public/rapid/core/bootstrap.min.css +556 -0
  49. data/public/rapid/core/jquery-1.7.1.js +9253 -0
  50. data/public/rapid/core/prettify.css +30 -0
  51. data/public/rapid/core/prettify.js +28 -0
  52. data/rapid-core.gemspec +5 -0
  53. data/spec/rapid/check_spec.rb +11 -4
  54. data/spec/rapid/module_spec.rb +18 -0
  55. data/spec/rapid/setting/base_spec.rb +71 -0
  56. data/spec/rapid/setting/boolean_setting_spec.rb +95 -0
  57. data/spec/rapid/setting/definer_spec.rb +7 -13
  58. data/spec/rapid/setting/integer_setting_spec.rb +49 -0
  59. data/spec/rapid/setting/module_spec.rb +25 -0
  60. data/spec/rapid/setting/namespace/base_spec.rb +88 -54
  61. data/spec/rapid/setting/namespace/instance_spec.rb +308 -5
  62. data/spec/rapid/setting/string_setting_spec.rb +43 -0
  63. data/spec/rapid/settings_spec.rb +65 -17
  64. data/spec/rapid/skeleton/base_spec.rb +113 -7
  65. data/spec/rapid/skeleton/helpers/directory_spec.rb +8 -6
  66. data/spec/rapid/skeleton/helpers/files_spec.rb +93 -0
  67. data/spec/rapid/skeleton/helpers/gem_spec.rb +65 -36
  68. data/spec/rapid/skeleton/helpers/if_setting_spec.rb +110 -0
  69. data/spec/rapid/skeleton/helpers/migration_spec.rb +190 -1
  70. data/spec/rapid/skeleton/helpers/route_spec.rb +13 -12
  71. data/spec/rapid/skeleton/helpers/script_spec.rb +2 -1
  72. data/spec/rapid/skeleton/helpers/template_spec.rb +22 -35
  73. data/spec/rapid/spec/template_spec.rb +1 -1
  74. data/spec/rapid/web/base_spec.rb +33 -0
  75. data/spec/rapid/web/bootstrap_spec.rb +72 -0
  76. data/spec/rapid/web/controller_helpers_spec.rb +86 -0
  77. data/spec/rapid/web/navigator_spec.rb +17 -0
  78. data/spec/rapid/web/select_helpers_spec.rb +71 -0
  79. data/spec/rapid/web/settings_form_builder_spec.rb +255 -0
  80. data/spec/rapid/web/static_helpers_spec.rb +26 -0
  81. data/spec/spec_helper.rb +3 -0
  82. data/views/index.erb +11 -0
  83. data/views/layout.erb +9 -0
  84. metadata +107 -12
  85. data/lib/rapid.rb +0 -37
  86. data/lib/rapid/setting/class_hash.rb +0 -34
  87. data/lib/rapid/setting/instance_hash.rb +0 -132
  88. data/lib/rapid/setting/instance_root.rb +0 -107
  89. 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
@@ -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
- @full_name = @namespace ? "#{@namespace.full_name}.#{name}" : name.to_s
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 get_helper_name
24
- name
25
- end
26
-
27
- def set_helper_name
28
- "#{name}="
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 [0, "0", false, "false"].include?(value)
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
- else
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 = nil
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
- define_base_setting setting
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.is_a?(String) && !(value =~ /[0-9]+/)
8
- raise InvalidSettingError.new(self, value)
7
+ if value == nil || value == "" || value == false
8
+ nil
9
9
 
10
- elsif value.is_a?(Float)
11
- raise InvalidSettingError.new(self, value)
10
+ elsif value.is_a?(Integer)
11
+ value
12
12
 
13
- elsif value.nil?
14
- nil
13
+ elsif value.is_a?(String) && value =~ /[0-9]+/
14
+ value.to_i
15
15
 
16
16
  else
17
- value.to_i
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 :delegate, :instance_class, :default_empty
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
- @klass = options[:class]
16
- @instance_class = define_instance_class if @klass
17
- @default_empty = !options[:default] if options.key? :default
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 load value
33
- owner = value.delete :owner if value.is_a? Hash
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 @instance_class
42
- @instance_class.new owner, self, hash
33
+ if namespace_name
34
+ namespace = @delegate[namespace_name]
35
+ namespace[child_name] if namespace
43
36
  else
44
- Namespace::Instance.new owner, self, hash
37
+ @delegate[key]
45
38
  end
46
39
  end
47
40
 
48
- def define_setting setting
49
- define_helper_methods_for setting
50
- setting.namespace[setting.name] = setting
51
- setting
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 #{@klass.name}::Settings
69
+ module #{klass.name}::Settings
63
70
  class #{instance_class_name} < Namespace::Instance
64
- @setting_name = #{name.to_s.inspect}
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