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/.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