xli-hickey 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,55 @@
1
+ module Hickey
2
+ module DomainDetector
3
+ class Base
4
+ def visit(domain)
5
+ r = {}
6
+ domain.each do |key, value|
7
+ r[key] = value.accept_for_hickey(key, self)
8
+ end
9
+ r.size == 1 ? r.values.first : r
10
+ end
11
+
12
+ def visit_hash(attribute, record)
13
+ owner = new_instance(attribute, record)
14
+ after_created = []
15
+
16
+ record.each do |key, value|
17
+ if reflection = owner.class.reflections[key]
18
+ after_created << send(reflection.macro, owner, reflection, value)
19
+ else
20
+ owner.send :write_attribute, key, value
21
+ end
22
+ end
23
+
24
+ #bypass new alias method chain of save! method
25
+ owner.save_with_validation!
26
+
27
+ after_created.each(&:call)
28
+ owner
29
+ end
30
+
31
+ private
32
+ def new_instance(class_or_instance, record)
33
+ return class_or_instance unless ['Class', 'String', 'Symbol'].include?(class_or_instance.class.name)
34
+ compute_type(class_or_instance, record).new
35
+ end
36
+
37
+ def compute_type(class_name, record)
38
+ klass = class_name.is_a?(Class) ? class_name : class_name.to_s.classify.constantize
39
+ if (subclass_name = record[klass.inheritance_column.to_sym]).blank?
40
+ klass
41
+ else
42
+ begin
43
+ subclass_name.to_s.classify.constantize
44
+ rescue NameError
45
+ raise ActiveRecord::SubclassNotFound,
46
+ "The single-table inheritance mechanism failed to locate the subclass: '#{subclass_name}'. " +
47
+ "This error is raised because the column '#{klass.inheritance_column}' is reserved for storing the class in case of inheritance. " +
48
+ "Please rename this column if you didn't intend it to be used for storing the inheritance class " +
49
+ "or overwrite #{klass.name}.inheritance_column to use another column for that information."
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,38 @@
1
+ module Hickey
2
+ module DomainDetector
3
+ module Configurable
4
+ def self.included(base)
5
+ base.class_eval do
6
+ @@configurations = {}
7
+ cattr_accessor :configurations, :instance_writer => false
8
+ alias_method_chain :new_instance, :configuration
9
+ end
10
+ end
11
+
12
+ private
13
+ def new_instance_with_configuration(class_or_instance, record)
14
+ instance = new_instance_without_configuration(class_or_instance, record)
15
+ instance.instance_eval do
16
+ def valid_without_callbacks?
17
+ true
18
+ end
19
+ end
20
+ unless configuration_of(instance)[:callbacks] == :all
21
+ callbacks = configuration_of(instance)[:callbacks] || []
22
+ instance.instance_eval <<-"end_eval"
23
+ alias :original_callback :callback
24
+ def callback(method)
25
+ [#{callbacks.collect(&:inspect).join(',')}].include?(method) ? original_callback(method) : true
26
+ end
27
+ end_eval
28
+ end
29
+ instance
30
+ end
31
+
32
+ def configuration_of(instance)
33
+ klass = instance.class
34
+ @@configurations[klass.name.underscore.to_sym] || @@configurations[klass.base_class.name.underscore.to_sym] || {}
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,30 @@
1
+ module Hickey
2
+ module DomainDetector
3
+ module Scopes
4
+ def self.included(base)
5
+ base.send(:alias_method_chain, :visit_hash, :scopes)
6
+ base.send(:alias_method_chain, :new_instance, :scopes)
7
+ end
8
+
9
+ def visit_hash_with_scopes(attribute, record)
10
+ scopes.each do |foreign_key, owner|
11
+ record[foreign_key] = owner.id unless record[foreign_key]
12
+ end
13
+ returning visit_hash_without_scopes(attribute, record) do |instance|
14
+ scopes.delete instance.class.name.foreign_key
15
+ end
16
+ end
17
+
18
+ def new_instance_with_scopes(class_or_instance, record)
19
+ returning new_instance_without_scopes(class_or_instance, record) do |instance|
20
+ scopes[instance.class.name.foreign_key] = instance
21
+ end
22
+ end
23
+
24
+ private
25
+ def scopes
26
+ @scopes ||= {}
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ require 'hickey/domain_detector/base'
2
+ require 'hickey/domain_detector/associations'
3
+ require 'hickey/domain_detector/configurable'
4
+ require 'hickey/domain_detector/actions'
5
+ require 'hickey/domain_detector/scopes'
6
+
7
+ Hickey::DomainDetector::Base.class_eval do
8
+ include Hickey::DomainDetector::BelongsToAssociation
9
+ include Hickey::DomainDetector::HasOneAssociation
10
+ include Hickey::DomainDetector::HasOneThroughAssociation
11
+ include Hickey::DomainDetector::HasManyAssociation
12
+ include Hickey::DomainDetector::HasManyThroughAssociation
13
+ include Hickey::DomainDetector::HasAndBelongsToManyAssociation
14
+ include Hickey::DomainDetector::Configurable
15
+ include Hickey::DomainDetector::Scopes
16
+ include Hickey::DomainDetector::Actions
17
+ end
data/lib/hickey.rb ADDED
@@ -0,0 +1,22 @@
1
+
2
+ begin
3
+ require 'active_record'
4
+ rescue LoadError
5
+ require 'rubygems'
6
+ require 'active_record'
7
+ end
8
+
9
+ require 'hickey/acceptor'
10
+ require 'hickey/domain_detector'
11
+
12
+ module Hickey
13
+ def kiss(domain)
14
+ DomainDetector::Base.new.visit(domain)
15
+ end
16
+
17
+ def lipstick(domain={})
18
+ DomainDetector::Base.configurations.merge! domain
19
+ end
20
+
21
+ module_function :kiss, :lipstick
22
+ end
@@ -0,0 +1,17 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/test_helper'
2
+
3
+ class BelongsToAssociationTest < Test::Unit::TestCase
4
+ def test_create_associated_belongs_to_model
5
+ Hickey.kiss :projects_member => {:user => {:login => 'xli'}}
6
+ assert_not_nil projects_member.user
7
+ assert_equal 'xli', projects_member.user.login
8
+ end
9
+
10
+ def test_create_associated_belongs_to_model_with_class_name
11
+ Hickey.kiss :topic => {:title => 'Bla bla...', :owner => {:login => 'xli'}}
12
+
13
+ topic = Topic.find(:first)
14
+ assert_not_nil topic.owner
15
+ assert_equal 'xli', topic.owner.login
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ require 'logger'
2
+
3
+ RAILS_DEFAULT_LOGGER = Logger.new(File.expand_path(File.dirname(__FILE__)) + '/debug.log')
4
+ RAILS_DEFAULT_LOGGER.level = Logger::DEBUG
5
+ ActiveRecord::Base.logger = RAILS_DEFAULT_LOGGER
6
+
7
+ ActiveRecord::Base.configurations = {
8
+ 'test' => {
9
+ :database => ":memory:",
10
+ :adapter => 'sqlite3',
11
+ :timeout => 500
12
+ }
13
+ }
14
+
15
+ ActiveRecord::Base.establish_connection 'test'
16
+
17
+ ActiveRecord::Base.silence do
18
+ ActiveRecord::Migration.verbose = false
19
+ load File.join(File.dirname(__FILE__), 'schema.rb')
20
+ end
@@ -0,0 +1,135 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/test_helper'
2
+
3
+ class EnableCallbacksTest < Test::Unit::TestCase
4
+
5
+ def teardown
6
+ Hickey.lipstick.clear
7
+ Simple.public_instance_methods(false).each do |method|
8
+ next if method == 'id'
9
+ Simple.class_eval "def #{method};end"
10
+ end
11
+ end
12
+
13
+ def test_invoke_before_save_and_after_save_after_configured_all_callbacks
14
+ Hickey.lipstick(:simple => {:callbacks => :all})
15
+ Simple.class_eval do
16
+ before_save :create_user_before_save
17
+ after_save :create_user_after_save
18
+ def create_user_after_save
19
+ Hickey.kiss(:user => {:login => 'create_user_after_save'})
20
+ end
21
+ def create_user_before_save
22
+ Hickey.kiss(:user => {:login => 'create_user_before_save'})
23
+ end
24
+ def validate
25
+ raise 'should bypass'
26
+ end
27
+ end
28
+
29
+ Hickey.kiss(:simple => {})
30
+
31
+ assert_equal ['create_user_before_save', 'create_user_after_save'].sort, User.find(:all).collect(&:login).sort
32
+ end
33
+
34
+ def test_invoke_before_validation_on_create_after_configured_all_callbacks
35
+ Hickey.lipstick(:simple => {:callbacks => :all})
36
+ Simple.class_eval do
37
+ before_validation_on_create :create_user_before_validation_on_create
38
+ def create_user_before_validation_on_create
39
+ Hickey.kiss(:user => {:login => 'create_user_before_validation_on_create'})
40
+ end
41
+ def validate
42
+ raise 'should bypass'
43
+ end
44
+ end
45
+
46
+ Hickey.kiss(:simple => {})
47
+ assert_equal ['create_user_before_validation_on_create'], User.find(:all).collect(&:login)
48
+ end
49
+
50
+ def test_invoke_before_validation_after_configured_all_callbacks
51
+ Hickey.lipstick(:simple => {:callbacks => :all})
52
+ Simple.class_eval do
53
+ before_validation :create_user_before_validation
54
+ def create_user_before_validation
55
+ Hickey.kiss(:user => {:login => 'create_user_before_validation'})
56
+ end
57
+ def validate
58
+ raise 'should bypass'
59
+ end
60
+ end
61
+
62
+ Hickey.kiss(:simple => {})
63
+ assert_equal ['create_user_before_validation'], User.find(:all).collect(&:login)
64
+ end
65
+
66
+ def test_invoke_before_validation_after_configured_all_callbacks
67
+ Hickey.lipstick(:simple => {:callbacks => :all})
68
+ Simple.class_eval do
69
+ after_validation :create_user_after_validation
70
+ def create_user_after_validation
71
+ Hickey.kiss(:user => {:login => 'create_user_after_validation'})
72
+ end
73
+ def validate
74
+ raise 'should bypass'
75
+ end
76
+ end
77
+
78
+ Hickey.kiss(:simple => {})
79
+ assert_equal ['create_user_after_validation'], User.find(:all).collect(&:login)
80
+ end
81
+
82
+ def test_should_not_callback_before_validation_on_create_if_pass_in_existed_model
83
+ simple = Hickey.kiss(:simple => {})
84
+ Hickey.lipstick(:simple => {:callbacks => :all})
85
+ Simple.class_eval do
86
+ before_validation_on_create :create_user_before_validation_on_create
87
+ def create_user_before_validation_on_create
88
+ Hickey.kiss(:user => {:login => 'create_user_before_validation_on_create'})
89
+ end
90
+ def validate
91
+ raise 'should bypass'
92
+ end
93
+ end
94
+
95
+ Hickey.kiss(simple => {})
96
+ assert_equal [], User.find(:all).collect(&:login)
97
+ end
98
+
99
+ def test_should_enable_configuration_of_invoking_all_callbacks_for_all_subclasses
100
+ Hickey.lipstick(:property_definition => {:callbacks => :all})
101
+ DatePropertyDefinition.class_eval do
102
+ after_validation :create_user_after_validation
103
+ def create_user_after_validation
104
+ Hickey.kiss(:user => {:login => 'create_user_after_validation'})
105
+ end
106
+ def validate
107
+ raise 'should bypass'
108
+ end
109
+ end
110
+
111
+ Hickey.kiss(:property_definition => {:type => 'DatePropertyDefinition'})
112
+
113
+ assert_equal ['create_user_after_validation'], User.find(:all).collect(&:login)
114
+ end
115
+
116
+ def test_invoke_callback_specified_after_configured
117
+ Hickey.lipstick(:simple => {:callbacks => [:after_create, :before_create]})
118
+ Simple.class_eval do
119
+ before_create :create_user_before_create
120
+ after_create :create_user_after_create
121
+ def create_user_before_create
122
+ Hickey.kiss(:user => {:login => 'create_user_before_create'})
123
+ end
124
+ def create_user_after_create
125
+ Hickey.kiss(:user => {:login => 'create_user_after_create'})
126
+ end
127
+ def validate
128
+ raise 'should bypass'
129
+ end
130
+ end
131
+
132
+ Hickey.kiss(:simple => {})
133
+ assert_equal ['create_user_after_create', 'create_user_before_create'].sort, User.find(:all).collect(&:login).sort
134
+ end
135
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/test_helper'
2
+
3
+ class FindOrCreateActionsTest < Test::Unit::TestCase
4
+ def test_create_action
5
+ assert Hickey.kiss(:simple => {:create => {}})
6
+ end
7
+
8
+ def test_create_multi_models
9
+ result = Hickey.kiss(:simple => {:create => {}}, :user => {:create => {:login => 'xli'}})
10
+ assert_equal({:simple => Simple.find(:first), :user => User.find(:first)}, result)
11
+ end
12
+
13
+ def test_create_association_model
14
+ Hickey.kiss(:project => {:identifier => 'hickey', :users => [{:create => {:login => 'xli', :admin => true}}]})
15
+
16
+ assert_equal 'xli', project.users.first.login
17
+ end
18
+
19
+ def test_find_action
20
+ simple1 = Hickey.kiss(:simple => {})
21
+ simple2 = Hickey.kiss(:simple => {:find => {}})
22
+ assert_equal simple1, simple2
23
+ assert_equal 1, Simple.count(:all)
24
+ end
25
+
26
+ def test_find_by_attributes
27
+ Hickey.kiss(:user => {:login => 'mm'})
28
+ user1 = Hickey.kiss(:user => {:login => 'xli'})
29
+ user2 = Hickey.kiss(:user => {:find => {:login => 'xli'}})
30
+ assert_equal user1, user2
31
+ assert_equal 2, User.count(:all)
32
+ end
33
+
34
+ def test_should_find_model_without_association
35
+ Hickey.kiss(:project => {:identifier => 'hickey', :users => [{:login => 'xli', :admin => true}]})
36
+
37
+ project = Hickey.kiss(:project => {:find => {:identifier => 'hickey', :users => [{:login => 'xli', :admin => true}]}})
38
+ assert_equal 'hickey', project.identifier
39
+ assert_equal 'xli', project.users.first.login
40
+ assert_equal 1, Project.count(:all)
41
+
42
+ assert_equal 2, User.count(:all)
43
+ end
44
+
45
+ def test_find_model_with_finding_association
46
+ Hickey.kiss(:project => {:identifier => 'hickey', :users => [{:login => 'xli', :admin => true}]})
47
+
48
+ project = Hickey.kiss(:project => {:find => {:identifier => 'hickey', :users => [{:find => {:login => 'xli', :admin => true}}]}})
49
+ assert_equal 'hickey', project.identifier
50
+ assert_equal 'xli', project.users.first.login
51
+ assert_equal 1, Project.count(:all)
52
+
53
+ assert_equal 1, User.count(:all)
54
+ end
55
+
56
+ def test_find_or_create
57
+ Hickey.kiss(:simple => {:find_or_create => {}})
58
+ assert_equal 1, Simple.count(:all)
59
+ Hickey.kiss(:simple => {:find_or_create => {}})
60
+ assert_equal 1, Simple.count(:all)
61
+ end
62
+ end
@@ -0,0 +1,10 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/test_helper'
2
+
3
+ class HasAndBelongsToManyAssociationTest < Test::Unit::TestCase
4
+ def test_create_associated_has_and_belongs_to_many_models
5
+ Hickey.kiss :user => {:login => 'xli', :countries => [{:name => 'China'}]}
6
+
7
+ assert_equal 1, user.countries.size
8
+ assert_equal 'China', user.countries.first.name
9
+ end
10
+ end
@@ -0,0 +1,71 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/test_helper'
2
+
3
+ class HasManyAssociationTest < Test::Unit::TestCase
4
+
5
+ def test_create_associated_empty_models
6
+ Hickey.kiss(:project => {:identifier => 'hickey', :projects_members => []})
7
+ assert_equal [], project.projects_members
8
+ end
9
+
10
+ def test_create_associated_many_existed_models
11
+ Hickey.kiss :project => {:identifier => 'hickey', :projects_members => [{}, {}]}
12
+
13
+ assert_equal 2, project.projects_members.size
14
+ assert_not_nil project.projects_members.first
15
+ assert_not_nil project.projects_members.last
16
+ end
17
+
18
+ def test_option_class_name
19
+ Hickey.kiss :user => {:login => 'xli', :my_topics => [{:title => 'Bla bla...'}]}
20
+ assert_equal 1, user.my_topics.size
21
+ assert_equal 'Bla bla...', user.my_topics.first.title
22
+ end
23
+
24
+ def test_option_through_models
25
+ Hickey.kiss :project => {:identifier => 'hickey', :users => [{:login => 'xli'}]}
26
+ assert_equal 1, project.projects_members.size
27
+ assert_not_nil project.projects_members.first.user
28
+ assert_equal 'xli', project.projects_members.first.user.login
29
+
30
+ assert_equal 'xli', project.users.first.login
31
+ end
32
+
33
+ def test_option_foreign_key
34
+ Hickey.kiss :writer => {:login => 'xli', :addresses => [{:location => 'BeiJing'}, {:location => 'ShangHai'}]}
35
+ assert_equal 2, writer.addresses.size
36
+ assert_equal ['BeiJing', 'ShangHai'].sort, writer.addresses.collect(&:location).sort
37
+ end
38
+
39
+ def test_option_as
40
+ Hickey.kiss :writer => {:topics => [{:title => 'Hello world'}, {:title => 'Hello world again'}]}
41
+ assert_equal ['Hello world', 'Hello world again'].sort, writer.topics.collect(&:title).sort
42
+ end
43
+
44
+ def test_option_through_and_as
45
+ Hickey.kiss :writer => {:login => 'writer', :disscutions => [{:speaker => {:login => 'xli'}}, {:speaker => {:login => 'oo'}}]}
46
+ speakers = writer.disscutions.collect(&:speaker)
47
+ assert_equal ['writer', 'xli', 'oo'].sort, User.find(:all).collect(&:login).sort
48
+ assert_equal 2, speakers.size
49
+ speakers = [speakers.first.login, speakers.last.login]
50
+ assert_equal ['xli', 'oo'].sort, speakers.sort
51
+ end
52
+
53
+ def test_specifying_type_attribute_for_single_table_inheritance
54
+ Hickey.kiss :project => {:all_property_definitions => [{:name => 'status', :type => 'EnumPropertyDefinition'}, {:name => 'owner', :type => 'UserPropertyDefinition'}]}
55
+
56
+ assert_equal ['status', 'owner'].sort, project.all_property_definitions.collect(&:name).sort
57
+ end
58
+
59
+ def test_subclass_relationship_of_single_table_inheritance
60
+ Hickey.kiss :property_definition => {:type => 'EnumPropertyDefinition', :enum_values => [{:value => 'new'}, {:value => 'open'}]}
61
+
62
+ assert_equal ['new', 'open'].sort, property_definition.enum_values.collect(&:value).sort
63
+ end
64
+
65
+ def test_should_raise_active_record_subclass_not_found_error_when_cant_find_subclass
66
+ assert_raise ActiveRecord::SubclassNotFound do
67
+ Hickey.kiss :property_definition => {:type => 'NotPropertyDefinition'}
68
+ end
69
+ end
70
+
71
+ end
@@ -0,0 +1,53 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/test_helper'
2
+
3
+ class HasOneAssociationTest < Test::Unit::TestCase
4
+ def test_user_has_one_address
5
+ Hickey.kiss :user => {:address => {:location => 'BeiJing'}}
6
+ assert_equal 'BeiJing', user.address.location
7
+ end
8
+
9
+ def test_with_option_foreign_key
10
+ Hickey.kiss :author => {:address => {:location => 'BeiJing'}}
11
+ assert_equal 'BeiJing', author.address.location
12
+ end
13
+
14
+ def test_with_option_as_and_class_name
15
+ Hickey.kiss :author => {:working_topic => {:title => 'Hello world'}}
16
+ assert_equal 'Hello world', author.working_topic.title
17
+ end
18
+
19
+ def test_with_option_through_has_one
20
+ Hickey.kiss :author => {:country => {:name => 'China'}}
21
+ assert_equal 'China', author.country.name
22
+ end
23
+
24
+ def test_with_option_through_source
25
+ Hickey.kiss :author => {:living_country => {:name => 'China'}}
26
+ assert_equal 'China', author.living_country.name
27
+ end
28
+
29
+ def test_with_option_through_source_type
30
+ Hickey.kiss :disscution => {:speaker => {:login => 'xli'}}
31
+ assert_equal 'xli', disscution.speaker.login
32
+ end
33
+
34
+ def test_through_and_as
35
+ # fail('do we need this?')
36
+ end
37
+
38
+ #active_record couldn't work on has_one :through belongs to
39
+ def xtest_with_option_through_belongs_to
40
+ user = User.create(:login => 'xli')
41
+ DisscutionBelongsToTopic.create!(:owner => user)
42
+ assert_equal 'xli', d.owner.login
43
+
44
+ Hickey.kiss :disscution_belongs_to_topic => {:owner => {:login => 'xli'}}
45
+ assert_equal 'xli', disscution_belongs_to_topic.owner.login
46
+ end
47
+
48
+ #active_record couldn't work on has_one :through belongs to
49
+ def xtest_with_option_through_source_type
50
+ Hickey.kiss :disscution_belongs_to_topic => {:speaker => {:login => 'xli'}}
51
+ assert_equal 'xli', disscution_belongs_to_topic.speaker.login
52
+ end
53
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/test_helper'
2
+
3
+ class ModelAssociationTest < Test::Unit::TestCase
4
+
5
+ def test_should_return_same_with_models_loaded_from_db_after_created_models
6
+ project = Hickey.kiss :project => {:identifier => 'hickey', :projects_members => [:user => {:login => 'xli'}]}
7
+
8
+ db_project = Project.find(:first)
9
+ assert_equal project, db_project
10
+ assert_equal project.projects_members.size, db_project.projects_members.size
11
+ assert_equal project.projects_members.first.user, db_project.projects_members.first.user
12
+ end
13
+
14
+ def test_create_associated_both_has_many_association_and_belongs_to_association_models
15
+ Hickey.kiss :project => {:identifier => 'hickey', :projects_members => [:user => {:login => 'xli'}]}
16
+ assert_equal 1, project.projects_members.size
17
+ assert_not_nil project.projects_members.first.user
18
+ assert_equal 'xli', project.projects_members.first.user.login
19
+ end
20
+
21
+ end
@@ -0,0 +1,5 @@
1
+ class Address < ActiveRecord::Base
2
+ belongs_to :user
3
+ belongs_to :country
4
+ should_bypass_all_callbacks_and_validations
5
+ end
@@ -0,0 +1,10 @@
1
+ class Author < ActiveRecord::Base
2
+ set_table_name "users"
3
+
4
+ has_one :address, :foreign_key => 'user_id'
5
+ has_one :working_topic, :as => :writer, :class_name => 'Topic'
6
+ has_one :country, :through => :address
7
+ has_one :living_country, :through => :address, :source => :country
8
+
9
+ should_bypass_all_callbacks_and_validations
10
+ end
@@ -0,0 +1,4 @@
1
+ class Country < ActiveRecord::Base
2
+ has_and_belongs_to_many :users
3
+ should_bypass_all_callbacks_and_validations
4
+ end
@@ -0,0 +1,9 @@
1
+ class Project < ActiveRecord::Base
2
+ has_many :projects_members
3
+ has_many :users, :through => :projects_members
4
+ has_many :admins, :through => :projects_members, :source => :user, :conditions => ["projects_members.admin = ?", true]
5
+ has_many :all_property_definitions, :class_name => 'PropertyDefinition'
6
+ has_many :tags
7
+ has_many :cards
8
+ should_bypass_all_callbacks_and_validations
9
+ end
@@ -0,0 +1,5 @@
1
+ class ProjectsMember < ActiveRecord::Base
2
+ belongs_to :project
3
+ belongs_to :user
4
+ should_bypass_all_callbacks_and_validations
5
+ end
@@ -0,0 +1,21 @@
1
+ class PropertyDefinition < ActiveRecord::Base
2
+ belongs_to :project
3
+ end
4
+
5
+ class EnumPropertyDefinition < PropertyDefinition
6
+ has_many :enum_values, :foreign_key => 'property_definition_id'
7
+ should_bypass_all_callbacks_and_validations
8
+ end
9
+
10
+ class UserPropertyDefinition < PropertyDefinition
11
+ should_bypass_all_callbacks_and_validations
12
+ end
13
+
14
+ class EnumValue < ActiveRecord::Base
15
+ belongs_to :property_definition, :class_name => "EnumeratedPropertyDefinition", :foreign_key => "property_definition_id"
16
+ should_bypass_all_callbacks_and_validations
17
+ end
18
+
19
+ class DatePropertyDefinition < PropertyDefinition
20
+ end
21
+
@@ -0,0 +1,26 @@
1
+ class Simple < ActiveRecord::Base
2
+ end
3
+
4
+ class Prisoner < ActiveRecord::Base
5
+ set_table_name "users"
6
+
7
+ def login=(login)
8
+ raise 'unsupported operation'
9
+ end
10
+ end
11
+
12
+ class SimpleObserver < ActiveRecord::Observer
13
+
14
+ observe Simple
15
+ def after_save(simple)
16
+ raise 'should be bypass'
17
+ end
18
+
19
+ def after_create(simple)
20
+ raise 'should be bypass'
21
+ end
22
+
23
+ def after_update(simple)
24
+ raise 'should be bypass'
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ class Tag < ActiveRecord::Base
2
+ has_many :taggings, :class_name => '::Tagging'
3
+ belongs_to :project
4
+
5
+ should_bypass_all_callbacks_and_validations
6
+ end
7
+
8
+ class Tagging < ActiveRecord::Base
9
+ belongs_to :tag
10
+ belongs_to :taggable, :polymorphic => true
11
+ should_bypass_all_callbacks_and_validations
12
+ end
13
+
14
+ class Card < ActiveRecord::Base
15
+ has_many :taggings, :as => :taggable
16
+ belongs_to :project
17
+ end