From a67066ea05e020a9c134434c820789c95f267b87 Mon Sep 17 00:00:00 2001 From: Espen Antonsen Date: Thu, 4 Jun 2009 22:28:28 +0200 Subject: [PATCH] Cucumber tests. Added Acts as permissible --- app/models/album.rb | 6 +- app/views/albums/index.html.erb | 5 +- app/views/layouts/application.html.erb | 1 + app/views/photos/show.html.erb | 3 - config/environments/cucumber.rb | 3 + config/environments/test.rb | 5 - config/settings.yml | 10 +- features/manage_albums.feature | 41 ++++ features/step_definitions/album_steps.rb | 26 +++ features/step_definitions/collection_steps.rb | 17 ++ features/step_definitions/user_steps.rb | 13 ++ features/step_definitions/webrat_steps.rb | 7 + features/support/clean_folder.rb | 9 + features/support/env.rb | 8 +- features/support/paths.rb | 4 + spec/factories.rb | 9 + .../plugins/acts_as_permissible/MIT-LICENSE | 20 ++ vendor/plugins/acts_as_permissible/README | 68 ++++++ vendor/plugins/acts_as_permissible/Rakefile | 22 ++ .../generators/permissible/USAGE | 1 + .../permissible/permissible_generator.rb | 154 +++++++++++++ .../templates/acts_as_permissible.rb | 106 +++++++++ .../templates/acts_as_permissible_spec.rb | 208 ++++++++++++++++++ .../permissible/templates/fixtures.yml | 48 ++++ .../permissible/templates/initializer.rb | 2 + .../permissible/templates/migration.rb | 16 ++ .../generators/permissible/templates/model.rb | 19 ++ .../permissible/templates/model_spec.rb | 51 +++++ .../templates/role_membership_migration.rb | 15 ++ .../templates/role_membership_model.rb | 36 +++ .../role_membership_model_fixtures.yml | 25 +++ .../templates/role_membership_model_spec.rb | 100 +++++++++ .../permissible/templates/role_migration.rb | 13 ++ .../permissible/templates/role_model.rb | 12 + .../templates/role_model_fixtures.yml | 15 ++ .../permissible/templates/role_model_spec.rb | 53 +++++ vendor/plugins/acts_as_permissible/init.rb | 7 + vendor/plugins/acts_as_permissible/install.rb | 1 + .../acts_as_permissible/lib/.gitignore | 0 .../tasks/acts_as_permissible_tasks.rake | 4 + .../test/acts_as_permissible_test.rb | 8 + .../plugins/acts_as_permissible/uninstall.rb | 1 + 42 files changed, 1152 insertions(+), 20 deletions(-) create mode 100644 features/manage_albums.feature create mode 100644 features/step_definitions/album_steps.rb create mode 100644 features/step_definitions/collection_steps.rb create mode 100644 features/step_definitions/user_steps.rb create mode 100644 features/support/clean_folder.rb create mode 100644 spec/factories.rb create mode 100644 vendor/plugins/acts_as_permissible/MIT-LICENSE create mode 100644 vendor/plugins/acts_as_permissible/README create mode 100644 vendor/plugins/acts_as_permissible/Rakefile create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/USAGE create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/permissible_generator.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/acts_as_permissible.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/acts_as_permissible_spec.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/fixtures.yml create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/initializer.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/migration.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/model.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/model_spec.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_migration.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model_fixtures.yml create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model_spec.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_migration.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model.rb create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model_fixtures.yml create mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model_spec.rb create mode 100644 vendor/plugins/acts_as_permissible/init.rb create mode 100644 vendor/plugins/acts_as_permissible/install.rb create mode 100644 vendor/plugins/acts_as_permissible/lib/.gitignore create mode 100644 vendor/plugins/acts_as_permissible/tasks/acts_as_permissible_tasks.rake create mode 100644 vendor/plugins/acts_as_permissible/test/acts_as_permissible_test.rb create mode 100644 vendor/plugins/acts_as_permissible/uninstall.rb diff --git a/app/models/album.rb b/app/models/album.rb index 30cd789..6253e7a 100644 --- a/app/models/album.rb +++ b/app/models/album.rb @@ -7,7 +7,7 @@ class Album < ActiveRecord::Base before_validation :ensure_path after_create :create_folders - before_destroy :destroy_directory + after_destroy :destroy_folders attr_accessor :tag_list attr_protected :path @@ -80,9 +80,9 @@ class Album < ActiveRecord::Base Dir.mkdir( APP_CONFIG[:thumbs_path] + self.path ) end - def destroy_directory + def destroy_folders #puts "DELETE DIRECTORY " + APP_CONFIG[:photos_path] + self.path Dir.delete( APP_CONFIG[:thumbs_path] + self.path ) if File.exists?( APP_CONFIG[:thumbs_path] + self.path ) - Dir.delete( APP_CONFIG[:photos_path] + self.path + "/" ) if File.exists?( APP_CONFIG[:photos_path] + self.path ) + Dir.delete( APP_CONFIG[:photos_path] + self.path ) if File.exists?( APP_CONFIG[:photos_path] + self.path ) end end diff --git a/app/views/albums/index.html.erb b/app/views/albums/index.html.erb index d8c1536..889f4b7 100644 --- a/app/views/albums/index.html.erb +++ b/app/views/albums/index.html.erb @@ -1,2 +1,5 @@

Albums

-<%= render :partial => @albums %> \ No newline at end of file +<%= render :partial => @albums %> + +
<%= link_to "New Album", new_album_path %> +
<%= link_to "All albums", albums_path %> \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index b1d6eab..11ea262 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -12,6 +12,7 @@ +

<%= flash[:notice] %>

<%= yield %> <%= javascript_include_tag 'jquery-1.3.2.js', 'application' %> diff --git a/app/views/photos/show.html.erb b/app/views/photos/show.html.erb index 0c59af3..797820f 100644 --- a/app/views/photos/show.html.erb +++ b/app/views/photos/show.html.erb @@ -4,9 +4,6 @@
Tagged with: <%= @photo.tag_list %>

<%= @photo.description %>

-<% if @current_user.role.access_to("photo_note") %> -

<%= @photo.note %>

-<% end %>
<%= link_to "Update photo details", edit_photo_path(@photo) %>
<%= link_to "Back to #{@photo.album.title}", @photo.album %>
<%= link_to "All albums", albums_path %> \ No newline at end of file diff --git a/config/environments/cucumber.rb b/config/environments/cucumber.rb index d4f94ff..b1278df 100644 --- a/config/environments/cucumber.rb +++ b/config/environments/cucumber.rb @@ -19,3 +19,6 @@ config.gem "cucumber", :lib => false, :version => ">=0.3.9" config.gem "webrat", :lib => false, :version => ">=0.4.4" config.gem "rspec", :lib => false, :version => ">=1.2.6" config.gem "rspec-rails", :lib => 'spec/rails', :version => ">=1.2.6" +config.gem "thoughtbot-factory_girl", + :lib => "factory_girl", + :source => "http://gems.github.com" \ No newline at end of file diff --git a/config/environments/test.rb b/config/environments/test.rb index 48d4d85..3cae1a7 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -26,8 +26,3 @@ config.action_mailer.delivery_method = :test # This is necessary if your schema can't be completely dumped by the schema dumper, # like if you have constraints or database-specific column types # config.active_record.schema_format = :sql - -config.gem "rspec" -config.gem "rspec-rails" -config.gem "webrat" -config.gem "cucumber" \ No newline at end of file diff --git a/config/settings.yml b/config/settings.yml index 5276db3..c457c46 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -2,8 +2,8 @@ development: site_name: Gallery admin_email: espen@inspired.no site_url: gallery.dev:3000 - photos_path: '/users/Espen/gallery/' - thumbs_path: '/users/Espen/gallery_thumbs/' + photos_path: '/users/Espen/gallery/dev/originals/' + thumbs_path: '/users/Espen/gallery/dev/thumbs/' photos_path_public: '/files/' thumbs_path_public: '/thumbs/' thumb_width: 200 @@ -13,7 +13,7 @@ production: admin_email: espen@inspired.no site_url: photos.inspired.no photos_path: '/home/espen/photos/originals/' - thumbs_path: '/home/espen/photos/modified/' + thumbs_path: '/home/espen/photos/thumbs/' photos_path_public: '/files/' thumbs_path_public: '/thumbs/' thumb_width: 200 @@ -22,8 +22,8 @@ test: site_name: Gallery admin_email: espen@inspired.no site_url: gallery.dev:3000 - photos_path: '/users/Espen/gallery_test/' - thumbs_path: '/users/Espen/gallery_test_thumbs/' + photos_path: '/users/Espen/gallery/test/originals/' + thumbs_path: '/users/Espen/gallery/test/thumbs/' photos_path_public: '/files/' thumbs_path_public: '/thumbs/' thumb_width: 200 diff --git a/features/manage_albums.feature b/features/manage_albums.feature new file mode 100644 index 0000000..69696a2 --- /dev/null +++ b/features/manage_albums.feature @@ -0,0 +1,41 @@ +Feature: Manage Albums + In order to make a gallery + As an contributor + I want to create and manage albums + + Scenario: Albums List + Given the following album records + |title| + |Dizin| + |Tehran| + |Delhi| + When I go to the list of albums + Then I should see "Dizin" + And I should see "Tehran" + And I should see "Delhi" + And I should have 3 albums + Scenario: Collection List + Given I have collections titled "Iran", "India" + And I have albums titled "Dizin", "Tehran" in collection "Iran" + And I have albums titled "Delhi" in collection "India" + When I go to the list of collections + Then I should see "Iran" + And I should see "India" + And I should have 2 collections + And collection "Iran" should have 2 albums + And I should have 3 albums + Scenario: Create Valid Album + Given the following user records + | email | password | + | espen@inspired.no | megmeg | + When I am logged in as "espen@inspired.no" with password "megmeg" + And I am on the list of albums + And I have no albums + When I follow "New Album" + And I fill in "Title" with "Norway" + And I fill in "Description" with "The land of the midnight sun" + And I press "Create" + And I should see "Album created!" + Then I follow "All albums" + And I should see "Norway" + And I should have 1 album \ No newline at end of file diff --git a/features/step_definitions/album_steps.rb b/features/step_definitions/album_steps.rb new file mode 100644 index 0000000..bb7d451 --- /dev/null +++ b/features/step_definitions/album_steps.rb @@ -0,0 +1,26 @@ +Given /i am logged in as a user in the (.*) role/i do |role| + #@user = Factory.create(:user, :name => "Espen Antonsen", + # :email => "espen@inspired.no", + # :password => "megmeg") + #@role = Factory.create(:role, :rolename => role) + #@user.roles << @role + visits "/login" + fills_in("email", :with => "espen@inspired.no") + fills_in("password", :with => "megmeg") + clicks_button("Log in") +end + + +Given /^I have albums titled (.+) in collection (.+)$/ do |titles,collection| + titles.split(', ').each do |title| + CollectionAlbum.create( :collection => Collection.find_by_title(collection), :album => Album.create!(:title => title) ) + end +end + +Given /^I have no albums$/ do + Album.destroy_all +end + +Then /^I should have ([0-9]+) albums?$/ do |count| + Album.count.should == count.to_i +end \ No newline at end of file diff --git a/features/step_definitions/collection_steps.rb b/features/step_definitions/collection_steps.rb new file mode 100644 index 0000000..3da0509 --- /dev/null +++ b/features/step_definitions/collection_steps.rb @@ -0,0 +1,17 @@ +Given /^I have collections titled (.+)$/ do |titles| + titles.split(', ').each do |title| + Collection.create!(:title => title) + end +end + +Given /^I have no collectins$/ do + Collection.destroy_all +end + +Then /^I should have ([0-9]+) collections?$/ do |count| + Collection.count.should == count.to_i +end + +Then /^collection (.+) should have ([0-9]+) albums?$/ do |collection,count| + Collection.find_by_title(collection).albums.count.should == count.to_i +end \ No newline at end of file diff --git a/features/step_definitions/user_steps.rb b/features/step_definitions/user_steps.rb new file mode 100644 index 0000000..d0ddcd8 --- /dev/null +++ b/features/step_definitions/user_steps.rb @@ -0,0 +1,13 @@ +Given /^I am logged in as "([^\"]*)" with password "([^\"]*)"$/ do |email, password| + unless email.blank? + visit login_url + fill_in "Email", :with => email + fill_in "Password", :with => password + click_button "Login" + end +end + +When /^I visit profile for "([^\"]*)"$/ do |email| + user = User.find_by_email!(email) + visit user_url(user) +end \ No newline at end of file diff --git a/features/step_definitions/webrat_steps.rb b/features/step_definitions/webrat_steps.rb index d60a938..7db2c5f 100644 --- a/features/step_definitions/webrat_steps.rb +++ b/features/step_definitions/webrat_steps.rb @@ -1,5 +1,12 @@ require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths")) + +Given /^the following (.+) records?$/ do |factory, table| + table.hashes.each do |hash| + Factory(factory, hash) + end +end + # Commonly used webrat steps # http://github.com/brynary/webrat diff --git a/features/support/clean_folder.rb b/features/support/clean_folder.rb new file mode 100644 index 0000000..c6d8fc9 --- /dev/null +++ b/features/support/clean_folder.rb @@ -0,0 +1,9 @@ +After do +require "find" +Find.find( APP_CONFIG[:photos_path] ) { |path| + Dir.delete( path ) if path != APP_CONFIG[:photos_path] && File.directory?(path) +} +Find.find( APP_CONFIG[:thumbs_path] ) { |path| + Dir.delete( path ) if path != APP_CONFIG[:thumbs_path] && File.directory?(path) +} +end \ No newline at end of file diff --git a/features/support/env.rb b/features/support/env.rb index 54f5ba8..43a1d24 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -8,10 +8,12 @@ Cucumber::Rails.bypass_rescue # Comment out this line if you want Rails own erro # (e.g. rescue_action_in_public / rescue_responses / rescue_from) require 'webrat' - Webrat.configure do |config| config.mode = :rails end -require 'cucumber/rails/rspec' -require 'webrat/core/matchers' +#require 'cucumber/rails/rspec' +#require 'webrat/core/matchers' +#require 'factory_girl' + +require "#{Rails.root}/spec/factories" \ No newline at end of file diff --git a/features/support/paths.rb b/features/support/paths.rb index f2a9232..34b7c93 100644 --- a/features/support/paths.rb +++ b/features/support/paths.rb @@ -10,6 +10,10 @@ module NavigationHelpers when /the homepage/ '/' + when /the list of albums/ + albums_path + when /the list of collections/ + collections_path # Add more mappings here. # Here is a more fancy example: diff --git a/spec/factories.rb b/spec/factories.rb new file mode 100644 index 0000000..7f5cc52 --- /dev/null +++ b/spec/factories.rb @@ -0,0 +1,9 @@ +Factory.define :user do |f| + f.password_confirmation { |u| u.password } +end + +Factory.define :album do |f| +end + +Factory.define :collection do |f| +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/MIT-LICENSE b/vendor/plugins/acts_as_permissible/MIT-LICENSE new file mode 100644 index 0000000..8eaf6db --- /dev/null +++ b/vendor/plugins/acts_as_permissible/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2008 [name of plugin creator] + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/plugins/acts_as_permissible/README b/vendor/plugins/acts_as_permissible/README new file mode 100644 index 0000000..061a979 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/README @@ -0,0 +1,68 @@ +ActsAsPermissible +================= + +Source: +http://github.com/NoamB/acts_as_permissible/tree/master +More information at: +http://github.com/NoamB/acts_as_permissible/wikis + +This plugin enables any activerecord model to have permissions. +It provides a set of methods for querying the model's permissions. +In addition, the plugin can generate roles support, which turns in into a full RBAC (Role Based Access Control) solution. + +Any model which includes the line "acts_as_permissible" can have permissions, and with roles support it can also have roles which in turn have their own permissions. +Roles can also belong to roles, which creates a sort of inheritance hierarchy. +When permissions are calculated, the model's permissions are merged with the model's role permissions (if any), which in turn are merged with the role's roles permissions, until a finite permissions hash is generated. + +In the case of identical keys, a false value overrides a true value, A true value overrides a nil value, and a nil value is false. + +Setup +===== +script/generate permissible [RoleModelName] + +The role model name is optional. If you do not want the roles support generated, use the --skip-roles option. + +examples: script/generate permissible Permission Role + script/generate permissible Permission Group + script/generate permissible Allowance --skip-roles + +use --skip-migration if you don't want a migration created for the permissions model. + +use --rspec to force rspec tests installed (currenty these are the only ones available). + +Add any permissions you want to your permissions table. +Add any roles you want to your roles table. +Add user->role relationships in your roles_memberships table. +Add role->role relationships in your roles_memberships table. + +Usage +===== + + class User < Activerecord::Base + acts_as_permissible + end + +Now a user will have the following methods: + + @user.permissions_hash() # => {:view_something => true, :delete_something => false} + + @user.has_permission?("view_something") # => true + @user.has_permission?("view_something", "delete_something") # => false + @user.has_permission?("delete_something") # => false + @user.has_permission?("create_something") # => false + + @user.permissions_hash() # => {:view_something => true, :delete_something => false} + @user.permissions << Permission.new(:action => "new_thing", :granted => true) + @user.permissions_hash() # => {:view_something => true, :delete_something => false} + @user.reload_permissions!() # => {:view_something => true, :delete_something => false, :new_thing => true} + @user.permissions_hash() # => {:view_something => true, :delete_something => false, :new_thing => true} + # this is useful for getting the hash again into memory after the permissions table was updated. + +And with roles support: + + @user.in_role?("publisher") # => true + @user.in_role?("publisher","advertiser") # => false + @user.in_any_role?("publisher","advertiser") => true + @user.full_permissions_hash() # will return a merged hash of user and roles permissions. + +Copyright (c) 2008 Noam Ben-Ari, released under the MIT license \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/Rakefile b/vendor/plugins/acts_as_permissible/Rakefile new file mode 100644 index 0000000..c03c468 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/Rakefile @@ -0,0 +1,22 @@ +require 'rake' +require 'rake/testtask' +require 'rake/rdoctask' + +desc 'Default: run unit tests.' +task :default => :test + +desc 'Test the acts_as_permissible plugin.' +Rake::TestTask.new(:test) do |t| + t.libs << 'lib' + t.pattern = 'test/**/*_test.rb' + t.verbose = true +end + +desc 'Generate documentation for the acts_as_permissible plugin.' +Rake::RDocTask.new(:rdoc) do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = 'ActsAsPermissible' + rdoc.options << '--line-numbers' << '--inline-source' + rdoc.rdoc_files.include('README') + rdoc.rdoc_files.include('lib/**/*.rb') +end diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/USAGE b/vendor/plugins/acts_as_permissible/generators/permissible/USAGE new file mode 100644 index 0000000..bd6a692 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/USAGE @@ -0,0 +1 @@ +./script/generate permissible [RolesModelName | --skip-roles] [--skip-migrations] [--rspec] \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/permissible_generator.rb b/vendor/plugins/acts_as_permissible/generators/permissible/permissible_generator.rb new file mode 100644 index 0000000..c879f3b --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/permissible_generator.rb @@ -0,0 +1,154 @@ +#require 'acts_as_permissible/rails_commands' +class PermissibleGenerator < Rails::Generator::NamedBase + default_options :skip_migrations => false, :skip_timestamps => false + + attr_reader :role_model_name + attr_reader :role_model_file_name + attr_reader :role_membership_model_name + attr_reader :role_membership_model_file_name + + def initialize(runtime_args, runtime_options = {}) + super + + unless options[:skip_roles] + if @args.first.blank? + puts "No Roles model name supplied! Please use --skip-roles if you do not want roles support generated." + exit() + end + @role_model_name = @args.first + @role_model_file_name = role_model_name.underscore + @role_membership_model_name = role_model_name + "Membership" + @role_membership_model_file_name = role_membership_model_name.underscore + end + + @rspec = has_rspec? + end + + def manifest + recorded_session = record do |m| + m.directory File.join('app/models', class_path) + + if @rspec + m.directory File.join('spec/models', class_path) + m.directory File.join('spec/fixtures', class_path) + # else + # m.directory File.join('test/unit', class_path) + end + + m.template 'model.rb', + File.join('app/models', + class_path, + "#{file_name}.rb") + m.template 'acts_as_permissible.rb', + File.join('lib', + "acts_as_permissible.rb") + # m.template 'initializer.rb', + # File.join('config/initializers', + # "acts_as_permissible_init.rb") + unless options[:skip_roles] + m.template 'role_model.rb', + File.join('app/models', + "#{role_model_file_name}.rb") + m.template 'role_membership_model.rb', + File.join('app/models', + "#{role_membership_model_file_name}.rb") + end + + if @rspec + m.template 'model_spec.rb', + File.join('spec/models', + class_path, + "#{file_name}_spec.rb") + m.template 'fixtures.yml', + File.join('spec/fixtures', + "#{table_name}.yml") + m.template 'acts_as_permissible_spec.rb', + File.join('spec/models', + "acts_as_permissible_spec.rb") + unless options[:skip_roles] + m.template 'role_model_spec.rb', + File.join('spec/models', + "#{role_model_file_name}_spec.rb") + m.template 'role_membership_model_spec.rb', + File.join('spec/models', + "#{role_model_file_name}_membership_spec.rb") + m.template 'role_model_fixtures.yml', + File.join('spec/fixtures', + "#{role_model_file_name.pluralize}.yml") + m.template 'role_membership_model_fixtures.yml', + File.join('spec/fixtures', + "#{role_membership_model_file_name.pluralize}.yml") + end + # else + # m.template 'unit_test.rb', + # File.join('test/unit', + # class_path, + # "#{file_name}_test.rb") + # m.template 'fixtures.yml', + # File.join('test/fixtures', + # "#{table_name}.yml") + end + + unless options[:skip_migrations] + m.migration_template 'migration.rb', 'db/migrate', :assigns => { + :migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}" + }, :migration_file_name => "create_#{file_name.pluralize}" + unless options[:skip_roles] + m.migration_template 'role_migration.rb', 'db/migrate', :assigns => { + :migration_name => "Create#{role_model_name.pluralize.gsub(/::/, '')}" + }, :migration_file_name => "create_#{role_model_file_name.pluralize}" + m.migration_template 'role_membership_migration.rb', 'db/migrate', :assigns => { + :migration_name => "Create#{role_membership_model_name.pluralize.gsub(/::/, '')}" + }, :migration_file_name => "create_#{role_membership_model_file_name.pluralize}" + end + end + end + + action = nil + action = $0.split("/")[1] + case action + when "generate" + puts + puts ("-" * 70) + puts + puts "acts_as_permissible" + puts + puts ("-" * 70) + puts + when "destroy" + puts + puts ("-" * 70) + puts + puts "Thanks for using acts_as_permissible" + puts + puts ("-" * 70) + puts + else + puts + end + + recorded_session + end + + def has_rspec? + options[:rspec] || (File.exist?('spec') && File.directory?('spec')) + end + + protected + def banner + "Usage: #{$0} permissible [RoleModelName]" + end + + def add_options!(opt) + opt.separator '' + opt.separator 'Options:' + opt.on("--skip-roles", + "Don't generate roles support") { |v| options[:skip_roles] = v } + opt.on("--skip-migrations", + "Don't generate migration files for these models") { |v| options[:skip_migrations] = v } + opt.on("--skip-timestamps", + "Don't add timestamps to the migration file for this model") { |v| options[:skip_timestamps] = v } + opt.on("--rspec", + "Force rspec mode (checks for RAILS_ROOT/spec by default)") { |v| options[:rspec] = true } + end +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/acts_as_permissible.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/acts_as_permissible.rb new file mode 100644 index 0000000..c53af14 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/acts_as_permissible.rb @@ -0,0 +1,106 @@ +# ActsAsPermissible +module NoamBenAri + module Acts #:nodoc: + module Permissible #:nodoc: + + def self.included(base) + base.extend ClassMethods + end + + module ClassMethods + def acts_as_permissible + has_many :<%= table_name %>, :as => :permissible, :dependent => :destroy + <% unless options[:skip_roles] %> + has_many :<%= role_membership_model_file_name.pluralize %>, :as => :roleable, :dependent => :destroy + has_many :<%= role_model_file_name.pluralize %>, :through => :<%= role_membership_model_file_name.pluralize %>, :source => :<%= role_model_file_name %> + <% end %> + include NoamBenAri::Acts::Permissible::InstanceMethods + extend NoamBenAri::Acts::Permissible::SingletonMethods + + alias_method :full_permissions_hash, :permissions_hash + end + end + + # This module contains class methods + module SingletonMethods + + # Helper method to lookup for permissions for a given object. + # This method is equivalent to obj.permissions. + def find_permissions_for(obj) + permissible = ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s + + <%= class_name %>.find(:all, + :conditions => ["permissible_id = ? and permissible_type = ?", obj.id, permissible] + ) + end + end + + # This module contains instance methods + module InstanceMethods + + # returns permissions in hash form + # from all levels recursively + def permissions_hash + @permissions_hash ||= lambda do + @permissions_hash = <%= table_name %>.inject({}) { |hsh,perm| hsh.merge(perm.to_hash) }.symbolize_keys! + <% unless options[:skip_roles] -%><%= role_model_file_name %>s.each do |<%= role_model_file_name %>| + merge_permissions!(<%= role_model_file_name %>.permissions_hash) + end + <% end -%>@permissions_hash + end.call() + end + + # accepts a permission identifier string or an array of permission identifier strings + # and return true if the user has all of the permissions given by the parameters + # false if not. + def has_permission?(*perms) + perms.all? {|perm| permissions_hash.include?(perm.to_sym) && (permissions_hash[perm.to_sym] == true) } + end + + # accepts a permission identifier string or an array of permission identifier strings + # and return true if the user has any of the permissions given by the parameters + # false if none. + def has_any_permission?(*perms) + perms.any? {|perm| permissions_hash.include?(perm.to_sym) && (permissions_hash[perm.to_sym] == true) } + end + + # Merges another permissible object's permissions into this permissible's permissions hash + # In the case of identical keys, a false value wins over a true value. + def merge_permissions!(other_permissions_hash) + permissions_hash.merge!(other_permissions_hash) {|key,oldval,newval| oldval.nil? ? newval : oldval && newval} + end + + # Resets permissions and then loads them. + def reload_permissions! + reset_permissions! + permissions_hash + end + <% unless options[:skip_roles] %> + def <%= role_model_file_name %>s_list + list = [] + <%= role_model_file_name %>s.inject(list) do |list,<%= role_model_file_name %>| + list << <%= role_model_file_name %>.name + <%= role_model_file_name %>.<%= role_model_file_name.pluralize %>_list.inject(list) {|list,<%= role_model_file_name %>| list << <%= role_model_file_name %>} + end + list.uniq + end + + def in_<%= role_model_file_name %>?(*<%= role_model_file_name %>_names) + <%= role_model_file_name %>_names.all? {|<%= role_model_file_name %>| <%= role_model_file_name %>s_list.include?(<%= role_model_file_name %>) } + end + + def in_any_<%= role_model_file_name %>?(*<%= role_model_file_name %>_names) + <%= role_model_file_name %>_names.any? {|<%= role_model_file_name %>| <%= role_model_file_name %>s_list.include?(<%= role_model_file_name %>) } + end + + <% end %> + private + # Nilifies permissions_hash instance variable. + def reset_permissions! + @permissions_hash = nil + end + + end + end + end +end diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/acts_as_permissible_spec.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/acts_as_permissible_spec.rb new file mode 100644 index 0000000..46bcb3f --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/acts_as_permissible_spec.rb @@ -0,0 +1,208 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +class <%= class_name %> < ActiveRecord::Base + acts_as_permissible +end + +describe "acts_as_permissible" do + fixtures :<%= table_name %> + + before(:each) do + @perm = <%= table_name %>(:perm) + end + + describe "class methods" do + it "should find_permissions_for(obj) correctly" do + <%= class_name %>.find_permissions_for(@perm).size.should == 2 + <%= class_name %>.find_permissions_for(@perm).first.action.should == "view_something" + <%= class_name %>.find_permissions_for(@perm).last.action.should == "delete_something" + end + end + + describe "permissions_hash" do + it "should return the correct permissions_hash" do + @perm.permissions_hash.should == {:view_something => true, :delete_something => false} + end + end + + describe "has_permission?" do + it "should return true if permission found" do + @perm.has_permission?("view_something").should == true + end + + it "should return false if permission not found" do + @perm.has_permission?("create_something").should == false + end + + it "should return false if permission found and is denied" do + @perm.has_permission?("delete_something").should == false + end + end + + describe "merge_permissions!" do + before(:each) do + @perm2 = <%= table_name %>(:perm2) + @merged_permissions = @perm.merge_permissions!(@perm2.permissions_hash) + # {:update_something=>true, :view_something=>true, :delete_something=>false, :create_something=>false} + end + + it "should include all keys from both hashes" do + @merged_permissions.keys.should == + (@perm.permissions_hash.keys + @perm2.permissions_hash.keys).uniq + end + + it "should override identical keys with false value" do + @merged_permissions[:delete_something].should == false + end + end + + describe "reload_permissions!" do + before(:each) do + @original_hash = @perm.permissions_hash + @perm.<%= table_name %> << <%= class_name %>.new(:action => "add_something", :granted => true) + end + + it "should catch-up with database changes" do + @perm.permissions_hash.should == @original_hash + reloaded_hash = @perm.reload_permissions! + reloaded_hash.should_not == @original_hash + end + + it "should get the changes correctly" do + reloaded_hash = @perm.reload_permissions! + reloaded_hash.keys.should include(:add_something) + end + end + <% unless options[:skip_roles] %> + describe "<%= role_model_file_name.pluralize %>_list" do + before(:each) do + @perm.<%= role_model_file_name.pluralize %>_list.should == [] + @mutables = <%= role_model_name %>.new(:name => "mutables") + @mutables.save! + @wierdos = <%= role_model_name %>.new(:name => "wierdos") + @wierdos.save! + @mutables.<%= role_model_file_name.pluralize %> << @wierdos + end + + after(:each) do + @mutables.destroy + @wierdos.destroy + @perm.<%= role_model_file_name.pluralize %>.reset + @perm.<%= role_model_file_name.pluralize %>_list.should == [] + end + + it "should return the correct list" do + @perm.<%= role_model_file_name.pluralize %> << @wierdos + @perm.<%= role_model_file_name.pluralize %>_list.size.should == 1 + @perm.<%= role_model_file_name.pluralize %>_list.should include("wierdos") + end + + it "should return the correct list including parent <%= role_model_file_name.pluralize %> of <%= role_model_file_name.pluralize %> recursively." do + @perm.<%= role_model_file_name.pluralize %> << @mutables + @perm.<%= role_model_file_name.pluralize %>_list.size.should == 2 + @perm.<%= role_model_file_name.pluralize %>_list.should include("mutables") + @perm.<%= role_model_file_name.pluralize %>_list.should include("wierdos") + end + end + + describe "in_<%= role_model_file_name %>?" do + before(:each) do + @mutables = <%= role_model_name %>.new(:name => "mutables") + @mutables.save! + @immutables = <%= role_model_name %>.new(:name => "immutables") + @immutables.save! + end + + after(:each) do + @mutables.destroy + @immutables.destroy + @perm.<%= role_model_file_name.pluralize %>.reset + end + + it "should return true if member of one" do + @perm.<%= role_model_file_name.pluralize %> << @mutables + @perm.in_<%= role_model_file_name %>?("mutables").should == true + end + + it "should return false if not a member" do + @perm.in_<%= role_model_file_name %>?("mutables").should == false + end + + it "should return true if member of all" do + @perm.<%= role_model_file_name.pluralize %> << @mutables + @perm.<%= role_model_file_name.pluralize %> << @immutables + @perm.in_<%= role_model_file_name %>?("mutables","immutables").should == true + end + + it "should return false if member of some" do + @perm.<%= role_model_file_name.pluralize %> << @mutables + @perm.in_<%= role_model_file_name %>?("mutables","immutables").should == false + end + end + + describe "in_any_<%= role_model_file_name %>?" do + before(:each) do + @mutables = <%= role_model_name %>.new(:name => "mutables") + @mutables.save! + @immutables = <%= role_model_name %>.new(:name => "immutables") + @immutables.save! + end + + it "should return true if member of one" do + @perm.<%= role_model_file_name.pluralize %> << @mutables + @perm.in_any_<%= role_model_file_name %>?("mutables","immutables").should == true + end + + it "should return false if not a member" do + @perm.in_any_<%= role_model_file_name %>?("mutables","immutables").should == false + end + + it "should return true if member of all" do + @perm.<%= role_model_file_name.pluralize %> << @mutables + @perm.<%= role_model_file_name.pluralize %> << @immutables + @perm.in_any_<%= role_model_file_name %>?("mutables","immutables").should == true + end + end + + describe "full_permissions_hash" do + before(:each) do + @mutables = <%= role_model_name %>.new(:name => "mutables") + @mutables.save! + @mutable_permission = <%= class_name %>.new(:permissible_id => @mutables.id, :permissible_type => @mutables.class.to_s, :action => "view_something", :granted => false) + @mutable_permission.save! + @immutables = <%= role_model_name %>.new(:name => "immutables") + @immutables.save! + @immutable_permission = <%= class_name %>.new(:permissible_id => @immutables.id, :permissible_type => @immutables.class.to_s, :action => "download_something", :granted => true) + @immutable_permission.save! + end + + it "should return the correct hash if object doesn't belong to <%= role_model_file_name.pluralize %>" do + @perm.<%= role_model_file_name.pluralize %>.should == [] + @perm.full_permissions_hash.should == {:view_something=>true, :delete_something=>false} + end + + it "should return the correct hash if object belongs to one <%= role_model_file_name %>" do + @perm.<%= role_model_file_name.pluralize %> << @mutables + @perm.full_permissions_hash.should == {:view_something=>false, :delete_something=>false} + end + + it "should return the correct hash if object belongs to one <%= role_model_file_name %> which belongs to another <%= role_model_file_name %>" do + @mutables.<%= role_model_file_name.pluralize %> << @immutables + @perm.<%= role_model_file_name.pluralize %> << @mutables + @perm.full_permissions_hash.should == {:view_something=>false, :delete_something=>false, :download_something=>true} + end + + it "should return the correct hash if object belongs to 2 <%= role_model_file_name.pluralize %>" do + @perm.<%= role_model_file_name.pluralize %> << @immutables + @perm.<%= role_model_file_name.pluralize %> << @mutables + @perm.full_permissions_hash.should == {:view_something=>false, :delete_something=>false, :download_something=>true} + end + + after(:each) do + @mutables.destroy + @immutables.destroy + @perm.<%= role_model_file_name.pluralize %>.reset + end + end + <% end %> +end diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/fixtures.yml b/vendor/plugins/acts_as_permissible/generators/permissible/templates/fixtures.yml new file mode 100644 index 0000000..91b8af4 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/fixtures.yml @@ -0,0 +1,48 @@ +one: + id: 1 + permissible_id: 7 + permissible_type: "<%= class_name %>" + action: "view_something" + granted: 1 +two: + id: 2 + permissible_id: 7 + permissible_type: "<%= class_name %>" + action: "delete_something" + granted: 0 +three: + id: 3 + permissible_id: 8 + permissible_type: "<%= class_name %>" + action: "view_something" + granted: 1 +four: + id: 4 + permissible_id: 8 + permissible_type: "<%= class_name %>" + action: "delete_something" + granted: 1 +five: + id: 5 + permissible_id: 8 + permissible_type: "<%= class_name %>" + action: "update_something" + granted: 1 +six: + id: 6 + permissible_id: 8 + permissible_type: "<%= class_name %>" + action: "create_something" + granted: 0 +perm: + id: 7 + permissible_id: 47 + permissible_type: "User" + action: "non_important" + granted: 1 +perm2: + id: 8 + permissible_id: 48 + permissible_type: "User" + action: "non_important" + granted: 1 \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/initializer.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/initializer.rb new file mode 100644 index 0000000..45e3480 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/initializer.rb @@ -0,0 +1,2 @@ +require 'lib/acts_as_permissible' +ActiveRecord::Base.send(:include, NoamBenAri::Acts::Permissible) \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/migration.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/migration.rb new file mode 100644 index 0000000..b7e798c --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/migration.rb @@ -0,0 +1,16 @@ +class <%= migration_name %> < ActiveRecord::Migration + def self.up + create_table "<%= table_name %>", :force => true do |t| + t.integer :permissible_id + t.string :permissible_type + t.string :action + t.boolean :granted + + <% unless options[:skip_timestamps] %>t.timestamps<% end %> + end + end + + def self.down + drop_table "<%= table_name %>" + end +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/model.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/model.rb new file mode 100644 index 0000000..e7f841c --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/model.rb @@ -0,0 +1,19 @@ +class <%= class_name %> < ActiveRecord::Base + # uncomment any of the following lines which is relevant to your application, + # or create your own with the name of the model which acts_as_permissible. + #belongs_to :user + <% unless options[:skip_roles] %> + belongs_to :<%= role_model_file_name %> + <% end %> + belongs_to :permissible, :polymorphic => true + + validates_presence_of :permissible_id, :permissible_type, :action + validates_format_of :action, :with => /^[a-z_]+$/ + validates_numericality_of :permissible_id + validates_uniqueness_of :action, :scope => [:permissible_id,:permissible_type] + + def to_hash + self.new_record? ? {} : {self.action => self.granted} + end + +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/model_spec.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/model_spec.rb new file mode 100644 index 0000000..03853f5 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/model_spec.rb @@ -0,0 +1,51 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe <%= class_name %>, "to_hash" do + before(:each) do + @permission = <%= class_name %>.new(:permissible_id => 1, :permissible_type => "User", :action => "some_action", :granted => 1) + end + + it "to_hash returns {} if new record" do + @permission.to_hash.should == {} + end + + it "to_hash returns {action => granted}" do + @permission.save + @permission.to_hash.should == {"some_action" => true} + end + +end + +describe <%= class_name %>, "validations" do + before(:each) do + @permission = <%= class_name %>.new(:permissible_id => 1, :permissible_type => "User", :action => "some_action", :granted => 1) + end + + it "should be valid" do + @permission.should be_valid + end + + it "action should be unique to a permissible id and type" do + @permission.save + @permission2 = <%= class_name %>.new(:permissible_id => 1, :permissible_type => "User", :action => "some_action", :granted => 0) + @permission2.should_not be_valid + end + + it "must have a permissible_id" do + @permission.permissible_id = nil + @permission.should_not be_valid + end + + it "must have a permissible_type" do + @permission.permissible_type = nil + @permission.should_not be_valid + end + + it "must have an action" do + @permission.action = nil + @permission.should_not be_valid + @permission.action = "" + @permission.should_not be_valid + end + +end diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_migration.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_migration.rb new file mode 100644 index 0000000..b2239ec --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_migration.rb @@ -0,0 +1,15 @@ +class <%= migration_name %> < ActiveRecord::Migration + def self.up + create_table :<%= role_membership_model_file_name %>s do |t| + t.integer :roleable_id + t.string :roleable_type + t.integer :<%= role_model_file_name %>_id + + <% unless options[:skip_timestamps] %>t.timestamps<% end %> + end + end + + def self.down + drop_table :<%= role_membership_model_file_name %>s + end +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model.rb new file mode 100644 index 0000000..e16a0d9 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model.rb @@ -0,0 +1,36 @@ +class <%= role_membership_model_name %> < ActiveRecord::Base + #belongs_to :user + belongs_to :<%= role_model_file_name %> + belongs_to :roleable, :polymorphic => true + + validates_presence_of :roleable_id, :roleable_type, :<%= role_model_file_name %>_id + validates_uniqueness_of :<%= role_model_file_name %>_id, :scope => [:roleable_id, :roleable_type] + validates_numericality_of :roleable_id, :<%= role_model_file_name %>_id + validates_format_of :roleable_type, :with => /^[A-Z]{1}[a-z0-9]+([A-Z]{1}[a-z0-9]+)*$/ + validate :<%= role_model_file_name %>_does_not_belong_to_itself_in_a_loop + + protected + def <%= role_model_file_name %>_does_not_belong_to_itself_in_a_loop + if roleable_type == "<%= role_model_name %>" + if <%= role_model_file_name %>_id == roleable_id + errors.add_to_base("A <%= role_model_file_name %> cannot belong to itself.") + else + if belongs_to_itself_through_other?(roleable_id, <%= role_model_file_name %>_id) + errors.add_to_base("A <%= role_model_file_name %> cannot belong to a <%= role_model_file_name %> which belongs to it.") + end + end + end + end + + def belongs_to_itself_through_other?(original_roleable_id, current_<%= role_model_file_name %>_id) + if self.class.find(:first, :select => "id", :conditions => ["roleable_id=? AND roleable_type='<%= role_model_name %>' AND <%= role_model_file_name %>_id=?",current_<%= role_model_file_name %>_id,original_roleable_id]) + return true + else + memberships = self.class.find(:all, :select => "<%= role_model_file_name %>_id", :conditions => ["roleable_id=? AND roleable_type='<%= role_model_name %>'",current_<%= role_model_file_name %>_id]) + if memberships.any? {|membership| belongs_to_itself_through_other?(original_roleable_id,membership.<%= role_model_file_name %>_id)} + return true + end + end + return false + end +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model_fixtures.yml b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model_fixtures.yml new file mode 100644 index 0000000..e9b1b31 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model_fixtures.yml @@ -0,0 +1,25 @@ +publishers_to_customers: + id: 1 + roleable_id: 1 + roleable_type: "<%= role_model_name %>" + <%= role_model_file_name %>_id: 3 +advertisers_to_customers: + id: 2 + roleable_id: 2 + roleable_type: "<%= role_model_name %>" + <%= role_model_file_name %>_id: 3 +admins_to_company: + id: 3 + roleable_id: 5 + roleable_type: "<%= role_model_name %>" + <%= role_model_file_name %>_id: 4 +company_to_admins: + id: 4 + roleable_id: 4 + roleable_type: "<%= role_model_name %>" + <%= role_model_file_name %>_id: 5 +publishers_to_company: + id: 5 + roleable_id: 1 + roleable_type: "<%= role_model_name %>" + <%= role_model_file_name %>_id: 4 \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model_spec.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model_spec.rb new file mode 100644 index 0000000..779217f --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model_spec.rb @@ -0,0 +1,100 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe "<%= role_membership_model_name %>" do + + describe "validations" do + before(:all) do + @<%= role_model_file_name.pluralize %> = [] + @<%= role_model_file_name.pluralize %>[0] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>0") + @<%= role_model_file_name.pluralize %>[1] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>1") + @<%= role_model_file_name.pluralize %>[2] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>2") + @<%= role_model_file_name.pluralize %>[3] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>3") + @<%= role_model_file_name.pluralize %>[4] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>4") + @<%= role_model_file_name.pluralize %>[5] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>5") + @<%= role_model_file_name.pluralize %>[6] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>6") + @<%= role_model_file_name.pluralize %>[7] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>7") + @<%= role_model_file_name.pluralize %>[8] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>8") + @<%= role_model_file_name.pluralize %>[9] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>9") + @<%= role_model_file_name.pluralize %>[10] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>10") + @<%= role_model_file_name.pluralize %>[11] = <%= role_model_name %>.new(:name => "<%= role_model_file_name %>11") + @<%= role_model_file_name.pluralize %>.each {|<%= role_model_file_name %>| <%= role_model_file_name %>.save!} + end + + before(:each) do + @membership = <%= role_membership_model_name %>.new(:roleable_id => @<%= role_model_file_name.pluralize %>[0].id, :roleable_type => "<%= role_model_name %>", :<%= role_model_file_name %>_id => @<%= role_model_file_name.pluralize %>[1].id) + end + + it "should be valid" do + @membership.should be_valid + end + + # roleable_id + it "should have a roleable_id" do + @membership.roleable_id = nil + @membership.should_not be_valid + end + + it "roleable_id should be an integer" do + @membership.roleable_id = "asd" + @membership.should_not be_valid + end + + # roleable_type + it "should have a roleable_type" do + @membership.roleable_type = nil + @membership.should_not be_valid + end + + it "roleable_type should be a string" do + @membership.roleable_type = 123 + @membership.should_not be_valid + end + + it "roleable_type should have a class name format" do + @membership.roleable_type = "asd" + @membership.should_not be_valid + @membership.roleable_type = "User" + @membership.should be_valid + @membership.roleable_type = "Some95WierdClassN4m3" + @membership.should be_valid + end + + # <%= role_model_file_name %>_id + it "should have a <%= role_model_file_name %>_id" do + @membership.<%= role_model_file_name %>_id = nil + @membership.should_not be_valid + end + + it "<%= role_model_file_name %>_id should be an integer" do + @membership.<%= role_model_file_name %>_id = "asd" + @membership.should_not be_valid + end + + it "should not allow a <%= role_model_file_name %> to belong to itself" do + @membership.<%= role_model_file_name %>_id = @<%= role_model_file_name.pluralize %>[0].id + @membership.should_not be_valid + end + + # <%= role_model_file_name.pluralize %> cannot belong to each other in a loop + it "should not a allow a <%= role_model_file_name %> to belong to a <%= role_model_file_name %> which belongs to it in a loop" do + @<%= role_model_file_name.pluralize %>[0].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[1] + @<%= role_model_file_name.pluralize %>[1].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[2] + @<%= role_model_file_name.pluralize %>[2].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[3] + @<%= role_model_file_name.pluralize %>[2].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[4] + @<%= role_model_file_name.pluralize %>[2].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[5] + @<%= role_model_file_name.pluralize %>[3].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[6] + @<%= role_model_file_name.pluralize %>[1].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[7] + @<%= role_model_file_name.pluralize %>[3].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[8] + @<%= role_model_file_name.pluralize %>[4].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[9] + @<%= role_model_file_name.pluralize %>[4].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[10] + @<%= role_model_file_name.pluralize %>[5].<%= role_model_file_name.pluralize %> << @<%= role_model_file_name.pluralize %>[11] + @membership3 = <%= role_membership_model_name %>.new(:roleable_id => @<%= role_model_file_name.pluralize %>[11].id, :roleable_type => "<%= role_model_name %>", :<%= role_model_file_name %>_id => @<%= role_model_file_name.pluralize %>[0].id) + @membership3.should_not be_valid + @membership3.errors.full_messages.should include("A <%= role_model_file_name %> cannot belong to a <%= role_model_file_name %> which belongs to it.") + end + + after(:all) do + @<%= role_model_file_name.pluralize %>.each {|<%= role_model_file_name %>| <%= role_model_file_name %>.destroy} + end + end +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_migration.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_migration.rb new file mode 100644 index 0000000..51a521c --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_migration.rb @@ -0,0 +1,13 @@ +class <%= migration_name %> < ActiveRecord::Migration + def self.up + create_table :<%= role_model_file_name %>s do |t| + t.string :name + + <% unless options[:skip_timestamps] %>t.timestamps<% end %> + end + end + + def self.down + drop_table :<%= role_model_file_name %>s + end +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model.rb new file mode 100644 index 0000000..80ebade --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model.rb @@ -0,0 +1,12 @@ +class <%= role_model_name %> < ActiveRecord::Base + has_many :<%= role_membership_model_file_name %>s, :as => :roleable, :dependent => :destroy + has_many :<%= role_model_file_name %>s, :through => :<%= role_membership_model_file_name %>s, :source => :<%= role_model_file_name %> + + has_many :roleables, :class_name => "<%= role_membership_model_name %>", :foreign_key => "<%= role_model_file_name %>_id", :dependent => :destroy + has_many :sub<%= role_model_file_name %>s, :through => :roleables, :source => :roleable, :source_type => '<%= role_model_name %>' + #has_many :users, :through => :roleables, :source => :roleable, :source_type => 'User' + + validates_uniqueness_of :name + + acts_as_permissible +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model_fixtures.yml b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model_fixtures.yml new file mode 100644 index 0000000..36843a3 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model_fixtures.yml @@ -0,0 +1,15 @@ +publishers: + id: 1 + name: "Publishers" +advertisers: + id: 2 + name: "Advertisers" +customers: + id: 3 + name: "Customers" +company: + id: 4 + name: "Company" +admins: + id: 5 + name: "Admins" \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model_spec.rb b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model_spec.rb new file mode 100644 index 0000000..4ea2f1d --- /dev/null +++ b/vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model_spec.rb @@ -0,0 +1,53 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe "<%= role_model_name %>" do + + describe "validations" do + before(:each) do + @<%= role_model_file_name %> = <%= role_model_name %>.new(:name => "Hunters") + end + + it "should be valid" do + @<%= role_model_file_name %>.should be_valid + end + + it "should have a unique name" do + @<%= role_model_file_name %>.save + @<%= role_model_file_name %>2 = <%= role_model_name %>.new(:name => "Hunters") + @<%= role_model_file_name %>2.should_not be_valid + end + end + + describe "associations" do + fixtures :<%= role_model_file_name %>s, :<%= role_membership_model_file_name %>s + + it "should get subgroups correctly" do + <%= role_model_file_name %>s(:company).sub<%= role_model_file_name %>s.size.should == 2 + arr = [] + arr << <%= role_model_file_name %>s(:publishers) + arr << <%= role_model_file_name %>s(:admins) + <%= role_model_file_name %>s(:company).sub<%= role_model_file_name %>s.should include(arr.first) + <%= role_model_file_name %>s(:company).sub<%= role_model_file_name %>s.should include(arr.last) + + <%= role_model_file_name %>s(:customers).sub<%= role_model_file_name %>s.size.should == 2 + arr = [] + arr << <%= role_model_file_name %>s(:publishers) + arr << <%= role_model_file_name %>s(:advertisers) + <%= role_model_file_name %>s(:customers).sub<%= role_model_file_name %>s.should include(arr.first) + <%= role_model_file_name %>s(:customers).sub<%= role_model_file_name %>s.should include(arr.last) + end + + it "should get <%= role_model_file_name %>s correctly" do + <%= role_model_file_name %>s(:publishers).<%= role_model_file_name %>s.size.should == 2 + arr = [] + arr << <%= role_model_file_name %>s(:customers) + arr << <%= role_model_file_name %>s(:company) + <%= role_model_file_name %>s(:publishers).<%= role_model_file_name %>s.should == arr + + <%= role_model_file_name %>s(:admins).<%= role_model_file_name %>s.size.should == 1 + arr = [] + arr << <%= role_model_file_name %>s(:company) + <%= role_model_file_name %>s(:admins).<%= role_model_file_name %>s.should == arr + end + end +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/init.rb b/vendor/plugins/acts_as_permissible/init.rb new file mode 100644 index 0000000..d16526e --- /dev/null +++ b/vendor/plugins/acts_as_permissible/init.rb @@ -0,0 +1,7 @@ +# Include hook code here +begin + require "#{RAILS_ROOT}/lib/acts_as_permissible" + ActiveRecord::Base.send(:include, NoamBenAri::Acts::Permissible) +rescue MissingSourceFile => m + +end \ No newline at end of file diff --git a/vendor/plugins/acts_as_permissible/install.rb b/vendor/plugins/acts_as_permissible/install.rb new file mode 100644 index 0000000..bd23f1b --- /dev/null +++ b/vendor/plugins/acts_as_permissible/install.rb @@ -0,0 +1 @@ +puts IO.read(File.join(File.dirname(__FILE__), 'README')) diff --git a/vendor/plugins/acts_as_permissible/lib/.gitignore b/vendor/plugins/acts_as_permissible/lib/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/vendor/plugins/acts_as_permissible/tasks/acts_as_permissible_tasks.rake b/vendor/plugins/acts_as_permissible/tasks/acts_as_permissible_tasks.rake new file mode 100644 index 0000000..525689c --- /dev/null +++ b/vendor/plugins/acts_as_permissible/tasks/acts_as_permissible_tasks.rake @@ -0,0 +1,4 @@ +# desc "Explaining what the task does" +# task :acts_as_permissible do +# # Task goes here +# end diff --git a/vendor/plugins/acts_as_permissible/test/acts_as_permissible_test.rb b/vendor/plugins/acts_as_permissible/test/acts_as_permissible_test.rb new file mode 100644 index 0000000..0099037 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/test/acts_as_permissible_test.rb @@ -0,0 +1,8 @@ +require 'test/unit' + +class ActsAsPermissibleTest < Test::Unit::TestCase + # Replace this with your real tests. + def test_this_plugin + flunk + end +end diff --git a/vendor/plugins/acts_as_permissible/uninstall.rb b/vendor/plugins/acts_as_permissible/uninstall.rb new file mode 100644 index 0000000..9738333 --- /dev/null +++ b/vendor/plugins/acts_as_permissible/uninstall.rb @@ -0,0 +1 @@ +# Uninstall hook code here