bobby 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +5 -1
- data/VERSION +1 -1
- data/bobby.gemspec +15 -1
- data/features/install_bobby.feature +14 -0
- data/features/step_definitions/common_steps.rb +178 -0
- data/features/step_definitions/install_bobby_steps.rb +33 -0
- data/features/step_definitions/rails_setup_steps.rb +26 -0
- data/features/support/common.rb +32 -0
- data/features/support/env.rb +26 -1
- data/features/support/matchers.rb +11 -0
- data/lib/generators/bobby/USAGE +8 -0
- data/lib/generators/bobby/bobby/bobby_generator.rb +88 -0
- data/lib/generators/bobby/bobby_generator.rb +2 -0
- data/lib/generators/bobby/bobby_install_generator.rb +4 -0
- data/lib/generators/bobby/install/install_generator.rb +103 -0
- data/lib/generators/bobby/install/templates/README +29 -0
- data/lib/generators/bobby/install/templates/en.yml +2 -0
- data/lib/generators/bobby/install/templates/migration.rb +49 -0
- metadata +17 -3
data/Gemfile
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
source :gemcutter
|
2
1
|
source "http://rubygems.org"
|
3
2
|
|
4
3
|
gem 'rails', '3.0.0.beta4'
|
@@ -20,6 +19,9 @@ group :development do
|
|
20
19
|
|
21
20
|
# for development only !
|
22
21
|
#gem "rails-footnotes" - not ready for Rails 3
|
22
|
+
|
23
|
+
# for testing gems
|
24
|
+
gem 'rubigen'
|
23
25
|
|
24
26
|
end
|
25
27
|
|
@@ -39,6 +41,8 @@ group :test do
|
|
39
41
|
|
40
42
|
end
|
41
43
|
|
44
|
+
# gem 'bobby'
|
45
|
+
|
42
46
|
# database interfaces to provide
|
43
47
|
# gem 'mysql'
|
44
48
|
gem 'sqlite3-ruby', :require => 'sqlite3'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
data/bobby.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{bobby}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Enrique Phillips"]
|
@@ -26,13 +26,27 @@ Gem::Specification.new do |s|
|
|
26
26
|
"Rakefile",
|
27
27
|
"VERSION",
|
28
28
|
"bobby.gemspec",
|
29
|
+
"features/install_bobby.feature",
|
29
30
|
"features/manage_posts.feature",
|
31
|
+
"features/step_definitions/common_steps.rb",
|
30
32
|
"features/step_definitions/devise_steps.rb",
|
33
|
+
"features/step_definitions/install_bobby_steps.rb",
|
31
34
|
"features/step_definitions/post_steps.rb",
|
35
|
+
"features/step_definitions/rails_setup_steps.rb",
|
32
36
|
"features/step_definitions/web_steps.rb",
|
37
|
+
"features/support/common.rb",
|
33
38
|
"features/support/env.rb",
|
39
|
+
"features/support/matchers.rb",
|
34
40
|
"features/support/paths.rb",
|
35
41
|
"lib/bobby.rb",
|
42
|
+
"lib/generators/bobby/USAGE",
|
43
|
+
"lib/generators/bobby/bobby/bobby_generator.rb",
|
44
|
+
"lib/generators/bobby/bobby_generator.rb",
|
45
|
+
"lib/generators/bobby/bobby_install_generator.rb",
|
46
|
+
"lib/generators/bobby/install/install_generator.rb",
|
47
|
+
"lib/generators/bobby/install/templates/README",
|
48
|
+
"lib/generators/bobby/install/templates/en.yml",
|
49
|
+
"lib/generators/bobby/install/templates/migration.rb",
|
36
50
|
"lib/tasks/.gitkeep",
|
37
51
|
"lib/tasks/cucumber.rake",
|
38
52
|
"lib/tasks/jquery_setup.rake",
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Feature: Installing Bobby
|
2
|
+
In order to control access to actions on controllers and instances of models
|
3
|
+
As a humble corners-cutting Rails/JavaScript developer
|
4
|
+
I want to install bobby into my Rails app
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given a Rails app
|
8
|
+
And I have the generator in "lib/generators/bobby"
|
9
|
+
|
10
|
+
Scenario: Setup the Bobby
|
11
|
+
Given I have bobby installed
|
12
|
+
When I invoke "bobby:install" generator
|
13
|
+
And I invoke task "rake db:migrate"
|
14
|
+
Then I can instanciate the models "Authorisation GroupUser GroupUsersUsers Permission PermissionsRoles Role"
|
@@ -0,0 +1,178 @@
|
|
1
|
+
Given /^this project is active project folder/ do
|
2
|
+
@active_project_folder = File.expand_path(File.dirname(__FILE__) + "/../..")
|
3
|
+
end
|
4
|
+
|
5
|
+
Given /^env variable \$([\w_]+) set to "(.*)"/ do |env_var, value|
|
6
|
+
ENV[env_var] = value
|
7
|
+
end
|
8
|
+
|
9
|
+
Given /I delete (folder|file) "([^\"]*)"/ do |type, folder|
|
10
|
+
in_project_folder { FileUtils.rm_rf folder }
|
11
|
+
end
|
12
|
+
|
13
|
+
When /^I invoke "(.*)" generator with arguments "(.*)"$/ do |generator, arguments|
|
14
|
+
@stdout = StringIO.new
|
15
|
+
|
16
|
+
# in_project_folder do
|
17
|
+
# if Object.const_defined?("APP_ROOT")
|
18
|
+
# APP_ROOT.replace(FileUtils.pwd)
|
19
|
+
# else
|
20
|
+
# APP_ROOT = FileUtils.pwd
|
21
|
+
# end
|
22
|
+
# run_generator(generator, arguments.split(' '), SOURCES, :stdout => @stdout)
|
23
|
+
# end
|
24
|
+
|
25
|
+
f = open("|rails generate #{generator} #{arguments}")
|
26
|
+
foo = f.read()
|
27
|
+
f.close
|
28
|
+
|
29
|
+
foo.should include('fisk')
|
30
|
+
end
|
31
|
+
|
32
|
+
When /^I run executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
33
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
34
|
+
in_project_folder do
|
35
|
+
system "#{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
When /^I run project executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
40
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
41
|
+
in_project_folder do
|
42
|
+
system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
When /^I run local executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
47
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
48
|
+
executable = File.expand_path(File.join(File.dirname(__FILE__), "/../../bin", executable))
|
49
|
+
in_project_folder do
|
50
|
+
system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
When /^I invoke task "rake (.*)"/ do |task|
|
55
|
+
@stdout = File.expand_path(File.join(@tmp_root, "rake.out"))
|
56
|
+
@stderr = File.expand_path(File.join(@tmp_root, "rake.err"))
|
57
|
+
in_project_folder do
|
58
|
+
system "rake #{task} --trace > #{@stdout} 2> #{@stderr}"
|
59
|
+
end
|
60
|
+
File.read(@stderr).should_not =~ /rake aborted!/
|
61
|
+
end
|
62
|
+
|
63
|
+
Then /^folder "(.*)" (is|is not) created/ do |folder, is|
|
64
|
+
in_project_folder do
|
65
|
+
File.exists?(folder).should(is == 'is' ? be_true : be_false)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
Then /^file "(.*)" (is|is not) created/ do |file, is|
|
70
|
+
in_project_folder do
|
71
|
+
File.exists?(file).should(is == 'is' ? be_true : be_false)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
Then /^file with name matching "(.*)" is created/ do |pattern|
|
76
|
+
in_project_folder do
|
77
|
+
Dir[pattern].should_not be_empty
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
Then /^file "(.*)" contents (does|does not) match \/(.*)\// do |file, does, regex|
|
82
|
+
in_project_folder do
|
83
|
+
actual_output = File.read(file)
|
84
|
+
(does == 'does') ?
|
85
|
+
actual_output.should(match(/#{regex}/)) :
|
86
|
+
actual_output.should_not(match(/#{regex}/))
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
Then /gem file "(.*)" and generated file "(.*)" should be the same/ do |gem_file, project_file|
|
91
|
+
File.exists?(gem_file).should be_true
|
92
|
+
File.exists?(project_file).should be_true
|
93
|
+
gem_file_contents = File.read(File.dirname(__FILE__) + "/../../#{gem_file}")
|
94
|
+
project_file_contents = File.read(File.join(@active_project_folder, project_file))
|
95
|
+
project_file_contents.should == gem_file_contents
|
96
|
+
end
|
97
|
+
|
98
|
+
Then /^(does|does not) invoke generator "(.*)"$/ do |does_invoke, generator|
|
99
|
+
actual_output = File.read(@stdout)
|
100
|
+
does_invoke == "does" ?
|
101
|
+
actual_output.should(match(/dependency\s+#{generator}/)) :
|
102
|
+
actual_output.should_not(match(/dependency\s+#{generator}/))
|
103
|
+
end
|
104
|
+
|
105
|
+
Then /help options "(.*)" and "(.*)" are displayed/ do |opt1, opt2|
|
106
|
+
actual_output = File.read(@stdout)
|
107
|
+
actual_output.should match(/#{opt1}/)
|
108
|
+
actual_output.should match(/#{opt2}/)
|
109
|
+
end
|
110
|
+
|
111
|
+
Then /^file should contain "([^\"]*)"$/ do |text|
|
112
|
+
actual_output = File.read(@stdout)
|
113
|
+
actual_output.should contain(text)
|
114
|
+
end
|
115
|
+
|
116
|
+
Then /^file should not contain "([^\"]*)"$/ do |text|
|
117
|
+
actual_output = File.read(@stdout)
|
118
|
+
actual_output.should_not contain(text)
|
119
|
+
end
|
120
|
+
|
121
|
+
Then /^file should contain$/ do |text|
|
122
|
+
actual_output = File.read(@stdout)
|
123
|
+
actual_output.should contain(text)
|
124
|
+
end
|
125
|
+
|
126
|
+
Then /^file should not contain$/ do |text|
|
127
|
+
actual_output = File.read(@stdout)
|
128
|
+
actual_output.should_not contain(text)
|
129
|
+
end
|
130
|
+
|
131
|
+
Then /^file should contain exactly$/ do |text|
|
132
|
+
actual_output = File.read(@stdout)
|
133
|
+
actual_output.should == text
|
134
|
+
end
|
135
|
+
|
136
|
+
Then /^I should see all (\d+) tests pass/ do |expected_test_count|
|
137
|
+
expected = %r{^#{expected_test_count} tests, \d+ assertions, 0 failures, 0 errors}
|
138
|
+
actual_output = File.read(@stdout)
|
139
|
+
actual_output.should match(expected)
|
140
|
+
end
|
141
|
+
|
142
|
+
Then /^I should see all (\d+) examples pass/ do |expected_test_count|
|
143
|
+
expected = %r{^#{expected_test_count} examples?, 0 failures}
|
144
|
+
actual_output = File.read(@stdout)
|
145
|
+
actual_output.should match(expected)
|
146
|
+
end
|
147
|
+
|
148
|
+
Then /^yaml file "(.*)" contains (\{.*\})/ do |file, yaml|
|
149
|
+
in_project_folder do
|
150
|
+
yaml = eval yaml
|
151
|
+
YAML.load(File.read(file)).should == yaml
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
Then /^Rakefile can display tasks successfully/ do
|
156
|
+
@stdout = File.expand_path(File.join(@tmp_root, "rakefile.out"))
|
157
|
+
in_project_folder do
|
158
|
+
system "rake -T > #{@stdout} 2> #{@stdout}"
|
159
|
+
end
|
160
|
+
actual_output = File.read(@stdout)
|
161
|
+
actual_output.should match(/^rake\s+\w+\s+#\s.*/)
|
162
|
+
end
|
163
|
+
|
164
|
+
Then /^task "rake (.*)" is executed successfully/ do |task|
|
165
|
+
@stdout.should_not be_nil
|
166
|
+
actual_output = File.read(@stdout)
|
167
|
+
actual_output.should_not match(/^Don't know how to build task '#{task}'/)
|
168
|
+
actual_output.should_not match(/Error/i)
|
169
|
+
end
|
170
|
+
|
171
|
+
Then /^gem spec key "(.*)" contains \/(.*)\// do |key, regex|
|
172
|
+
in_project_folder do
|
173
|
+
gem_file = Dir["pkg/*.gem"].first
|
174
|
+
gem_spec = Gem::Specification.from_yaml(`gem spec #{gem_file}`)
|
175
|
+
spec_value = gem_spec.send(key.to_sym)
|
176
|
+
spec_value.to_s.should match(/#{regex}/)
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
Given /^a Rails app$/ do
|
2
|
+
%w{ app app/controllers app/models app/views }.each do |pattern|
|
3
|
+
Dir[pattern].should_not be_empty
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^I have the generator in "([^"]*)"$/ do |folder|
|
8
|
+
folder = File.expand_path(File.join(Rails.root, folder))
|
9
|
+
File.exists?(folder+"/USAGE").should be_true
|
10
|
+
end
|
11
|
+
|
12
|
+
Then /^I can instanciate the models "([^"]*)"$/ do |models|
|
13
|
+
models.split(" ").each do |model|
|
14
|
+
puts model
|
15
|
+
#(model.constantize).table_name.should == model.underscore.pluralize
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Given /^I have bobby installed$/ do
|
20
|
+
actual_output = File.read('Gemfile')
|
21
|
+
actual_output.should(match(/bobby/))
|
22
|
+
end
|
23
|
+
|
24
|
+
When /^I invoke "([^"]*)" generator$/ do |generator|
|
25
|
+
f = open("|rails generate #{generator}")
|
26
|
+
foo = f.read()
|
27
|
+
f.close
|
28
|
+
|
29
|
+
foo.should include('bobby_create_tables')
|
30
|
+
foo.should include('roles')
|
31
|
+
foo.should include('permissions')
|
32
|
+
foo.should include('group_users')
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Given /^a Rails app$/ do
|
2
|
+
# FileUtils.chdir(@tmp_root) do
|
3
|
+
# `rails new test_project`
|
4
|
+
# end
|
5
|
+
# @active_project_folder = File.expand_path(File.join(@tmp_root, "test_project"))
|
6
|
+
# end
|
7
|
+
|
8
|
+
# Given /^I copy the project generators into "([^\"]*)"$/ do |target_folder|
|
9
|
+
# in_project_folder do
|
10
|
+
# FileUtils.mkdir_p(target_folder)
|
11
|
+
# end
|
12
|
+
# `cp -rf #{File.dirname(__FILE__) + "/../../rails_generators/*"} #{File.join(@active_project_folder, target_folder)}`
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# When /^I add a feature file to test Rails index.html default file$/ do
|
16
|
+
# sample_feature = File.expand_path(File.dirname(__FILE__) + "/../fixtures/sample_feature")
|
17
|
+
# in_project_folder do
|
18
|
+
# `cp -rf #{sample_feature} features/sample.feature`
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# After do
|
23
|
+
# in_project_folder do
|
24
|
+
# Given 'I invoke task "rake culerity:rails:stop"'
|
25
|
+
# end
|
26
|
+
# end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module CommonHelpers
|
2
|
+
def in_tmp_folder(&block)
|
3
|
+
FileUtils.chdir(@tmp_root, &block)
|
4
|
+
end
|
5
|
+
|
6
|
+
def in_project_folder(&block)
|
7
|
+
project_folder = @active_project_folder || @tmp_root
|
8
|
+
FileUtils.chdir(project_folder, &block)
|
9
|
+
end
|
10
|
+
|
11
|
+
def in_home_folder(&block)
|
12
|
+
FileUtils.chdir(@home_path, &block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def force_local_lib_override(options = {})
|
16
|
+
target_path = options[:target_path] || options[:target_file] || options[:target] || 'Rakefile'
|
17
|
+
in_project_folder do
|
18
|
+
contents = File.read(target_path)
|
19
|
+
File.open(target_path, "w+") do |f|
|
20
|
+
f << "$:.unshift('#{@lib_path}')\n"
|
21
|
+
f << contents
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def setup_active_project_folder project_name
|
27
|
+
@active_project_folder = File.join(@tmp_root, project_name)
|
28
|
+
@project_name = project_name
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
World(CommonHelpers)
|
data/features/support/env.rb
CHANGED
@@ -16,7 +16,32 @@ require 'cucumber/web/tableish'
|
|
16
16
|
require 'capybara/rails'
|
17
17
|
require 'capybara/cucumber'
|
18
18
|
require 'capybara/session'
|
19
|
-
require 'cucumber/rails/capybara_javascript_emulation'
|
19
|
+
require 'cucumber/rails/capybara_javascript_emulation'
|
20
|
+
|
21
|
+
#require File.dirname(__FILE__) + "/../../lib/bobby"
|
22
|
+
|
23
|
+
# gem 'rspec'
|
24
|
+
# require 'spec'
|
25
|
+
|
26
|
+
Before do
|
27
|
+
@tmp_root = File.dirname(__FILE__) + "/../../tmp"
|
28
|
+
@home_path = File.expand_path(File.join(@tmp_root, "home"))
|
29
|
+
@lib_path = File.expand_path(File.dirname(__FILE__) + "/../../lib")
|
30
|
+
FileUtils.rm_rf @tmp_root
|
31
|
+
FileUtils.mkdir_p @home_path
|
32
|
+
ENV['HOME'] = @home_path
|
33
|
+
end
|
34
|
+
|
35
|
+
# require 'rubigen'
|
36
|
+
# require 'rubigen/helpers/generator_test_helper'
|
37
|
+
# include RubiGen::GeneratorTestHelper
|
38
|
+
#require 'rails_generator'
|
39
|
+
|
40
|
+
# SOURCES = Dir[File.dirname(__FILE__) + "/../../generators"].map do |f|
|
41
|
+
# RubiGen::PathSource.new(:test, File.expand_path(f))
|
42
|
+
# end
|
43
|
+
|
44
|
+
# Lets you click links with onclick javascript handlers without using @culerity or @javascript
|
20
45
|
# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
|
21
46
|
# order to ease the transition to Capybara we set the default here. If you'd
|
22
47
|
# prefer to use XPath just remove this line and adjust any selectors in your
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Matchers
|
2
|
+
# def contain(expected)
|
3
|
+
# simple_matcher("contain #{expected.inspect}") do |given, matcher|
|
4
|
+
# matcher.failure_message = "expected #{given.inspect} to contain #{expected.inspect}"
|
5
|
+
# matcher.negative_failure_message = "expected #{given.inspect} not to contain #{expected.inspect}"
|
6
|
+
# given.index expected
|
7
|
+
# end
|
8
|
+
# end
|
9
|
+
end
|
10
|
+
|
11
|
+
World(Matchers)
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'rails/generators/migration'
|
2
|
+
|
3
|
+
module Devise
|
4
|
+
module Generators
|
5
|
+
class DeviseGenerator < Rails::Generators::NamedBase
|
6
|
+
include Rails::Generators::Migration
|
7
|
+
|
8
|
+
source_root File.expand_path("../templates", __FILE__)
|
9
|
+
#namespace "bobby"
|
10
|
+
|
11
|
+
desc "Generates models with the given NAME (if one does not exist) with bobby " <<
|
12
|
+
"configuration plus a migration file and bobby routes."
|
13
|
+
|
14
|
+
def self.orm_has_migration?
|
15
|
+
Rails::Generators.options[:rails][:orm] == :active_record
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.next_migration_number(path)
|
19
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
20
|
+
end
|
21
|
+
|
22
|
+
class_option :orm
|
23
|
+
class_option :migration, :type => :boolean, :default => orm_has_migration?
|
24
|
+
|
25
|
+
def invoke_orm_model
|
26
|
+
return unless behavior == :invoke
|
27
|
+
|
28
|
+
if model_exists?
|
29
|
+
say "* Model already exists. Adding Devise behavior."
|
30
|
+
elsif options[:orm].present?
|
31
|
+
invoke "model", [name], :migration => false, :orm => options[:orm]
|
32
|
+
|
33
|
+
unless model_exists?
|
34
|
+
abort "Tried to invoke the model generator for '#{options[:orm]}' but could not find it.\n" <<
|
35
|
+
"Please create your model by hand before calling `rails g devise #{name}`."
|
36
|
+
end
|
37
|
+
else
|
38
|
+
abort "Cannot create a devise model because config.generators.orm is blank.\n" <<
|
39
|
+
"Please create your model by hand or configure your generators orm before calling `rails g devise #{name}`."
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def inject_devise_config_into_model
|
44
|
+
devise_class_setup = <<-CONTENT
|
45
|
+
|
46
|
+
# Include default devise modules. Others available are:
|
47
|
+
# :token_authenticatable, :confirmable, :lockable and :timeoutable
|
48
|
+
devise :database_authenticatable, :registerable,
|
49
|
+
:recoverable, :rememberable, :trackable, :validatable
|
50
|
+
|
51
|
+
CONTENT
|
52
|
+
|
53
|
+
case options[:orm].to_s
|
54
|
+
when "mongoid"
|
55
|
+
inject_into_file model_path, devise_class_setup, :after => "include Mongoid::Document\n"
|
56
|
+
when "data_mapper"
|
57
|
+
inject_into_file model_path, devise_class_setup, :after => "include DataMapper::Resource\n"
|
58
|
+
when "active_record"
|
59
|
+
inject_into_class model_path, class_name, devise_class_setup + <<-CONTENT
|
60
|
+
# Setup accessible (or protected) attributes for your model
|
61
|
+
attr_accessible :email, :password, :password_confirmation
|
62
|
+
CONTENT
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def copy_migration_template
|
67
|
+
return unless options.migration?
|
68
|
+
migration_template "migration.rb", "db/migrate/bobby_create_tables"
|
69
|
+
end
|
70
|
+
|
71
|
+
def add_bobby_routes
|
72
|
+
route "ressources :roles"
|
73
|
+
route "ressources :permissions"
|
74
|
+
route "ressources :group_users"
|
75
|
+
end
|
76
|
+
|
77
|
+
protected
|
78
|
+
|
79
|
+
def model_exists?
|
80
|
+
File.exists?(File.join(destination_root, model_path))
|
81
|
+
end
|
82
|
+
|
83
|
+
def model_path
|
84
|
+
@model_path ||= File.join("app", "models", "#{file_path}.rb")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'active_support/secure_random'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
|
5
|
+
module Bobby
|
6
|
+
module Generators
|
7
|
+
class InstallGenerator < Rails::Generators::Base
|
8
|
+
include Rails::Generators::Migration
|
9
|
+
|
10
|
+
source_root File.expand_path("../templates", __FILE__)
|
11
|
+
|
12
|
+
desc "Generates models with the given NAME (if one does not exist) with bobby " <<
|
13
|
+
"configuration plus a migration file, bobby routes and copy locale files to your application."
|
14
|
+
|
15
|
+
class_option :orm
|
16
|
+
|
17
|
+
# def copy_initializer
|
18
|
+
# template "bobby.rb", "config/initializers/bobby.rb"
|
19
|
+
# end
|
20
|
+
|
21
|
+
def self.orm_has_migration?
|
22
|
+
Rails::Generators.options[:rails][:orm] == :active_record
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.next_migration_number(path)
|
26
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
27
|
+
end
|
28
|
+
|
29
|
+
class_option :migration, :type => :boolean, :default => orm_has_migration?
|
30
|
+
|
31
|
+
# def invoke_orm_model
|
32
|
+
# return unless behavior == :invoke
|
33
|
+
#
|
34
|
+
# if model_exists?
|
35
|
+
# say "* Model already exists. Adding Bobby behavior."
|
36
|
+
# elsif options[:orm].present?
|
37
|
+
# invoke "model", [name], :migration => false, :orm => options[:orm]
|
38
|
+
#
|
39
|
+
# unless model_exists?
|
40
|
+
# abort "Tried to invoke the model generator for '#{options[:orm]}' but could not find it.\n" <<
|
41
|
+
# "Please create your model by hand before calling `rails g bobby #{name}`."
|
42
|
+
# end
|
43
|
+
# else
|
44
|
+
# abort "Cannot create a devise model because config.generators.orm is blank.\n" <<
|
45
|
+
# "Please create your model by hand or configure your generators orm before calling `rails g devise #{name}`."
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
|
49
|
+
# def inject_devise_config_into_model
|
50
|
+
# devise_class_setup = <<-CONTENT
|
51
|
+
#
|
52
|
+
# # Include default devise modules. Others available are:
|
53
|
+
# # :token_authenticatable, :confirmable, :lockable and :timeoutable
|
54
|
+
# devise :database_authenticatable, :registerable,
|
55
|
+
# :recoverable, :rememberable, :trackable, :validatable
|
56
|
+
#
|
57
|
+
# CONTENT
|
58
|
+
#
|
59
|
+
# case options[:orm].to_s
|
60
|
+
# when "mongoid"
|
61
|
+
# inject_into_file model_path, devise_class_setup, :after => "include Mongoid::Document\n"
|
62
|
+
# when "data_mapper"
|
63
|
+
# inject_into_file model_path, devise_class_setup, :after => "include DataMapper::Resource\n"
|
64
|
+
# when "active_record"
|
65
|
+
# inject_into_class model_path, class_name, devise_class_setup + <<-CONTENT
|
66
|
+
# # Setup accessible (or protected) attributes for your model
|
67
|
+
# attr_accessible :email, :password, :password_confirmation
|
68
|
+
# CONTENT
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
|
72
|
+
def copy_migration_template
|
73
|
+
return unless options.migration?
|
74
|
+
migration_template "migration.rb", "db/migrate/bobby_create_tables"
|
75
|
+
end
|
76
|
+
|
77
|
+
def add_bobby_routes
|
78
|
+
route "resources :roles"
|
79
|
+
route "resources :permissions"
|
80
|
+
route "resources :group_users"
|
81
|
+
end
|
82
|
+
|
83
|
+
protected
|
84
|
+
|
85
|
+
def model_exists?
|
86
|
+
File.exists?(File.join(destination_root, model_path))
|
87
|
+
end
|
88
|
+
|
89
|
+
def model_path
|
90
|
+
@model_path ||= File.join("app", "models", "#{file_path}.rb")
|
91
|
+
end
|
92
|
+
|
93
|
+
def copy_locale
|
94
|
+
copy_file "en.yml", "config/locales/bobby.en.yml"
|
95
|
+
end
|
96
|
+
|
97
|
+
def show_readme
|
98
|
+
readme "README"
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
===============================================================================
|
3
|
+
|
4
|
+
Some setup you must do manually:
|
5
|
+
|
6
|
+
1. add a filter to your ApplicationController
|
7
|
+
|
8
|
+
before_filter :access_authorized?
|
9
|
+
|
10
|
+
or add the filter to select controllers
|
11
|
+
|
12
|
+
if controllers follows particular patterns like the Presenter Pattern
|
13
|
+
add the table(s) as arguments to the filter
|
14
|
+
|
15
|
+
before_filter :access_authorized? :posts, :comments
|
16
|
+
|
17
|
+
2. add a default_scope to your models
|
18
|
+
|
19
|
+
default_scope :instances_authorized
|
20
|
+
|
21
|
+
3. build access control structures using the Role, Permission and GroupUser views,
|
22
|
+
like
|
23
|
+
|
24
|
+
/roles
|
25
|
+
/permissions
|
26
|
+
/group_users
|
27
|
+
|
28
|
+
|
29
|
+
===============================================================================
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class BobbyCreateTables < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :permissions do |t|
|
4
|
+
t.string :name
|
5
|
+
t.string :actions_allowed
|
6
|
+
t.text :on_tables
|
7
|
+
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
create_table :roles do |t|
|
11
|
+
t.string :name
|
12
|
+
|
13
|
+
t.timestamps
|
14
|
+
end
|
15
|
+
create_table :authorisations do |t|
|
16
|
+
t.references :authorisable, :polymorphic => true
|
17
|
+
t.integer :role_id
|
18
|
+
|
19
|
+
t.timestamps
|
20
|
+
end
|
21
|
+
create_table :permissions_roles, :id => false do |t|
|
22
|
+
t.integer :permission_id
|
23
|
+
t.integer :role_id
|
24
|
+
|
25
|
+
t.timestamps
|
26
|
+
end
|
27
|
+
create_table :group_users do |t|
|
28
|
+
t.string :name
|
29
|
+
|
30
|
+
t.timestamps
|
31
|
+
end
|
32
|
+
create_table :group_users_users, :id => false do |t|
|
33
|
+
t.integer :group_user_id
|
34
|
+
t.integer :user_id
|
35
|
+
|
36
|
+
t.timestamps
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.down
|
42
|
+
drop_table :group_users_users
|
43
|
+
drop_table :group_users
|
44
|
+
drop_table :permissions_roles
|
45
|
+
drop_table :authorisations
|
46
|
+
drop_table :roles
|
47
|
+
drop_table :permissions
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bobby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Enrique Phillips
|
@@ -68,13 +68,27 @@ files:
|
|
68
68
|
- Rakefile
|
69
69
|
- VERSION
|
70
70
|
- bobby.gemspec
|
71
|
+
- features/install_bobby.feature
|
71
72
|
- features/manage_posts.feature
|
73
|
+
- features/step_definitions/common_steps.rb
|
72
74
|
- features/step_definitions/devise_steps.rb
|
75
|
+
- features/step_definitions/install_bobby_steps.rb
|
73
76
|
- features/step_definitions/post_steps.rb
|
77
|
+
- features/step_definitions/rails_setup_steps.rb
|
74
78
|
- features/step_definitions/web_steps.rb
|
79
|
+
- features/support/common.rb
|
75
80
|
- features/support/env.rb
|
81
|
+
- features/support/matchers.rb
|
76
82
|
- features/support/paths.rb
|
77
83
|
- lib/bobby.rb
|
84
|
+
- lib/generators/bobby/USAGE
|
85
|
+
- lib/generators/bobby/bobby/bobby_generator.rb
|
86
|
+
- lib/generators/bobby/bobby_generator.rb
|
87
|
+
- lib/generators/bobby/bobby_install_generator.rb
|
88
|
+
- lib/generators/bobby/install/install_generator.rb
|
89
|
+
- lib/generators/bobby/install/templates/README
|
90
|
+
- lib/generators/bobby/install/templates/en.yml
|
91
|
+
- lib/generators/bobby/install/templates/migration.rb
|
78
92
|
- lib/tasks/.gitkeep
|
79
93
|
- lib/tasks/cucumber.rake
|
80
94
|
- lib/tasks/jquery_setup.rake
|