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/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  *.gem
2
2
  .bundle
3
+ rake
3
4
  coverage/*
4
5
  coverage.data
5
6
  pkg/*
data/Gemfile.lock CHANGED
@@ -1,11 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rapid-core (0.1)
4
+ rapid-core (0.2)
5
5
  activemodel (>= 3.0)
6
6
  activesupport (>= 3.0)
7
7
  erubis
8
8
  i18n
9
+ sinatra
10
+ sinatra_more
11
+ tzinfo
9
12
 
10
13
  GEM
11
14
  remote: http://rubygems.org/
@@ -16,6 +19,7 @@ GEM
16
19
  activesupport (3.2.1)
17
20
  i18n (~> 0.6)
18
21
  multi_json (~> 1.0)
22
+ backports (2.3.0)
19
23
  builder (3.0.0)
20
24
  cucumber (1.1.4)
21
25
  builder (>= 2.1.2)
@@ -25,11 +29,17 @@ GEM
25
29
  term-ansicolor (>= 1.0.6)
26
30
  diff-lcs (1.1.3)
27
31
  erubis (2.7.0)
32
+ eventmachine (0.12.10)
28
33
  gherkin (2.7.4)
29
34
  json (>= 1.4.6)
30
35
  i18n (0.6.0)
31
36
  json (1.6.5)
32
- multi_json (1.0.4)
37
+ multi_json (1.1.0)
38
+ rack (1.4.1)
39
+ rack-protection (1.2.0)
40
+ rack
41
+ rack-test (0.6.1)
42
+ rack (>= 1.0)
33
43
  rake (0.9.2.2)
34
44
  rcov (0.9.9)
35
45
  rspec (2.5.0)
@@ -40,7 +50,29 @@ GEM
40
50
  rspec-expectations (2.5.0)
41
51
  diff-lcs (~> 1.1.2)
42
52
  rspec-mocks (2.5.0)
53
+ sinatra (1.3.2)
54
+ rack (~> 1.3, >= 1.3.6)
55
+ rack-protection (~> 1.2)
56
+ tilt (~> 1.3, >= 1.3.3)
57
+ sinatra-contrib (1.3.1)
58
+ backports (>= 2.0)
59
+ eventmachine
60
+ rack-protection
61
+ rack-test
62
+ sinatra (~> 1.3.0)
63
+ tilt (~> 1.3)
64
+ sinatra-reloader (1.0)
65
+ sinatra-contrib
66
+ sinatra_more (0.3.43)
67
+ activesupport
68
+ bundler (>= 0.9.2)
69
+ sinatra (>= 0.9.2)
70
+ thor (>= 0.11.8)
71
+ tilt (>= 0.2)
43
72
  term-ansicolor (1.0.7)
73
+ thor (0.14.6)
74
+ tilt (1.3.3)
75
+ tzinfo (0.3.31)
44
76
 
45
77
  PLATFORMS
46
78
  ruby
@@ -51,3 +83,4 @@ DEPENDENCIES
51
83
  rapid-core!
52
84
  rcov
53
85
  rspec
86
+ sinatra-reloader
data/Rakefile CHANGED
@@ -1,61 +1,90 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rapid/web/tasks'
2
3
 
3
- require 'rspec/core/rake_task'
4
- RSpec::Core::RakeTask.new('spec')
4
+ desc "Run the Sinatra server to edit your application with this gem"
5
+ task :server do
6
+ path = ENV["APP"]
7
+ raise "USAGE: rake server APP=/path/to/rails/application" if path.nil?
8
+
9
+ require 'rapid/core'
10
+ Rapid::Web::Navigator.run!
11
+ end
5
12
 
6
- require 'cucumber/rake/task'
13
+ begin
14
+ require 'rspec/core/rake_task'
15
+ @rspec = true
16
+ rescue ScriptError
17
+ puts "Warning: Can't test because RSpec is not installed. Try 'bundle install'"
18
+ end
7
19
 
8
- namespace :cucumber do
9
- Cucumber::Rake::Task.new(:ok, 'Run features that should pass') do |t|
10
- # t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
11
- t.fork = true # You may get faster startup if you set this to false
12
- t.profile = 'default'
13
- end
20
+ begin
21
+ require 'cucumber/rake/task'
22
+ @cucumber = true
23
+ rescue ScriptError
24
+ puts "Warning: Can't test because Cucumber is not installed. Try 'bundle install'"
25
+ end
14
26
 
15
- Cucumber::Rake::Task.new(:wip, 'Run features that are being worked on') do |t|
16
- # t.binary = vendored_cucumber_bin
17
- t.fork = true # You may get faster startup if you set this to false
18
- t.profile = 'wip'
19
- end
27
+ if @rspec
28
+ RSpec::Core::RakeTask.new('spec')
29
+ end
20
30
 
21
- Cucumber::Rake::Task.new(:rerun, 'Record failing features and run only them if any exist') do |t|
22
- # t.binary = vendored_cucumber_bin
23
- t.fork = true # You may get faster startup if you set this to false
24
- t.profile = 'rerun'
25
- end
31
+ if @cucumber
26
32
 
27
- desc 'Run all features'
28
- task :all => [:ok, :wip]
29
- end
30
- desc 'Alias for cucumber:ok'
31
- task :cucumber => 'cucumber:ok'
33
+ namespace :cucumber do
34
+ Cucumber::Rake::Task.new(:ok, 'Run features that should pass') do |t|
35
+ # t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
36
+ t.fork = true # You may get faster startup if you set this to false
37
+ t.profile = 'default'
38
+ end
32
39
 
33
- namespace :rcov do
34
-
35
- rcov_opts = '--exclude osx\/objc,cucumber.rb,cucumber\/,gems\/,spec\/,features\/ --aggregate coverage.data'
36
-
37
- desc "Run all specs with rcov"
38
- RSpec::Core::RakeTask.new(:spec) do |t|
39
- t.rcov = true
40
- t.pattern = "./spec/**/*_spec.rb"
41
- t.rcov_opts = rcov_opts
40
+ Cucumber::Rake::Task.new(:wip, 'Run features that are being worked on') do |t|
41
+ # t.binary = vendored_cucumber_bin
42
+ t.fork = true # You may get faster startup if you set this to false
43
+ t.profile = 'wip'
44
+ end
45
+
46
+ Cucumber::Rake::Task.new(:rerun, 'Record failing features and run only them if any exist') do |t|
47
+ # t.binary = vendored_cucumber_bin
48
+ t.fork = true # You may get faster startup if you set this to false
49
+ t.profile = 'rerun'
50
+ end
51
+
52
+ desc 'Run all features'
53
+ task :all => [:ok, :wip]
42
54
  end
43
-
44
- Cucumber::Rake::Task.new(:cucumber, 'Run features and produce a coverage report') do |t|
45
- # t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
46
- t.fork = true # You may get faster startup if you set this to false
47
- t.profile = 'default'
48
- t.rcov = true
49
- t.rcov_opts = "#{rcov_opts} --failure-threshold 100"
55
+ desc 'Alias for cucumber:ok'
56
+ task :cucumber => 'cucumber:ok'
57
+ end
58
+
59
+ if @rspec && @cucumber
60
+ namespace :rcov do
61
+
62
+ rcov_opts = '--exclude osx\/objc,cucumber.rb,cucumber\/,gems\/,spec\/,features\/ --aggregate coverage.data'
63
+
64
+ desc "Run all specs with rcov"
65
+ RSpec::Core::RakeTask.new(:spec) do |t|
66
+ t.rcov = true
67
+ t.pattern = "./spec/**/*_spec.rb"
68
+ t.rcov_opts = rcov_opts
69
+ end
70
+
71
+ Cucumber::Rake::Task.new(:cucumber, 'Run features and produce a coverage report') do |t|
72
+ # t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
73
+ t.fork = true # You may get faster startup if you set this to false
74
+ t.profile = 'default'
75
+ t.rcov = true
76
+ t.rcov_opts = "#{rcov_opts} --failure-threshold 100"
77
+ end
78
+
79
+ desc "Run specs and features and produce a coverage report"
80
+ task :all do
81
+ rm "coverage.data" if File.exist?("coverage.data")
82
+ Rake::Task['rcov:spec'].invoke
83
+ Rake::Task["rcov:cucumber"].invoke
84
+ end
85
+
50
86
  end
51
87
 
52
- desc "Run specs and features and produce a coverage report"
53
- task :all do
54
- rm "coverage.data" if File.exist?("coverage.data")
55
- Rake::Task['rcov:spec'].invoke
56
- Rake::Task["rcov:cucumber"].invoke
57
- end
88
+ task :ci => 'rcov:all'
58
89
 
59
90
  end
60
-
61
- task :ci => 'rcov:all'
data/doc/server.txt ADDED
@@ -0,0 +1,15 @@
1
+ * respond under /rapid
2
+
3
+ * /rapid lists all the possible children apps
4
+
5
+ * /rapid/X by default
6
+ * UI for editing settings (pull settings for default values)
7
+ * Submit pushes the changes to the application
8
+
9
+ * each gem can customize its behavior by providing its own sinatra app
10
+
11
+ * sinatra apps can run on their own
12
+ * sinatra apps can run inside the rails app it's modifying
13
+
14
+ * everything under /rapid shares a layout by default
15
+
@@ -40,11 +40,11 @@ Feature: Default double nesting
40
40
  app.author.name:
41
41
  """
42
42
  Then I should be good
43
- And vice versa
43
+ # And vice versa
44
44
 
45
45
  Scenario: integer value
46
46
  When I load:
47
47
  """
48
48
  app.author: 1
49
49
  """
50
- Then "app.author" should have a "doesn't allow values of that type" error
50
+ Then "app.author" should have a "doesn't allow values of that type" error
@@ -34,4 +34,4 @@ Feature: validates_presence_of nested settings
34
34
  app.author.name:
35
35
  """
36
36
  Then "app.author.name" should have a "can't be blank" error
37
- And vice versa
37
+ # And vice versa
@@ -40,7 +40,7 @@ Feature: Default single nesting
40
40
  app.name:
41
41
  """
42
42
  Then I should be good
43
- And vice versa
43
+ # And vice versa
44
44
 
45
45
  Scenario: integer value
46
46
  When I load:
@@ -34,4 +34,4 @@ Feature: validates_presence_of nested settings
34
34
  app.name:
35
35
  """
36
36
  Then "app.name" should have a "can't be blank" error
37
- And vice versa
37
+ # And vice versa
@@ -23,11 +23,11 @@ Feature: Settings handling not found cases
23
23
  """
24
24
  app.author: Dan
25
25
  """
26
- Then "app" should have a "can't be found" error
26
+ Then "app.author" should have a "can't be found" error
27
27
 
28
28
  Scenario: Incorrectly treating a setting is a namespace
29
29
  When I load:
30
30
  """
31
31
  name.version: 1.0
32
32
  """
33
- Then "name" should have a "doesn't allow values of that type" error
33
+ Then "name.version" should have a "doesn't allow values of that type" error
@@ -44,7 +44,9 @@ end
44
44
  When /^I load:$/ do |yaml_content|
45
45
  @current_yaml = yaml_content
46
46
  @current_settings = @current_settings_class.new
47
- @current_settings.settings.load_yaml yaml_content
47
+
48
+ hash = YAML.load(yaml_content)
49
+ @current_settings.load hash if hash
48
50
  end
49
51
 
50
52
  Then /^I should be good$/ do
@@ -71,8 +73,10 @@ end
71
73
 
72
74
  Then /^vice versa$/ do
73
75
  if @current_yaml && @current_settings
74
- yaml = @current_settings.settings.to_yaml
75
- yaml.should == @current_yaml
76
+ hash = @current_settings.settings.to_dot_hash
77
+ expected_hash = YAML.load(@current_yaml) || {}
78
+
79
+ hash.should == expected_hash
76
80
 
77
81
  elsif @current_template
78
82
  original_settings = @current_settings
@@ -28,7 +28,9 @@ When /^I push the skeleton through "([^\"]*)" with:$/ do |template_filename, set
28
28
  @current_template = find_template template_filename
29
29
 
30
30
  @current_yaml = settings_content
31
- @current_skeleton.load_yaml settings_content
31
+
32
+ hash = YAML.load settings_content
33
+ @current_skeleton.settings = hash if hash
32
34
 
33
35
  @current_template_content = @current_template.push @current_skeleton
34
36
  end
data/lib/rapid/check.rb CHANGED
@@ -3,10 +3,11 @@ module Rapid
3
3
  class Check
4
4
 
5
5
  attr_reader :code, :ok_count, :warning_count, :error_count
6
+ attr_accessor :console
6
7
 
7
8
  def initialize code, options = {}
8
9
  @code = code
9
- @console_output = options[:console]
10
+ @console = options[:console]
10
11
  @ok_count = 0
11
12
  @warning_count = 0
12
13
  @error_count = 0
@@ -60,11 +61,22 @@ module Rapid
60
61
  log :error, "", ""
61
62
  end
62
63
 
64
+ def log_value log_type, key, value
65
+ return unless @console
66
+
67
+ # don't print out very large strings
68
+ if value.is_a?(String) && value.length > 50
69
+ value = value[0..23] + "..." + value[value.length - 23..-1]
70
+ end
71
+
72
+ log log_type, " #{key}:", value.inspect
73
+ end
74
+
63
75
  def with_section name
64
- puts "" if @sections.empty?
76
+ puts "" if @sections.empty? && @console
65
77
 
66
78
  indention = " " * @sections.length
67
- puts "#{indention}#{name}"
79
+ puts "#{indention}#{name}" if @console
68
80
 
69
81
  @sections.push name
70
82
  yield
@@ -72,6 +84,20 @@ module Rapid
72
84
  @sections.pop
73
85
  end
74
86
 
87
+ def as_current
88
+ self.class.current = self
89
+ yield
90
+
91
+ ensure
92
+ self.class.current = nil
93
+ end
94
+
95
+ def encounters_error?
96
+ old_count = self.error_count
97
+ yield
98
+ old_count != self.error_count
99
+ end
100
+
75
101
  protected
76
102
 
77
103
  def clean_hash hash
@@ -97,7 +123,7 @@ module Rapid
97
123
  end
98
124
 
99
125
  def log type, filename, message
100
- return unless @console_output
126
+ return unless @console
101
127
 
102
128
  indention = " " * @sections.length
103
129
 
@@ -105,14 +131,6 @@ module Rapid
105
131
  Rapid.color_puts type, output
106
132
  end
107
133
 
108
- def as_current
109
- self.class.current = self
110
- yield
111
-
112
- ensure
113
- self.class.current = nil
114
- end
115
-
116
134
  class << self
117
135
  attr_accessor :current, :file
118
136
 
@@ -144,17 +162,6 @@ module Rapid
144
162
  new code, *args
145
163
  end
146
164
 
147
- def encounters_error?
148
- if current.nil?
149
- yield
150
- false
151
- else
152
- old_count = current.error_count
153
- yield
154
- old_count != current.error_count
155
- end
156
- end
157
-
158
165
  end
159
166
 
160
167
  end
data/lib/rapid/core.rb CHANGED
@@ -11,6 +11,8 @@ require "rapid/module"
11
11
  require "rapid/settings"
12
12
  require "rapid/check"
13
13
 
14
+ require "rapid/skeleton/helpers/if_setting"
15
+ require "rapid/skeleton/helpers/files"
14
16
  require "rapid/skeleton/helpers/directory"
15
17
  require "rapid/skeleton/helpers/gem"
16
18
  require "rapid/skeleton/helpers/migration"
@@ -34,4 +36,14 @@ require "rapid/template/node/variable"
34
36
  require "rapid/template/node/if_node"
35
37
  require "rapid/template/node/comment_node"
36
38
 
39
+ require 'sinatra'
40
+ require 'sinatra_more/markup_plugin'
41
+ require 'rapid/web/select_helpers'
42
+ require 'rapid/web/settings_form_builder'
43
+ require 'rapid/web/controller_helpers'
44
+ require 'rapid/web/static_helpers'
45
+ require 'rapid/web/bootstrap'
46
+ require 'rapid/web/base'
47
+ require 'rapid/web/navigator'
48
+
37
49
  require 'rapid/railtie' if defined? Rails