inkling 0.0.3a
Sign up to get free protection for your applications and to get access to all the features.
- data/README.txt +194 -0
- data/app/controllers/inkling/admin/base_controller.rb +5 -0
- data/app/controllers/inkling/admin/content_types_controller.rb +4 -0
- data/app/controllers/inkling/admin/permissions_controller.rb +4 -0
- data/app/controllers/inkling/admin/roles_controller.rb +4 -0
- data/app/controllers/inkling/admin/users_controller.rb +4 -0
- data/app/controllers/inkling/base_controller.rb +9 -0
- data/app/controllers/inkling/content_controller.rb +6 -0
- data/app/controllers/inkling/home_controller.rb +44 -0
- data/app/controllers/inkling/paths_controller.rb +31 -0
- data/app/controllers/inkling/proxying_controller.rb +19 -0
- data/app/controllers/inkling/themes_controller.rb +4 -0
- data/app/controllers/inkling/users/confirmations_controller.rb +3 -0
- data/app/controllers/inkling/users/passwords_controller.rb +1 -0
- data/app/controllers/inkling/users/sessions_controller.rb +5 -0
- data/app/models/inkling/can_can_action.rb +5 -0
- data/app/models/inkling/log.rb +3 -0
- data/app/models/inkling/path.rb +54 -0
- data/app/models/inkling/permission.rb +7 -0
- data/app/models/inkling/role.rb +10 -0
- data/app/models/inkling/role_membership.rb +8 -0
- data/app/models/inkling/theme.rb +74 -0
- data/app/models/inkling/type.rb +4 -0
- data/app/models/inkling/user.rb +16 -0
- data/app/views/inkling/admin/permissions/_form.html.erb +15 -0
- data/app/views/inkling/admin/permissions/edit.html.erb +1 -0
- data/app/views/inkling/admin/permissions/index.html.erb +26 -0
- data/app/views/inkling/admin/permissions/new.html.erb +1 -0
- data/app/views/inkling/admin/permissions/show.html.erb +11 -0
- data/app/views/inkling/admin/roles/index.html.erb +3 -0
- data/app/views/inkling/admin/sites/index.html.erb +1 -0
- data/app/views/inkling/admin/types/index.html.erb +12 -0
- data/app/views/inkling/admin/users/_form.html.erb +16 -0
- data/app/views/inkling/admin/users/edit.html.erb +1 -0
- data/app/views/inkling/admin/users/index.html.erb +18 -0
- data/app/views/inkling/admin/users/new.html.erb +1 -0
- data/app/views/inkling/admin/users/show.html.erb +11 -0
- data/app/views/inkling/home/_dashboard.html.erb +29 -0
- data/app/views/inkling/home/dashboard.html.erb +13 -0
- data/app/views/inkling/paths/_content_form.html.erb +7 -0
- data/app/views/inkling/paths/_path.html.erb +17 -0
- data/app/views/inkling/paths/index.html.erb +14 -0
- data/app/views/inkling/paths/update_tree.js.erb +2 -0
- data/app/views/inkling/themes/_form.html.erb +17 -0
- data/app/views/inkling/themes/edit.html.erb +1 -0
- data/app/views/inkling/themes/index.html.erb +11 -0
- data/app/views/inkling/themes/new.html.erb +1 -0
- data/app/views/inkling/themes/show.html.erb +1 -0
- data/app/views/inkling/users/confirmations/new.html.erb +12 -0
- data/app/views/inkling/users/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/inkling/users/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/inkling/users/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/inkling/users/passwords/edit.html.erb +16 -0
- data/app/views/inkling/users/passwords/new.html.erb +12 -0
- data/app/views/inkling/users/registrations/edit.html.erb +25 -0
- data/app/views/inkling/users/registrations/new.html.erb +18 -0
- data/app/views/inkling/users/sessions/new.html.erb +17 -0
- data/app/views/inkling/users/shared/_links.erb +19 -0
- data/app/views/inkling/users/unlocks/new.html.erb +12 -0
- data/app/views/layouts/inkling/admin.html.erb +43 -0
- data/app/views/layouts/inkling/manage.html.erb +43 -0
- data/bin/inkling +3 -0
- data/config/initializers/init.rb +4 -0
- data/config/initializers/rspec_generator.rb +6 -0
- data/config/routes.rb +18 -0
- data/lib/generators/inkling_generator.rb +19 -0
- data/lib/generators/templates/create_inkling_tables.rb +73 -0
- data/lib/inkling/ability.rb +21 -0
- data/lib/inkling/commands/generator.rb +66 -0
- data/lib/inkling/commands.rb +12 -0
- data/lib/inkling/engine.rb +35 -0
- data/lib/inkling/routing.rb +26 -0
- data/lib/inkling/slugs.rb +17 -0
- data/lib/inkling/types.rb +61 -0
- data/lib/inkling/util/migration_helpers.rb +22 -0
- data/lib/inkling/version.rb +3 -0
- data/lib/inkling.rb +3 -0
- data/lib/tasks/cucumber.rake +53 -0
- data/lib/tasks/inkling.rake +48 -0
- data/lib/tasks/rspec.rake +68 -0
- data/spec/controllers/inkling/proxying_spec.rb +9 -0
- data/spec/models/path_spec.rb +13 -0
- data/spec/models/permission_spec.rb +29 -0
- data/spec/models/theme_spec.rb +66 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/support/devise.rb +3 -0
- data/spec/support/inkling_spec_helper.rb +1 -0
- metadata +222 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
require "inkling"
|
2
|
+
require "inkling/types"
|
3
|
+
require "inkling/version"
|
4
|
+
require "inkling/slugs"
|
5
|
+
require "inkling/routing"
|
6
|
+
require 'cancan'
|
7
|
+
require "inkling/ability"
|
8
|
+
require "devise"
|
9
|
+
require 'devise/orm/active_record'
|
10
|
+
|
11
|
+
require "rails"
|
12
|
+
|
13
|
+
module Inkling
|
14
|
+
TMP_DIR = "tmp/inkling/"
|
15
|
+
THEMES_DIR = "#{TMP_DIR}themes/"
|
16
|
+
THEME_LAYOUTS_DIR = "#{THEMES_DIR}layouts/"
|
17
|
+
BOOTSTRAP_TASKS = []
|
18
|
+
|
19
|
+
class Engine < Rails::Engine
|
20
|
+
config.inkling = Inkling
|
21
|
+
|
22
|
+
initializer "static assets" do |app|
|
23
|
+
app.middleware.insert_after ::ActionDispatch::Static, ::ActionDispatch::Static, "#{root}/public"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
WELCOME_MSG = <<-MSG
|
28
|
+
|
29
|
+
Welcome!
|
30
|
+
Inkling was bootstrapped at #{Time.now}.
|
31
|
+
Start the server ('rails server') then visit http://localhost:3000/inkling/users/sign_in.
|
32
|
+
Use the default admin account admin@localhost.com/test123.
|
33
|
+
|
34
|
+
MSG
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'ruby-debug'
|
2
|
+
module Inkling
|
3
|
+
module Routing
|
4
|
+
class TypeConstraint
|
5
|
+
attr_accessor :type
|
6
|
+
|
7
|
+
def initialize(type, prefix = nil)
|
8
|
+
@type = type
|
9
|
+
@prefix = prefix
|
10
|
+
end
|
11
|
+
|
12
|
+
def matches?(request)
|
13
|
+
path = @prefix.nil? ? request.path : request.path.gsub(@prefix, "")
|
14
|
+
matching_path = Inkling::Path.find_by_slug(path)
|
15
|
+
|
16
|
+
if matching_path
|
17
|
+
result = matching_path.content.is_a? @type.constantize
|
18
|
+
request.params[:id] = matching_path.content.id
|
19
|
+
result
|
20
|
+
else
|
21
|
+
false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Inkling
|
2
|
+
module Slugs
|
3
|
+
#copied from enki see http://www.enkiblog.com/
|
4
|
+
def sluggerize(slug)
|
5
|
+
text = slug.dup
|
6
|
+
text.downcase!
|
7
|
+
text.gsub!(/&(\d)+;/, '') # Ditch Entities
|
8
|
+
text.gsub!('&', 'and') # Replace & with 'and'
|
9
|
+
text.gsub!(/['"]/, '') # replace quotes by nothing
|
10
|
+
text.gsub!(/\ +/, '-') # replace all white space sections with a dash
|
11
|
+
text.gsub!(/(-)$/, '') # trim dashes
|
12
|
+
text.gsub!(/^(-)/, '') # trim dashes
|
13
|
+
text.gsub!(/[^\/a-zA-Z0-9\-]/, '-') # Get rid of anything we don't like
|
14
|
+
text
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Inkling
|
2
|
+
module Types
|
3
|
+
module ActsAs
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def acts_as_inkling(friendly_name = self.class.name)
|
10
|
+
|
11
|
+
Inkling::Types::Register.register(self)
|
12
|
+
cattr_accessor :friendly_name
|
13
|
+
self.friendly_name = (friendly_name or self)
|
14
|
+
has_one :path, :as => :content, :dependent => :destroy, :class_name => "Inkling::Path"
|
15
|
+
after_create :create_path
|
16
|
+
after_update :update_path
|
17
|
+
|
18
|
+
send :include, InstanceMethods
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module InstanceMethods
|
24
|
+
#Creates a path to represent the ContentType instance; the path is used for routing, etc..
|
25
|
+
def create_path
|
26
|
+
path = Inkling::Path.new
|
27
|
+
path.content = self
|
28
|
+
path.save!
|
29
|
+
end
|
30
|
+
|
31
|
+
def update_path
|
32
|
+
self.path.update_slug!
|
33
|
+
self.path.save!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class Register
|
38
|
+
def self.listed
|
39
|
+
@listed ||= []
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.keys
|
43
|
+
@keys ||= []
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.register(type)
|
47
|
+
if keys.include?(type.name)
|
48
|
+
flush!
|
49
|
+
end
|
50
|
+
|
51
|
+
keys << type.name
|
52
|
+
listed << type unless listed.index(type)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.flush!
|
56
|
+
@keys = []
|
57
|
+
@listed = []
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Inkling
|
2
|
+
module Util
|
3
|
+
module MigrationHelpers
|
4
|
+
def add_foreign_key(from_table, from_column, to_table)
|
5
|
+
constraint_name = "fk_#{from_table}_#{from_column}"
|
6
|
+
|
7
|
+
execute %{alter table #{from_table}
|
8
|
+
add constraint #{constraint_name}
|
9
|
+
foreign key (#{from_column})
|
10
|
+
references #{to_table}(id)}
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def remove_foreign_key(from_table, from_column)
|
15
|
+
constraint_name = "fk_#{from_table}_#{from_column}"
|
16
|
+
|
17
|
+
execute %{alter table #{from_table}
|
18
|
+
drop foreign key #{constraint_name}}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/inkling.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
|
2
|
+
# It is recommended to regenerate this file in the future when you upgrade to a
|
3
|
+
# newer version of cucumber-rails. Consider adding your own code to a new file
|
4
|
+
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
|
5
|
+
# files.
|
6
|
+
|
7
|
+
|
8
|
+
unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks
|
9
|
+
|
10
|
+
vendored_cucumber_bin = Dir["#{Rails.root}/vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
|
11
|
+
$LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + '/../lib') unless vendored_cucumber_bin.nil?
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'cucumber/rake/task'
|
15
|
+
|
16
|
+
namespace :cucumber do
|
17
|
+
Cucumber::Rake::Task.new({:ok => 'db:test:prepare'}, 'Run features that should pass') do |t|
|
18
|
+
t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
|
19
|
+
t.fork = true # You may get faster startup if you set this to false
|
20
|
+
t.profile = 'default'
|
21
|
+
end
|
22
|
+
|
23
|
+
Cucumber::Rake::Task.new({:wip => 'db:test:prepare'}, 'Run features that are being worked on') do |t|
|
24
|
+
t.binary = vendored_cucumber_bin
|
25
|
+
t.fork = true # You may get faster startup if you set this to false
|
26
|
+
t.profile = 'wip'
|
27
|
+
end
|
28
|
+
|
29
|
+
Cucumber::Rake::Task.new({:rerun => 'db:test:prepare'}, 'Record failing features and run only them if any exist') do |t|
|
30
|
+
t.binary = vendored_cucumber_bin
|
31
|
+
t.fork = true # You may get faster startup if you set this to false
|
32
|
+
t.profile = 'rerun'
|
33
|
+
end
|
34
|
+
|
35
|
+
desc 'Run all features'
|
36
|
+
task :all => [:ok, :wip]
|
37
|
+
end
|
38
|
+
desc 'Alias for cucumber:ok'
|
39
|
+
task :cucumber => 'cucumber:ok'
|
40
|
+
|
41
|
+
task :default => :cucumber
|
42
|
+
|
43
|
+
task :features => :cucumber do
|
44
|
+
STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
|
45
|
+
end
|
46
|
+
rescue LoadError
|
47
|
+
desc 'cucumber rake task not available (cucumber not installed)'
|
48
|
+
task :cucumber do
|
49
|
+
abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
namespace :inkling do
|
2
|
+
|
3
|
+
desc "Boostraps (calls generators, creates databases, runs migrations, seeds the database) Inkling"
|
4
|
+
task :bootstrap => ["environment", "inkling:generate", "inkling:run_bootstrap_tasks", "db:create", "db:migrate", "inkling:init", "inkling:welcome_msg"]
|
5
|
+
|
6
|
+
desc "Wipes migrations dir Hard reset (caveat raker), then bootstrap. Destroys db, recreates it, regenerates all migrations, migrates, and initializes with inkling data"
|
7
|
+
task :rebuild => ["environment", "inkling:destroy_migrations", "db:drop", "inkling:bootstrap"]
|
8
|
+
|
9
|
+
|
10
|
+
desc "Runs system('rm -rf db/migrate/*')"
|
11
|
+
task :destroy_migrations do
|
12
|
+
system("rm -rf db/migrate/*")
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
desc "Runs system('rails generate inkling')"
|
17
|
+
task :generate do
|
18
|
+
system("rails generate inkling")
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Iterates through array Inkling::REBUILD_TASKS and executes each task it finds (useful to add your bootstrap sequence to inkling:rebuild)"
|
22
|
+
task :run_bootstrap_tasks do
|
23
|
+
for task in Inkling::BOOTSTRAP_TASKS
|
24
|
+
Rake::Task[task].execute
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Create a default user with login 'admin' and password 'admin'"
|
29
|
+
task :default_admin => [:environment] do
|
30
|
+
user = Inkling::User.create!(:email => "admin@localhost.com", :password => "test123", :password_confirmation => "test123")
|
31
|
+
Inkling::RoleMembership.create!(:user => user, :role => Inkling::Role.find_by_name(Inkling::Role::ADMIN))
|
32
|
+
puts "Inkling> Created default administrator: login - 'admin@localhost.com', password - 'test123'."
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "Initializes inkling data."
|
36
|
+
task :init => [:environment] do
|
37
|
+
Inkling::Role.create!(:name => Inkling::Role::ADMIN)
|
38
|
+
Rake::Task["inkling:default_admin"].execute
|
39
|
+
puts "Inkling> Created administrator role."
|
40
|
+
end
|
41
|
+
|
42
|
+
task :welcome_msg do
|
43
|
+
puts Inkling::WELCOME_MSG
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "Runs specs and cukes."
|
47
|
+
task :megatest => [:environment, :spec, :cucumber]
|
48
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/core'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
rescue MissingSourceFile
|
5
|
+
module Rspec
|
6
|
+
module Core
|
7
|
+
class RakeTask
|
8
|
+
def initialize(name)
|
9
|
+
task name do
|
10
|
+
# if rspec-rails is a configured gem, this will output helpful material and exit ...
|
11
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../config/environment")
|
12
|
+
|
13
|
+
# ... otherwise, do this:
|
14
|
+
raise <<-MSG
|
15
|
+
|
16
|
+
#{"*" * 80}
|
17
|
+
* You are trying to run an rspec rake task defined in
|
18
|
+
* #{__FILE__},
|
19
|
+
* but rspec can not be found in vendor/gems, vendor/plugins or system gems.
|
20
|
+
#{"*" * 80}
|
21
|
+
MSG
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Rake.application.instance_variable_get('@tasks').delete('default')
|
30
|
+
|
31
|
+
spec_prereq = Rails.root.join('config', 'database.yml').exist? ? "db:test:prepare" : :noop
|
32
|
+
task :noop do
|
33
|
+
end
|
34
|
+
|
35
|
+
task :default => :spec
|
36
|
+
task :stats => "spec:statsetup"
|
37
|
+
|
38
|
+
desc "Run all specs in spec directory (excluding plugin specs)"
|
39
|
+
Rspec::Core::RakeTask.new(:spec => spec_prereq)
|
40
|
+
|
41
|
+
namespace :spec do
|
42
|
+
[:requests, :models, :controllers, :views, :helpers, :mailers, :lib].each do |sub|
|
43
|
+
desc "Run the code examples in spec/#{sub}"
|
44
|
+
Rspec::Core::RakeTask.new(sub => spec_prereq) do |t|
|
45
|
+
t.pattern = "./spec/#{sub}/**/*_spec.rb"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
task :statsetup do
|
50
|
+
require 'rails/code_statistics'
|
51
|
+
::STATS_DIRECTORIES << %w(Model\ specs spec/models) if File.exist?('spec/models')
|
52
|
+
::STATS_DIRECTORIES << %w(View\ specs spec/views) if File.exist?('spec/views')
|
53
|
+
::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers) if File.exist?('spec/controllers')
|
54
|
+
::STATS_DIRECTORIES << %w(Helper\ specs spec/helpers) if File.exist?('spec/helpers')
|
55
|
+
::STATS_DIRECTORIES << %w(Library\ specs spec/lib) if File.exist?('spec/lib')
|
56
|
+
::STATS_DIRECTORIES << %w(Mailer\ specs spec/mailers) if File.exist?('spec/mailers')
|
57
|
+
::STATS_DIRECTORIES << %w(Routing\ specs spec/routing) if File.exist?('spec/routing')
|
58
|
+
::STATS_DIRECTORIES << %w(Request\ specs spec/requests) if File.exist?('spec/requests')
|
59
|
+
::CodeStatistics::TEST_TYPES << "Model specs" if File.exist?('spec/models')
|
60
|
+
::CodeStatistics::TEST_TYPES << "View specs" if File.exist?('spec/views')
|
61
|
+
::CodeStatistics::TEST_TYPES << "Controller specs" if File.exist?('spec/controllers')
|
62
|
+
::CodeStatistics::TEST_TYPES << "Helper specs" if File.exist?('spec/helpers')
|
63
|
+
::CodeStatistics::TEST_TYPES << "Library specs" if File.exist?('spec/lib')
|
64
|
+
::CodeStatistics::TEST_TYPES << "Mailer specs" if File.exist?('spec/mailer')
|
65
|
+
::CodeStatistics::TEST_TYPES << "Routing specs" if File.exist?('spec/routing')
|
66
|
+
::CodeStatistics::TEST_TYPES << "Request specs" if File.exist?('spec/requests')
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe Inkling::ProxyingController do
|
4
|
+
|
5
|
+
it "should assemble a resource route and proxy onto it" do
|
6
|
+
post 'proxy', {:content_type => "Inkling::Foo"}
|
7
|
+
response.redirect_url.should eql "http://test.host/inkling/content_types/foo/new"
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Inkling::Path do
|
4
|
+
|
5
|
+
# let(:foo) {ContentTypes::Foo.create(:name => "1")}
|
6
|
+
#
|
7
|
+
# it "should update the path based on its parent" do
|
8
|
+
# foo2 = ContentTypes::Foo.create(:name => "2")
|
9
|
+
# foo2.path.move_to_child_of foo.path
|
10
|
+
# foo2.save
|
11
|
+
# foo2.path.slug.should == "/1/2"
|
12
|
+
# end
|
13
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Inkling::Permission do
|
4
|
+
let(:type) {Inkling::Type.create!(:klass_name => "String")}
|
5
|
+
let(:user) {Inkling::User.create!(:email => "admin@localhost.com", :password => "test123", :password_confirmation => "test123")}
|
6
|
+
|
7
|
+
it "should let an administrator have automatic manage permission over foo" do
|
8
|
+
create_role_and_membership(Inkling::Role::ADMIN, user)
|
9
|
+
|
10
|
+
ability = Inkling::Ability.new(user)
|
11
|
+
ability.can?(:manage, String).should be_true
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should apply CanCanAction based perm.s via the role to the user on the type" do
|
15
|
+
role = create_role_and_membership("content_editor", user)
|
16
|
+
update_action = Inkling::CanCanAction.create!(:name => "update")
|
17
|
+
foo_update_permission = Inkling::Permission.create(:role_id => role.id, :can_can_action_id => update_action.id, :type_id => type.id)
|
18
|
+
ability = Inkling::Ability.new(user)
|
19
|
+
ability.can?(:update, String).should be_true
|
20
|
+
ability.cannot?(:delete, String).should be_true
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def create_role_and_membership(role_name, user)
|
25
|
+
role = Inkling::Role.create(:name => role_name)
|
26
|
+
membership = Inkling::RoleMembership.create!(:user => user, :role => role)
|
27
|
+
role
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Inkling::Theme do
|
4
|
+
|
5
|
+
default = <<-DEFAULT
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>Inkling Administration</title>
|
9
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
10
|
+
<meta name="keywords" content="" />
|
11
|
+
<meta name="description" content="" />
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
|
15
|
+
|
16
|
+
<div id="header">
|
17
|
+
<div id="logo">
|
18
|
+
<h1><%= link_to 'Inkling', inkling_user_root_path %></h1>
|
19
|
+
</div>
|
20
|
+
<div id="tabs">
|
21
|
+
<%= link_to 'Home', inkling_user_root_path %> | <%= link_to 'Tree', inkling_paths_path %>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<div class="notice"><%= notice %></div>
|
26
|
+
<div class="alert"><%= alert %></div>
|
27
|
+
|
28
|
+
<div id="page">
|
29
|
+
<div id="main">
|
30
|
+
<%= yield %>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<div id="footer">
|
35
|
+
<span id="version" align='center'>Inkling version <%= Inkling::VERSION %></span>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
|
39
|
+
</body>
|
40
|
+
</html>
|
41
|
+
DEFAULT
|
42
|
+
|
43
|
+
let(:theme) {Inkling::Theme.create!(:name => "default", :body => default)}
|
44
|
+
|
45
|
+
it "should write the theme to the tmp/inkling/themes directory" do
|
46
|
+
theme
|
47
|
+
lines = []
|
48
|
+
file = File.open("tmp/inkling/themes/#{theme.file_name}", "rb")
|
49
|
+
contents = file.read
|
50
|
+
|
51
|
+
file_words = contents.split(/\W/)
|
52
|
+
theme_words = theme.body.split(/\W/)
|
53
|
+
file_words.size.should == theme_words.size
|
54
|
+
|
55
|
+
i = 0
|
56
|
+
for word in theme_words
|
57
|
+
word.should == file_words[i]
|
58
|
+
i += 1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should delete the file when the theme model is deleted" do
|
63
|
+
theme.destroy
|
64
|
+
File.exist?("tmp/inkling/themes/#{theme.file_name}").should be_false
|
65
|
+
end
|
66
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# This file is copied to ~/spec when you run 'ruby script/generate rspec'
|
2
|
+
# from the project root directory.
|
3
|
+
ENV["RAILS_ENV"] ||= 'test'
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + "/../config/environment") #nf patching generated spec_helper
|
5
|
+
#require File.dirname(__FILE__) + "/../config/environment" unless defined?(Rails)
|
6
|
+
require 'rspec/rails'
|
7
|
+
|
8
|
+
# Requires supporting files with custom matchers and macros, etc,
|
9
|
+
# in ./support/ and its subdirectories.
|
10
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
11
|
+
|
12
|
+
Rspec.configure do |config|
|
13
|
+
# == Mock Framework
|
14
|
+
#
|
15
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
16
|
+
#
|
17
|
+
# config.mock_with :mocha
|
18
|
+
# config.mock_with :flexmock
|
19
|
+
# config.mock_with :rr
|
20
|
+
config.mock_with :rspec
|
21
|
+
|
22
|
+
# If you'd prefer not to run each of your examples within a transaction,
|
23
|
+
# uncomment the following line.
|
24
|
+
# config.use_transactional_examples = false
|
25
|
+
config.use_transactional_examples = true
|
26
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'ruby-debug'
|