jabe 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +35 -0
- data/Gemfile.lock +217 -0
- data/LICENSE.txt +20 -0
- data/README.textile +12 -0
- data/Rakefile +55 -0
- data/VERSION +1 -0
- data/app/controllers/admin/base_controller.rb +3 -0
- data/app/controllers/admin/entries_controller.rb +42 -0
- data/app/controllers/admin/settings_controller.rb +11 -0
- data/app/controllers/comments_controller.rb +25 -0
- data/app/controllers/entries_controller.rb +26 -0
- data/app/helpers/application_helper.rb +9 -0
- data/app/models/admin.rb +9 -0
- data/app/models/comment.rb +17 -0
- data/app/models/entry.rb +17 -0
- data/app/models/settings.rb +2 -0
- data/app/stylesheets/_will_paginate.scss +102 -0
- data/app/stylesheets/application.scss +247 -0
- data/app/stylesheets/grid.scss +336 -0
- data/app/stylesheets/handheld.scss +7 -0
- data/app/stylesheets/style.scss +273 -0
- data/app/views/admin/entries/_form.html.haml +6 -0
- data/app/views/admin/entries/edit.html.haml +1 -0
- data/app/views/admin/entries/index.html.haml +43 -0
- data/app/views/admin/entries/new.html.haml +1 -0
- data/app/views/admin/settings/edit.html.haml +9 -0
- data/app/views/entries/_comment.html.haml +0 -0
- data/app/views/entries/_comment_form.html.haml +3 -0
- data/app/views/entries/index.html.haml +13 -0
- data/app/views/entries/show.html.haml +36 -0
- data/app/views/layouts/_footer.html.haml +2 -0
- data/app/views/layouts/_header.html.haml +4 -0
- data/app/views/layouts/_sidebar.html.haml +0 -0
- data/app/views/layouts/application.html.haml +59 -0
- data/config/initializers/sass.rb +5 -0
- data/config/initializers/settings.rb +5 -0
- data/config/initializers/time_formats.rb +4 -0
- data/config/routes.rb +26 -0
- data/features/admin.feature +30 -0
- data/features/entries.feature +24 -0
- data/features/step_definitions/admin_steps.rb +14 -0
- data/features/step_definitions/entry_steps.rb +35 -0
- data/features/step_definitions/support_steps.rb +3 -0
- data/features/step_definitions/web_steps.rb +219 -0
- data/features/support/blueprints.rb +31 -0
- data/features/support/env.rb +59 -0
- data/features/support/paths.rb +37 -0
- data/lib/generators/jabe/migrations/migrations_generator.rb +42 -0
- data/lib/generators/jabe/templates/migrations/create_comments.rb +20 -0
- data/lib/generators/jabe/templates/migrations/create_entries.rb +16 -0
- data/lib/generators/jabe/templates/migrations/create_settings.rb +21 -0
- data/lib/generators/jabe/templates/migrations/create_slugs.rb +18 -0
- data/lib/generators/jabe/templates/migrations/devise_create_admins.rb +26 -0
- data/lib/jabe.rb +9 -0
- data/public/.htaccess +220 -0
- data/public/apple-touch-icon.png +0 -0
- data/public/blackbird/blackbird.css +80 -0
- data/public/blackbird/blackbird.js +365 -0
- data/public/blackbird/blackbird.png +0 -0
- data/public/crossdomain.xml +25 -0
- data/public/images/delete_page.png +0 -0
- data/public/images/full_page.png +0 -0
- data/public/javascripts/application.js +34 -0
- data/public/javascripts/jquery-ui.js +11511 -0
- data/public/javascripts/jquery-ui.min.js +404 -0
- data/public/javascripts/jquery.js +7179 -0
- data/public/javascripts/jquery.min.js +167 -0
- data/public/javascripts/libs/dd_belatedpng.js +13 -0
- data/public/javascripts/libs/modernizr-1.6.min.js +30 -0
- data/public/javascripts/libs/profiling/charts.swf +0 -0
- data/public/javascripts/libs/profiling/config.js +59 -0
- data/public/javascripts/libs/profiling/yahoo-profiling.css +7 -0
- data/public/javascripts/libs/profiling/yahoo-profiling.min.js +39 -0
- data/public/javascripts/plugins.js +40 -0
- data/public/javascripts/rails.js +154 -0
- data/public/nginx.conf +108 -0
- data/public/robots.txt +5 -0
- data/spec/support/blueprints.rb +31 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/config/application.rb +45 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +26 -0
- data/test/dummy/config/environments/production.rb +49 -0
- data/test/dummy/config/environments/test.rb +35 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/devise.rb +142 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/db/migrate/20101229224027_create_settings.rb +21 -0
- data/test/dummy/db/migrate/20101229224028_create_slugs.rb +18 -0
- data/test/dummy/db/migrate/20101229224029_devise_create_admins.rb +26 -0
- data/test/dummy/db/migrate/20101229224030_create_entries.rb +16 -0
- data/test/dummy/db/migrate/20101229224031_create_comments.rb +20 -0
- data/test/dummy/db/schema.rb +82 -0
- data/test/dummy/vendor/plugins/acts_as_textiled/init.rb +8 -0
- data/test/dummy/vendor/plugins/acts_as_textiled/lib/acts_as_textiled.rb +108 -0
- data/test/dummy/vendor/plugins/acts_as_textiled/test/fixtures/author.rb +4 -0
- data/test/dummy/vendor/plugins/acts_as_textiled/test/fixtures/story.rb +4 -0
- data/test/dummy/vendor/plugins/acts_as_textiled/test/helper.rb +87 -0
- data/test/dummy/vendor/plugins/acts_as_textiled/test/textiled_test.rb +145 -0
- metadata +641 -0
@@ -0,0 +1,10 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
|
3
|
+
# Add new inflection rules using the following format
|
4
|
+
# (all these examples are active by default):
|
5
|
+
# ActiveSupport::Inflector.inflections do |inflect|
|
6
|
+
# inflect.plural /^(ox)$/i, '\1en'
|
7
|
+
# inflect.singular /^(ox)en/i, '\1'
|
8
|
+
# inflect.irregular 'person', 'people'
|
9
|
+
# inflect.uncountable %w( fish sheep )
|
10
|
+
# end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
|
3
|
+
# Your secret key for verifying the integrity of signed cookies.
|
4
|
+
# If you change this key, all old signed cookies will become invalid!
|
5
|
+
# Make sure the secret is at least 30 characters and all random,
|
6
|
+
# no regular words or you'll be exposed to dictionary attacks.
|
7
|
+
Dummy::Application.config.secret_token = '93d0f7de2f6e6d2823619dee9f7ceed61e556e716123b37ceeb057307e533dda17e93026a271190aa52ddcbf1ebee33443624a020ae97cd64f4dd8cf61999fc4'
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
|
3
|
+
Dummy::Application.config.session_store :cookie_store, :key => '_dummy_session'
|
4
|
+
|
5
|
+
# Use the database for sessions instead of the cookie-based default,
|
6
|
+
# which shouldn't be used to store highly confidential information
|
7
|
+
# (create the session table with "rails generate session_migration")
|
8
|
+
# Dummy::Application.config.session_store :active_record_store
|
@@ -0,0 +1,58 @@
|
|
1
|
+
Dummy::Application.routes.draw do
|
2
|
+
# The priority is based upon order of creation:
|
3
|
+
# first created -> highest priority.
|
4
|
+
|
5
|
+
# Sample of regular route:
|
6
|
+
# match 'products/:id' => 'catalog#view'
|
7
|
+
# Keep in mind you can assign values other than :controller and :action
|
8
|
+
|
9
|
+
# Sample of named route:
|
10
|
+
# match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
|
11
|
+
# This route can be invoked with purchase_url(:id => product.id)
|
12
|
+
|
13
|
+
# Sample resource route (maps HTTP verbs to controller actions automatically):
|
14
|
+
# resources :products
|
15
|
+
|
16
|
+
# Sample resource route with options:
|
17
|
+
# resources :products do
|
18
|
+
# member do
|
19
|
+
# get 'short'
|
20
|
+
# post 'toggle'
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# collection do
|
24
|
+
# get 'sold'
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
|
28
|
+
# Sample resource route with sub-resources:
|
29
|
+
# resources :products do
|
30
|
+
# resources :comments, :sales
|
31
|
+
# resource :seller
|
32
|
+
# end
|
33
|
+
|
34
|
+
# Sample resource route with more complex sub-resources
|
35
|
+
# resources :products do
|
36
|
+
# resources :comments
|
37
|
+
# resources :sales do
|
38
|
+
# get 'recent', :on => :collection
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
|
42
|
+
# Sample resource route within a namespace:
|
43
|
+
# namespace :admin do
|
44
|
+
# # Directs /admin/products/* to Admin::ProductsController
|
45
|
+
# # (app/controllers/admin/products_controller.rb)
|
46
|
+
# resources :products
|
47
|
+
# end
|
48
|
+
|
49
|
+
# You can have the root of your site routed with "root"
|
50
|
+
# just remember to delete public/index.html.
|
51
|
+
# root :to => "welcome#index"
|
52
|
+
|
53
|
+
# See how all your routes lay out with "rake routes"
|
54
|
+
|
55
|
+
# This is a legacy wild controller route that's not recommended for RESTful applications.
|
56
|
+
# Note: This route will make all actions in every controller accessible via GET requests.
|
57
|
+
# match ':controller(/:action(/:id(.:format)))'
|
58
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class CreateSettings < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :settings do |t|
|
4
|
+
t.string :site_url
|
5
|
+
t.string :host_name
|
6
|
+
t.string :mail_from
|
7
|
+
t.string :site_name
|
8
|
+
t.string :tagline
|
9
|
+
t.string :time_zone
|
10
|
+
t.string :google_tracker_id
|
11
|
+
t.boolean :blackbird_enabled
|
12
|
+
t.integer :entries_per_page
|
13
|
+
|
14
|
+
t.timestamps
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.down
|
19
|
+
drop_table :settings
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreateSlugs < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :slugs do |t|
|
4
|
+
t.string :name
|
5
|
+
t.integer :sluggable_id
|
6
|
+
t.integer :sequence, :null => false, :default => 1
|
7
|
+
t.string :sluggable_type, :limit => 40
|
8
|
+
t.string :scope
|
9
|
+
t.datetime :created_at
|
10
|
+
end
|
11
|
+
add_index :slugs, :sluggable_id
|
12
|
+
add_index :slugs, [:name, :sluggable_type, :sequence, :scope], :name => "index_slugs_on_n_s_s_and_s", :unique => true
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.down
|
16
|
+
drop_table :slugs
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class DeviseCreateAdmins < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table(:admins) do |t|
|
4
|
+
t.database_authenticatable :null => false
|
5
|
+
t.recoverable
|
6
|
+
t.rememberable
|
7
|
+
t.trackable
|
8
|
+
|
9
|
+
# t.confirmable
|
10
|
+
# t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
|
11
|
+
# t.token_authenticatable
|
12
|
+
|
13
|
+
|
14
|
+
t.timestamps
|
15
|
+
end
|
16
|
+
|
17
|
+
add_index :admins, :email, :unique => true
|
18
|
+
add_index :admins, :reset_password_token, :unique => true
|
19
|
+
# add_index :admins, :confirmation_token, :unique => true
|
20
|
+
# add_index :admins, :unlock_token, :unique => true
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.down
|
24
|
+
drop_table :admins
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateEntries < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :entries do |t|
|
4
|
+
t.string :cached_slug
|
5
|
+
t.string :title
|
6
|
+
t.text :body
|
7
|
+
t.boolean :draft
|
8
|
+
t.datetime :published_at
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.down
|
14
|
+
drop_table :entries
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class CreateComments < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :comments do |t|
|
4
|
+
t.integer :entry_id
|
5
|
+
t.string :name
|
6
|
+
t.string :email
|
7
|
+
t.string :url
|
8
|
+
t.text :body
|
9
|
+
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
|
13
|
+
add_index :comments, :entry_id
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.down
|
17
|
+
remove_index :comments, :entry_id
|
18
|
+
drop_table :comments
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# This file is auto-generated from the current state of the database. Instead
|
2
|
+
# of editing this file, please use the migrations feature of Active Record to
|
3
|
+
# incrementally modify your database, and then regenerate this schema definition.
|
4
|
+
#
|
5
|
+
# Note that this schema.rb definition is the authoritative source for your
|
6
|
+
# database schema. If you need to create the application database on another
|
7
|
+
# system, you should be using db:schema:load, not running all the migrations
|
8
|
+
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
9
|
+
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
10
|
+
#
|
11
|
+
# It's strongly recommended to check this file into your version control system.
|
12
|
+
|
13
|
+
ActiveRecord::Schema.define(:version => 20101229224031) do
|
14
|
+
|
15
|
+
create_table "admins", :force => true do |t|
|
16
|
+
t.string "email", :default => "", :null => false
|
17
|
+
t.string "encrypted_password", :limit => 128, :default => "", :null => false
|
18
|
+
t.string "password_salt", :default => "", :null => false
|
19
|
+
t.string "reset_password_token"
|
20
|
+
t.string "remember_token"
|
21
|
+
t.datetime "remember_created_at"
|
22
|
+
t.integer "sign_in_count", :default => 0
|
23
|
+
t.datetime "current_sign_in_at"
|
24
|
+
t.datetime "last_sign_in_at"
|
25
|
+
t.string "current_sign_in_ip"
|
26
|
+
t.string "last_sign_in_ip"
|
27
|
+
t.datetime "created_at"
|
28
|
+
t.datetime "updated_at"
|
29
|
+
end
|
30
|
+
|
31
|
+
add_index "admins", ["email"], :name => "index_admins_on_email", :unique => true
|
32
|
+
add_index "admins", ["reset_password_token"], :name => "index_admins_on_reset_password_token", :unique => true
|
33
|
+
|
34
|
+
create_table "comments", :force => true do |t|
|
35
|
+
t.integer "entry_id"
|
36
|
+
t.string "name"
|
37
|
+
t.string "email"
|
38
|
+
t.string "url"
|
39
|
+
t.text "body"
|
40
|
+
t.datetime "created_at"
|
41
|
+
t.datetime "updated_at"
|
42
|
+
end
|
43
|
+
|
44
|
+
add_index "comments", ["entry_id"], :name => "index_comments_on_entry_id"
|
45
|
+
|
46
|
+
create_table "entries", :force => true do |t|
|
47
|
+
t.string "cached_slug"
|
48
|
+
t.string "title"
|
49
|
+
t.text "body"
|
50
|
+
t.boolean "draft"
|
51
|
+
t.datetime "published_at"
|
52
|
+
t.datetime "created_at"
|
53
|
+
t.datetime "updated_at"
|
54
|
+
end
|
55
|
+
|
56
|
+
create_table "settings", :force => true do |t|
|
57
|
+
t.string "site_url"
|
58
|
+
t.string "host_name"
|
59
|
+
t.string "mail_from"
|
60
|
+
t.string "site_name"
|
61
|
+
t.string "tagline"
|
62
|
+
t.string "time_zone"
|
63
|
+
t.string "google_tracker_id"
|
64
|
+
t.boolean "blackbird_enabled"
|
65
|
+
t.integer "entries_per_page"
|
66
|
+
t.datetime "created_at"
|
67
|
+
t.datetime "updated_at"
|
68
|
+
end
|
69
|
+
|
70
|
+
create_table "slugs", :force => true do |t|
|
71
|
+
t.string "name"
|
72
|
+
t.integer "sluggable_id"
|
73
|
+
t.integer "sequence", :default => 1, :null => false
|
74
|
+
t.string "sluggable_type", :limit => 40
|
75
|
+
t.string "scope"
|
76
|
+
t.datetime "created_at"
|
77
|
+
end
|
78
|
+
|
79
|
+
add_index "slugs", ["name", "sluggable_type", "sequence", "scope"], :name => "index_slugs_on_n_s_s_and_s", :unique => true
|
80
|
+
add_index "slugs", ["sluggable_id"], :name => "index_slugs_on_sluggable_id"
|
81
|
+
|
82
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module Err
|
2
|
+
module Acts #:nodoc: all
|
3
|
+
module Textiled
|
4
|
+
def self.included(klass)
|
5
|
+
klass.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def acts_as_textiled(*attributes)
|
10
|
+
@textiled_attributes = []
|
11
|
+
|
12
|
+
@textiled_unicode = String.new.respond_to? :chars
|
13
|
+
|
14
|
+
ruled = attributes.last.is_a?(Hash) ? attributes.pop : {}
|
15
|
+
attributes += ruled.keys
|
16
|
+
|
17
|
+
type_options = %w( plain source )
|
18
|
+
|
19
|
+
attributes.each do |attribute|
|
20
|
+
define_method(attribute) do |*type|
|
21
|
+
type = type.first
|
22
|
+
|
23
|
+
if type.nil? && self[attribute]
|
24
|
+
textiled[attribute.to_s] ||= RedCloth.new(self[attribute], Array(ruled[attribute])).to_html
|
25
|
+
elsif type.nil? && self[attribute].nil?
|
26
|
+
nil
|
27
|
+
elsif type_options.include?(type.to_s)
|
28
|
+
send("#{attribute}_#{type}")
|
29
|
+
else
|
30
|
+
raise "I don't understand the `#{type}' option. Try #{type_options.join(' or ')}."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
define_method("#{attribute}_plain", proc { strip_redcloth_html(__send__(attribute)) if __send__(attribute) } )
|
35
|
+
define_method("#{attribute}_source", proc { __send__("#{attribute}_before_type_cast") } )
|
36
|
+
|
37
|
+
@textiled_attributes << attribute
|
38
|
+
end
|
39
|
+
|
40
|
+
include Err::Acts::Textiled::InstanceMethods
|
41
|
+
end
|
42
|
+
|
43
|
+
def textiled_attributes
|
44
|
+
Array(@textiled_attributes)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module InstanceMethods
|
49
|
+
def textiled
|
50
|
+
textiled? ? (@textiled ||= {}) : @attributes.dup
|
51
|
+
end
|
52
|
+
|
53
|
+
def textiled?
|
54
|
+
@is_textiled != false
|
55
|
+
end
|
56
|
+
|
57
|
+
def textiled=(bool)
|
58
|
+
@is_textiled = !!bool
|
59
|
+
end
|
60
|
+
|
61
|
+
def textilize
|
62
|
+
self.class.textiled_attributes.each { |attr| __send__(attr) }
|
63
|
+
end
|
64
|
+
|
65
|
+
def reload
|
66
|
+
textiled.clear
|
67
|
+
super
|
68
|
+
end
|
69
|
+
|
70
|
+
def write_attribute(attr_name, value)
|
71
|
+
textiled[attr_name.to_s] = nil
|
72
|
+
super
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
def strip_redcloth_html(html)
|
77
|
+
returning html.dup.gsub(html_regexp, '') do |h|
|
78
|
+
redcloth_glyphs.each do |(entity, char)|
|
79
|
+
sub = [ :gsub!, entity, char ]
|
80
|
+
@textiled_unicode ? h.chars.send(*sub) : h.send(*sub)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def redcloth_glyphs
|
86
|
+
[[ '’', "'" ],
|
87
|
+
[ '‘', "'" ],
|
88
|
+
[ '<', '<' ],
|
89
|
+
[ '>', '>' ],
|
90
|
+
[ '”', '"' ],
|
91
|
+
[ '“', '"' ],
|
92
|
+
[ '…', '...' ],
|
93
|
+
[ '\1—', '--' ],
|
94
|
+
[ ' → ', '->' ],
|
95
|
+
[ ' – ', '-' ],
|
96
|
+
[ '×', 'x' ],
|
97
|
+
[ '™', '(TM)' ],
|
98
|
+
[ '®', '(R)' ],
|
99
|
+
[ '©', '(C)' ]]
|
100
|
+
end
|
101
|
+
|
102
|
+
def html_regexp
|
103
|
+
%r{<(?:[^>"']+|"(?:\\.|[^\\"]+)*"|'(?:\\.|[^\\']+)*')*>}xm
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__) + '/../lib'
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rubygems'
|
5
|
+
require 'yaml'
|
6
|
+
require 'mocha'
|
7
|
+
require 'active_support'
|
8
|
+
require 'test/spec'
|
9
|
+
require 'RedCloth'
|
10
|
+
rescue LoadError
|
11
|
+
puts "acts_as_textiled requires the mocha and test-spec gems to run its tests"
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
|
15
|
+
class ActiveRecord
|
16
|
+
class Base
|
17
|
+
attr_reader :attributes
|
18
|
+
|
19
|
+
def initialize(attributes = {})
|
20
|
+
@attributes = attributes.dup
|
21
|
+
after_find if respond_to?(:after_find)
|
22
|
+
end
|
23
|
+
|
24
|
+
def method_missing(name, *args)
|
25
|
+
if name.to_s[/=/]
|
26
|
+
@attributes[key = name.to_s.sub('=','')] = value = args.first
|
27
|
+
write_attribute key, value
|
28
|
+
else
|
29
|
+
self[name.to_s]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def save
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
def reload
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
def [](value)
|
42
|
+
@attributes[value.to_s.sub('_before_type_cast', '')]
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.global
|
46
|
+
eval("$#{name.downcase}")
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.find(id)
|
50
|
+
item = global.detect { |key, hash| hash['id'] == id }.last
|
51
|
+
new(item)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end unless defined? ActiveRecord
|
55
|
+
|
56
|
+
require File.dirname(__FILE__) + '/../init'
|
57
|
+
|
58
|
+
class Author < ActiveRecord::Base
|
59
|
+
acts_as_textiled :blog => :lite_mode
|
60
|
+
end
|
61
|
+
|
62
|
+
class Story < ActiveRecord::Base
|
63
|
+
acts_as_textiled :body, :description => :lite_mode
|
64
|
+
|
65
|
+
def author
|
66
|
+
@author ||= Author.find(author_id)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class StoryWithAfterFind < Story
|
71
|
+
acts_as_textiled :body, :description => :lite_mode
|
72
|
+
|
73
|
+
def after_find
|
74
|
+
textilize
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.name
|
78
|
+
Story.name
|
79
|
+
end
|
80
|
+
|
81
|
+
def author
|
82
|
+
@author ||= Author.find(author_id)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
$author = YAML.load_file(File.dirname(__FILE__) + '/fixtures/authors.yml')
|
87
|
+
$story = YAML.load_file(File.dirname(__FILE__) + '/fixtures/stories.yml')
|