regulate 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/.gitignore +14 -0
  2. data/.rvmrc +1 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +117 -0
  6. data/LICENSE +20 -0
  7. data/README.md +3 -0
  8. data/Rakefile +10 -0
  9. data/app/controllers/regulate/admin/pages_controller.rb +69 -0
  10. data/app/controllers/regulate/pages_controller.rb +13 -0
  11. data/app/models/regulate/page.rb +21 -0
  12. data/app/views/regulate/admin/pages/_form.html.erb +36 -0
  13. data/app/views/regulate/admin/pages/edit.html.erb +1 -0
  14. data/app/views/regulate/admin/pages/index.html.erb +10 -0
  15. data/app/views/regulate/admin/pages/new.html.erb +1 -0
  16. data/app/views/regulate/pages/show.html.erb +14 -0
  17. data/config/regulate.yml +10 -0
  18. data/config/routes.rb +22 -0
  19. data/lib/generators/regulate/install_generator.rb +39 -0
  20. data/lib/generators/regulate/views_generator.rb +73 -0
  21. data/lib/generators/templates/regulate.css +2 -0
  22. data/lib/generators/templates/regulate.js +44 -0
  23. data/lib/generators/templates/regulate.rb +13 -0
  24. data/lib/generators/templates/regulate.yml +10 -0
  25. data/lib/regulate.rb +30 -0
  26. data/lib/regulate/engine.rb +50 -0
  27. data/lib/regulate/git.rb +17 -0
  28. data/lib/regulate/git/errors.rb +22 -0
  29. data/lib/regulate/git/interface.rb +249 -0
  30. data/lib/regulate/git/model.rb +16 -0
  31. data/lib/regulate/git/model/base.rb +282 -0
  32. data/lib/regulate/version.rb +4 -0
  33. data/public/javascripts/jquery.min.js +167 -0
  34. data/public/javascripts/regulate_admin.js +166 -0
  35. data/regulate.gemspec +29 -0
  36. data/test/dummy/Rakefile +7 -0
  37. data/test/dummy/app/controllers/application_controller.rb +3 -0
  38. data/test/dummy/app/helpers/application_helper.rb +2 -0
  39. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  40. data/test/dummy/config.ru +4 -0
  41. data/test/dummy/config/application.rb +45 -0
  42. data/test/dummy/config/boot.rb +10 -0
  43. data/test/dummy/config/database.yml +22 -0
  44. data/test/dummy/config/environment.rb +5 -0
  45. data/test/dummy/config/environments/development.rb +26 -0
  46. data/test/dummy/config/environments/production.rb +49 -0
  47. data/test/dummy/config/environments/test.rb +35 -0
  48. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  49. data/test/dummy/config/initializers/inflections.rb +10 -0
  50. data/test/dummy/config/initializers/mime_types.rb +5 -0
  51. data/test/dummy/config/initializers/secret_token.rb +7 -0
  52. data/test/dummy/config/initializers/session_store.rb +8 -0
  53. data/test/dummy/config/locales/en.yml +5 -0
  54. data/test/dummy/config/regulate.yml +10 -0
  55. data/test/dummy/config/routes.rb +58 -0
  56. data/test/dummy/public/404.html +26 -0
  57. data/test/dummy/public/422.html +26 -0
  58. data/test/dummy/public/500.html +26 -0
  59. data/test/dummy/public/favicon.ico +0 -0
  60. data/test/dummy/public/javascripts/application.js +2 -0
  61. data/test/dummy/public/javascripts/controls.js +965 -0
  62. data/test/dummy/public/javascripts/dragdrop.js +974 -0
  63. data/test/dummy/public/javascripts/effects.js +1123 -0
  64. data/test/dummy/public/javascripts/prototype.js +6001 -0
  65. data/test/dummy/public/javascripts/rails.js +175 -0
  66. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  67. data/test/dummy/script/rails +6 -0
  68. data/test/git_test.rb +79 -0
  69. data/test/integration/navigation_test.rb +7 -0
  70. data/test/models/regulate_git_model_base_lint_test.rb +7 -0
  71. data/test/models/regulate_git_model_base_test.rb +23 -0
  72. data/test/models/regulate_page_test.rb +19 -0
  73. data/test/regulate_test.rb +19 -0
  74. data/test/routing_test.rb +32 -0
  75. data/test/support/integration_case.rb +5 -0
  76. data/test/test_helper.rb +27 -0
  77. data/test/tmp/config/initializers/regulate.rb +12 -0
  78. data/test/tmp/config/regulate.yml +10 -0
  79. data/test/tmp/public/javascripts/regulate.js +49 -0
  80. data/test/tmp/public/stylesheets/regulate.css +3 -0
  81. metadata +312 -0
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ *.log
2
+ **/*/log/*
3
+ pkg/*
4
+ *.gem
5
+ .bundle
6
+ .DS_Store
7
+ *.sw[o|a|p]
8
+ test/dummy/db/repos/*
9
+ test/dummy/db/*.sqlite3
10
+ doc
11
+ docs
12
+ .yardoc
13
+ test/dummy/tmp/**/*
14
+
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use ruby-1.8.7-p302@regulate_vs2
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ app/**/*.rb config/routes.rb lib/**/*.rb - README.md LICENSE
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in regulate.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,117 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ regulate (0.0.1)
5
+ grit (~> 2.3.0)
6
+ rails (~> 3.0.0)
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ abstract (1.0.0)
12
+ actionmailer (3.0.3)
13
+ actionpack (= 3.0.3)
14
+ mail (~> 2.2.9)
15
+ actionpack (3.0.3)
16
+ activemodel (= 3.0.3)
17
+ activesupport (= 3.0.3)
18
+ builder (~> 2.1.2)
19
+ erubis (~> 2.6.6)
20
+ i18n (~> 0.4)
21
+ rack (~> 1.2.1)
22
+ rack-mount (~> 0.6.13)
23
+ rack-test (~> 0.5.6)
24
+ tzinfo (~> 0.3.23)
25
+ activemodel (3.0.3)
26
+ activesupport (= 3.0.3)
27
+ builder (~> 2.1.2)
28
+ i18n (~> 0.4)
29
+ activerecord (3.0.3)
30
+ activemodel (= 3.0.3)
31
+ activesupport (= 3.0.3)
32
+ arel (~> 2.0.2)
33
+ tzinfo (~> 0.3.23)
34
+ activeresource (3.0.3)
35
+ activemodel (= 3.0.3)
36
+ activesupport (= 3.0.3)
37
+ activesupport (3.0.3)
38
+ arel (2.0.6)
39
+ bluecloth (2.0.9)
40
+ builder (2.1.2)
41
+ capybara (0.4.0)
42
+ celerity (>= 0.7.9)
43
+ culerity (>= 0.2.4)
44
+ mime-types (>= 1.16)
45
+ nokogiri (>= 1.3.3)
46
+ rack (>= 1.0.0)
47
+ rack-test (>= 0.5.4)
48
+ selenium-webdriver (>= 0.0.27)
49
+ xpath (~> 0.1.2)
50
+ celerity (0.8.6)
51
+ childprocess (0.1.6)
52
+ ffi (~> 0.6.3)
53
+ culerity (0.2.13)
54
+ diff-lcs (1.1.2)
55
+ erubis (2.6.6)
56
+ abstract (>= 1.0.0)
57
+ ffi (0.6.3)
58
+ rake (>= 0.8.7)
59
+ grit (2.3.0)
60
+ diff-lcs (~> 1.1)
61
+ mime-types (~> 1.15)
62
+ i18n (0.5.0)
63
+ json_pure (1.4.6)
64
+ mail (2.2.13)
65
+ activesupport (>= 2.3.6)
66
+ i18n (>= 0.4.0)
67
+ mime-types (~> 1.16)
68
+ treetop (~> 1.4.8)
69
+ mime-types (1.16)
70
+ nokogiri (1.4.4)
71
+ polyglot (0.3.1)
72
+ rack (1.2.1)
73
+ rack-mount (0.6.13)
74
+ rack (>= 1.0.0)
75
+ rack-test (0.5.7)
76
+ rack (>= 1.0)
77
+ rails (3.0.3)
78
+ actionmailer (= 3.0.3)
79
+ actionpack (= 3.0.3)
80
+ activerecord (= 3.0.3)
81
+ activeresource (= 3.0.3)
82
+ activesupport (= 3.0.3)
83
+ bundler (~> 1.0)
84
+ railties (= 3.0.3)
85
+ railties (3.0.3)
86
+ actionpack (= 3.0.3)
87
+ activesupport (= 3.0.3)
88
+ rake (>= 0.8.7)
89
+ thor (~> 0.14.4)
90
+ rake (0.8.7)
91
+ rubyzip (0.9.4)
92
+ selenium-webdriver (0.1.2)
93
+ childprocess (~> 0.1.5)
94
+ ffi (~> 0.6.3)
95
+ json_pure
96
+ rubyzip
97
+ sqlite3-ruby (1.3.2)
98
+ thor (0.14.6)
99
+ treetop (1.4.9)
100
+ polyglot (>= 0.3.1)
101
+ tzinfo (0.3.23)
102
+ xpath (0.1.2)
103
+ nokogiri (~> 1.3)
104
+ yard (0.6.4)
105
+
106
+ PLATFORMS
107
+ ruby
108
+
109
+ DEPENDENCIES
110
+ bluecloth (~> 2.0.9)
111
+ bundler (~> 1.0.0)
112
+ capybara (~> 0.4.0)
113
+ grit (~> 2.3.0)
114
+ rails (~> 3.0.0)
115
+ regulate!
116
+ sqlite3-ruby (~> 1.3.2)
117
+ yard (~> 0.6.4)
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Quick Left, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ #Regulate
2
+
3
+ The CMS we always wanted.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ require 'rake/testtask'
3
+ Bundler::GemHelper.install_tasks
4
+ desc 'Unit tests.'
5
+ Rake::TestTask.new(:test) do |t|
6
+ t.libs << 'lib'
7
+ t.libs << 'test'
8
+ t.pattern = 'test/**/*_test.rb'
9
+ t.verbose = true
10
+ end
@@ -0,0 +1,69 @@
1
+ module Regulate
2
+
3
+ # Our admin namespace to contain any related controllers
4
+ module Admin
5
+
6
+ # Standard CRUD Controller
7
+ class PagesController < ActionController::Base
8
+ # Load in our page object based on the ID
9
+ before_filter :load_page, :only => [:edit,:update,:destroy]
10
+
11
+ # POST route to create a new page
12
+ def create
13
+ if Regulate::Page.create!(params[:page])
14
+ flash[:notice] = "Page created!"
15
+ redirect_to regulate_admin_regulate_pages_path
16
+ else
17
+ render :action => :new
18
+ end
19
+ end
20
+
21
+ # GET skeleton method to get to an edit page
22
+ def edit; end
23
+
24
+ # PUT method to persist changes to a Page object
25
+ def update
26
+ if @page.update_attributes(params[:page])
27
+ flash[:notice] = "Successfully updated #{params[:page][:title]}"
28
+ redirect_to regulate_admin_regulate_pages_path
29
+ else
30
+ render :action => :edit
31
+ end
32
+ end
33
+
34
+ # GET method to show new Page form
35
+ def new
36
+ @page = Regulate::Page.new
37
+ end
38
+
39
+ # DELETE method to destroy a page
40
+ def destroy
41
+ @page.destroy
42
+ flash[:notice] = "Page deleted."
43
+ redirect_to regulate_admin_regulate_pages_path
44
+ end
45
+
46
+ # GET skeleton method to show a list of pages
47
+ def index
48
+ @pages = Regulate::Page.find_all
49
+ end
50
+
51
+ # GET method to view a page
52
+ # Render the edit action
53
+ def show
54
+ render :action => :edit
55
+ end
56
+
57
+ private
58
+
59
+ # Grab a page resource based on the ID passed to the URI
60
+ def load_page
61
+ @page = Regulate::Page.find(params[:id])
62
+ end
63
+
64
+ end # class PagesController
65
+
66
+ end # module Admin
67
+
68
+ end # module Regulate
69
+
@@ -0,0 +1,13 @@
1
+ module Regulate
2
+
3
+ # @todo Build out XHR-only methods for frontend inline editing
4
+ class PagesController < ActionController::Base
5
+
6
+ # Show function for front-end
7
+ def show
8
+ @page = Regulate::Page.find(params[:id])
9
+ end
10
+
11
+ end # class PagesController
12
+
13
+ end # class Regulate
@@ -0,0 +1,21 @@
1
+ module Regulate
2
+
3
+ # The standard model for our CMS engine
4
+ class Page < Regulate::Git::Model::Base
5
+
6
+ # A title= override so that we are setting a URI-friendly id
7
+ #
8
+ # @param [String] The new title of our page
9
+ # @return [NilClass]
10
+ def title=(new_title)
11
+ @title = new_title
12
+ # Make sure that we're setting our ID.
13
+ # This needs to be URI-friendly
14
+ #@id = self.title.gsub(%r{[ /<>]}, '-').downcase
15
+ @id = self.title.gsub(/[^a-zA-Z0-9']+/, "-").chomp('-').reverse.chomp('-').reverse.downcase
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
@@ -0,0 +1,36 @@
1
+ <style type="text/css">
2
+ fieldset {width:600px;float:left;}
3
+ .form_row, label, textarea, #page_title {clear:both;width:100%;float:left;}
4
+ label {padding:10px 0;text-transform:capitalize;}
5
+ textarea {height:250px;}
6
+ #edit_regions textarea {height:150px;}
7
+ .form_row {padding:10px 0 10px 0;}
8
+ </style>
9
+
10
+ <%= form_for([:regulate , :admin , @page], :as => :page) do |f| %>
11
+ <fieldset id="page_form">
12
+ <div id="custom_field_errors"></div>
13
+ <% if !@page.persisted? %>
14
+ <div class="form_row">
15
+ <%= f.label :title %>
16
+ <%= f.text_field :title %>
17
+ </div>
18
+ <% else %>
19
+ <div class="form_row">
20
+ Title: <%= @page.title %>
21
+ </div>
22
+ <% end %>
23
+ <div class="form_row">
24
+ <%= f.label :view %>
25
+ <%= f.text_area :view %>
26
+ </div>
27
+ <div id="edit_regions"></div>
28
+ <div class="form_row">
29
+ <%= f.submit "Save" %>
30
+ <%= link_to "Cancel" , regulate_admin_regulate_pages_path %>
31
+ </div>
32
+ </fieldset>
33
+ <% end %>
34
+ <%= javascript_tag "var existing_custom_fields = #{@page.edit_regions.to_json}" %>
35
+ <%= javascript_include_tag "jquery.min.js" %>
36
+ <%= javascript_include_tag "regulate_admin" %>
@@ -0,0 +1 @@
1
+ <%= render "form" %>
@@ -0,0 +1,10 @@
1
+ <h2>Pages</h2>
2
+ <%= link_to "New Page", new_regulate_admin_regulate_page_path %>
3
+ <ul>
4
+ <% @pages.each do |page| %>
5
+ <li>
6
+ <%= page.title %>
7
+ <%= link_to "Edit" , edit_regulate_admin_regulate_page_path(page.id) %>
8
+ </li>
9
+ <% end %>
10
+ </ul>
@@ -0,0 +1 @@
1
+ <%= render "form" %>
@@ -0,0 +1,14 @@
1
+ <h2><%= @page.title %></h2>
2
+ <cite>by, <%= @page.versions.first.author.name %></cite>
3
+ <div>
4
+ <%= raw @page.rendered %>
5
+ </div>
6
+ <ul>
7
+ <% @page.versions.each do |version| %>
8
+ <li>
9
+ Author: <%= version.author.name %><br />
10
+ Commit Message: <%= version.message %><br />
11
+ Authored Date: <%= version.authored_date %>
12
+ </li>
13
+ <% end %>
14
+ </ul>
@@ -0,0 +1,10 @@
1
+ development:
2
+ repo: db/repos/development.git
3
+ test: &test
4
+ repo: db/repos/test_engine.git
5
+ production:
6
+ repo: db/repos/production.git
7
+ daily:
8
+ repo: db/repos/daily.git
9
+ cucumber:
10
+ <<: *test
data/config/routes.rb ADDED
@@ -0,0 +1,22 @@
1
+ Rails.application.routes.draw do
2
+
3
+ # Load our engine's routes in to the host app:
4
+ # - Load our route namespace directly from the engine gem
5
+ # - Use the Regulate module
6
+ # - Make sure our route names are namespaced under regulate_
7
+ scope Regulate.route_namespace, :module => :regulate, :as => :regulate do
8
+
9
+ # Only allow the show action publicly
10
+ resources :pages, :only => [ :show ]
11
+
12
+ # In the admin, allow all actions
13
+ # Ensure that we're setting our scoping options properly:
14
+ # - namespaced to "admin"
15
+ # - under the Admin module
16
+ # - the route names namespaced under admin_
17
+ scope "admin", :module => :admin, :as => :admin_regulate do
18
+ resources :pages
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,39 @@
1
+ module Regulate
2
+
3
+ # Top level generators module to hold any generators for our engine gem
4
+ module Generators
5
+
6
+ # Standard install that lets a user copy files over so they can override some functionality
7
+ class InstallGenerator < Rails::Generators::Base
8
+
9
+ # Tell Rails where to find our templates
10
+ source_root File.expand_path("../../templates", __FILE__)
11
+
12
+ desc "Copies files to your application that regulate needs."
13
+
14
+ # Copy over our CSS
15
+ def copy_css
16
+ template "regulate.css", "public/stylesheets/regulate.css"
17
+ end
18
+
19
+ # Copy over our JS
20
+ def copy_js
21
+ template "regulate.js", "public/javascripts/regulate.js"
22
+ end
23
+
24
+ # Copy over the repo config YAML file
25
+ def copy_yml
26
+ template "regulate.yml", "config/regulate.yml"
27
+ end
28
+
29
+ # Copy over the Regulate initializer
30
+ def copy_initializer
31
+ template "regulate.rb", "config/initializers/regulate.rb"
32
+ end
33
+
34
+ end # class InstallGenerator
35
+
36
+ end # Generators
37
+
38
+ end # module Regulate
39
+
@@ -0,0 +1,73 @@
1
+ module Regulate
2
+
3
+ module Generators
4
+
5
+ # Class lifted from Devise. Thanks josevalim!
6
+ class ViewsGenerator < Rails::Generators::Base
7
+
8
+ # Tell Rails where our view files are
9
+ source_root File.expand_path("../../../../app/views", __FILE__)
10
+ desc "Copies all Regulate views to your application in app/views/pages."
11
+
12
+ class_option :template_engine, :type => :string, :aliases => "-t",
13
+ :desc => "Template engine for the views. Available options are 'erb' and 'haml'."
14
+
15
+ # Copy over our view files
16
+ def copy_views
17
+ case options[:template_engine].to_s
18
+ when "haml"
19
+ verify_haml_existence
20
+ verify_haml_version
21
+ create_and_copy_haml_views
22
+ else
23
+ directory "pages", "app/views/pages"
24
+ end
25
+ end
26
+
27
+ protected
28
+
29
+ # Check whether the current environment has HAML
30
+ def verify_haml_existence
31
+ begin
32
+ require 'haml'
33
+ rescue LoadError
34
+ say "HAML is not installed, or it is not specified in your Gemfile."
35
+ exit
36
+ end
37
+ end
38
+
39
+ # Make sure we have the right HAML version
40
+ def verify_haml_version
41
+ unless Haml.version[:major] == 2 and Haml.version[:minor] >= 3 or Haml.version[:major] >= 3
42
+ say "To generate HAML templates, you need to install HAML 2.3 or above."
43
+ exit
44
+ end
45
+ end
46
+
47
+ # Copy over the HAML files
48
+ def create_and_copy_haml_views
49
+ require 'tmpdir'
50
+ html_root = "#{self.class.source_root}/pages"
51
+
52
+ Dir.mktmpdir("regulate-haml.") do |haml_root|
53
+ Dir["#{html_root}/**/*"].each do |path|
54
+ relative_path = path.sub(html_root, "")
55
+ source_path = (haml_root + relative_path).sub(/erb$/, "haml")
56
+
57
+ if File.directory?(path)
58
+ FileUtils.mkdir_p(source_path)
59
+ else
60
+ `html2haml -r #{path} #{source_path}`
61
+ end
62
+ end
63
+
64
+ directory haml_root, "app/views/pages"
65
+ end
66
+ end
67
+
68
+ end # class ViewsGenerator
69
+
70
+ end # module Generators
71
+
72
+ end # module Regulate
73
+