rapid-core 0.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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