has_attributes_from 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ === 0.0.1 2009-08-20
2
+
3
+ * Initial release
4
+
5
+ === 0.1.2 2009-08-21
6
+
7
+ * Rename gem to 'has_attributes_from' and some cleanup of the code
@@ -0,0 +1,32 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.textile
4
+ Rakefile
5
+ lib/has_attributes_from/base.rb
6
+ lib/has_attributes_from.rb
7
+ tasks/has_attributes_from.rake
8
+ test/factories/general.rb
9
+ test/rails_root/app/models/customer.rb
10
+ test/rails_root/app/models/customer_detail.rb
11
+ test/rails_root/app/models/employee.rb
12
+ test/rails_root/app/models/employee_property.rb
13
+ test/rails_root/app/models/manager.rb
14
+ test/rails_root/app/models/person.rb
15
+ test/rails_root/config/boot.rb
16
+ test/rails_root/config/database.yml
17
+ test/rails_root/config/environment.rb
18
+ test/rails_root/config/environments/test.rb
19
+ test/rails_root/config/routes.rb
20
+ test/rails_root/db/migrate/20090820105348_create_people.rb
21
+ test/rails_root/db/migrate/20090820105521_create_employee_properties.rb
22
+ test/rails_root/db/migrate/20090820110621_create_customer_details.rb
23
+ test/rails_root/db/schema.rb
24
+ test/rails_root/db/test.sqlite3
25
+ test/test_helper.rb
26
+ test/unit/customer_detail_test.rb
27
+ test/unit/customer_test.rb
28
+ test/unit/employee_property_test.rb
29
+ test/unit/employee_test.rb
30
+ test/unit/manager_test.rb
31
+ test/unit/person_test.rb
32
+ with_properties.gemspec
@@ -0,0 +1,96 @@
1
+ h2. Has_attributes_from
2
+
3
+ Download: http://github.com/dovadi/has_attributes_from
4
+
5
+ h2. Description:
6
+
7
+ Merge the attributes from another ActiveRecord class to an individual STI subclass.
8
+
9
+ h2. Example:
10
+
11
+ <pre>
12
+ create_table "child_details", :force => true do |t|
13
+ t.string "nickname"
14
+ t.string "allergy"
15
+ t.integer "client_id"
16
+ end
17
+
18
+ create_table "caretaker_details", :force => true do |t|
19
+ t.string "relation"
20
+ t.integer "caretaker_id"
21
+ end
22
+
23
+ create_table "people", :force => true do |t|
24
+ t.string "type"
25
+ t.string "firstname"
26
+ t.string "lastname"
27
+ t.string "email"
28
+ end
29
+
30
+ class Person < ActiveRecord::Base
31
+ end
32
+
33
+ class Child < Person
34
+ has_attributes_from :child_details
35
+ validates_presence_of :nickname
36
+ end
37
+
38
+ class Caretaker < Person
39
+ has_attributes_from :caretaker_details
40
+ end
41
+
42
+ child = Child.create(:firstname =>'William', :lastname=>'Gates' :email=>'bgates@microsoft.com', :nickname=>'Bill')
43
+ child.update_attributes(:allergy=>'Not allowed to eat apples!')
44
+
45
+ caretaker = Caretaker.create(:firstname =>'William H.', :lastname=>'Gates' :email=>'w.h.gates@gmail.com')
46
+ caretaker.update_attribute(:relation, 'Daddy')
47
+ </pre>
48
+
49
+ h2. Install:
50
+
51
+ <pre>
52
+ * git clone http://github.com/dovadi/has_attributes_from or
53
+ * sudo gem install dovadi-has_attributes_from -s http://gems.github.com or
54
+ * Add the following to your environment.rb:
55
+
56
+ config.gem 'dovadi-has_attributes_from',
57
+ :lib => 'has_attributes_from',
58
+ :version => '>=0.1.1',
59
+ :source => 'http://gems.github.com'
60
+ </pre>
61
+
62
+ h2. Test
63
+
64
+ * You can run the tests from this gem with rake test:default (you need to install the Shoulda and Factory_girl gems).
65
+
66
+ h2. Credits
67
+
68
+ This project is funded and maintained by "Agile Dovadi BV":http://dovadi.com, contact "Frank Oxener":mailto:frank@dovadi.com
69
+
70
+
71
+ h2. Licence:
72
+
73
+ <pre>
74
+ (The MIT License)
75
+
76
+ Copyright (c) 2009 Frank Oxener - Agile Dovadi B.V.
77
+
78
+ Permission is hereby granted, free of charge, to any person obtaining
79
+ a copy of this software and associated documentation files (the
80
+ 'Software'), to deal in the Software without restriction, including
81
+ without limitation the rights to use, copy, modify, merge, publish,
82
+ distribute, sublicense, and/or sell copies of the Software, and to
83
+ permit persons to whom the Software is furnished to do so, subject to
84
+ the following conditions:
85
+
86
+ The above copyright notice and this permission notice shall be
87
+ included in all copies or substantial portions of the Software.
88
+
89
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
90
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
91
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
92
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
93
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
94
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
95
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
96
+ </pre>
@@ -0,0 +1 @@
1
+ Dir['tasks/**/*.rake'].each { |t| load t }
@@ -0,0 +1,6 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+ require 'activerecord'
4
+ require 'has_attributes_from/base'
5
+
6
+ ActiveRecord::Base.send(:include, HasAttributesFrom::Base)
@@ -0,0 +1,74 @@
1
+ module HasAttributesFrom
2
+ module Base
3
+
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ module ClassMethods
9
+
10
+ def has_attributes_from table
11
+ @properties = table.to_s
12
+ has_one table
13
+ before_save :save_properties
14
+
15
+ define_getters_and_setters
16
+ define_save_properties
17
+ override_create
18
+ end
19
+
20
+ private
21
+
22
+ def define_save_properties
23
+ class_eval %{
24
+ def save_properties
25
+ #{@properties}.save if #{@properties} && #{@properties}.changed?
26
+ end
27
+ }
28
+ end
29
+
30
+ def define_getters_and_setters
31
+ column_names = @properties.camelize.constantize.column_names.reject {|column| column=~/^id$|_id|_at/}
32
+ column_names.each do |column|
33
+ class_eval %{
34
+ def #{column}
35
+ #{@properties}.nil? ? '' : #{@properties}.#{column}
36
+ end
37
+ def #{column}=(value)
38
+ #{@properties}.#{column}=value if #{@properties}
39
+ end
40
+ }
41
+ end
42
+ end
43
+
44
+ def override_create
45
+ instance_eval %{
46
+ def create(attributes = nil, &block)
47
+ attributes.stringify_keys!
48
+ attributes_without_associated = attributes.reject{|k,v| k if reflections[k.to_sym]}
49
+
50
+ attribute_keys = attributes_without_associated.keys.map{|k| k.to_s}
51
+ attributes_only_associated_keys = attributes.keys - attributes_without_associated.keys
52
+
53
+ property_attribute_keys = (attribute_keys - column_names)
54
+ parent_attribute_keys = attribute_keys - property_attribute_keys
55
+
56
+ parent_attributes = {}
57
+ property_attributes ={}
58
+ attributes.each do |k,v|
59
+ parent_attributes[k]=v if parent_attribute_keys.include?(k) || attributes_only_associated_keys.include?(k)
60
+ property_attributes[k]=v if property_attribute_keys.include?(k)
61
+ end
62
+ instance_of_property_model = "#{@properties}".camelize.constantize.new(property_attributes)
63
+
64
+ attributes = parent_attributes.merge(:#{@properties}=>instance_of_property_model)
65
+
66
+ super
67
+ end
68
+ }
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,33 @@
1
+ require 'rake/testtask'
2
+
3
+ namespace :test do
4
+ desc "Run the with_properties tests"
5
+ Rake::TestTask.new(:has_attributes_from) do |t|
6
+ t.libs << "test"
7
+ t.test_files = FileList['test/unit/*_test.rb']
8
+ t.verbose = true
9
+ end
10
+ end
11
+
12
+ desc "Run the tests"
13
+ task :default => ['test:has_attributes_from']
14
+
15
+ namespace :has_attributes_from do
16
+ gem_spec = Gem::Specification.new do |gem_spec|
17
+ gem_spec.name = "has_attributes_from"
18
+ gem_spec.version = "0.1.2"
19
+ gem_spec.summary = "Merge the attributes from another ActiveRecord class to an individual STI subclass."
20
+ gem_spec.email = "frank.oxener@dovadi.com"
21
+ gem_spec.homepage = "http://github.com/dovadi/has_attributes_from"
22
+ gem_spec.description = "Merge the attributes from another ActiveRecord class to an individual STI subclass."
23
+ gem_spec.authors = ["Frank Oxener"]
24
+ gem_spec.files = FileList["[A-Z]*", "{lib,tasks,test}/**/*"]
25
+ end
26
+
27
+ desc "Generate a gemspec file"
28
+ task :gemspec do
29
+ File.open("#{gem_spec.name}.gemspec", 'w') do |f|
30
+ f.write gem_spec.to_yaml
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,28 @@
1
+ Factory.sequence :email do |n|
2
+ "person#{n}@example.com"
3
+ end
4
+
5
+ Factory.sequence :name do |n|
6
+ "name-#{n}"
7
+ end
8
+
9
+ Factory.define :person do |person|
10
+ person.email {Factory.next :email}
11
+ person.name {Factory.next :name }
12
+ end
13
+
14
+ Factory.define :customer do |customer|
15
+ end
16
+
17
+ Factory.define :manager do |customer|
18
+ end
19
+
20
+ Factory.define :employee do |customer|
21
+ end
22
+
23
+ Factory.define :customer_detail do |customer_detail|
24
+ customer_detail.phone ""
25
+ end
26
+
27
+ Factory.define :employee_property do |employee_property|
28
+ end
@@ -0,0 +1,6 @@
1
+ class Customer < Person
2
+ has_attributes_from :customer_detail
3
+
4
+ validates_format_of :phone, :with=>/^\d{10}$/, :allow_blank=>true, :message=>"Only and exactly 10 numbers [0-9]"
5
+ validates_length_of :phone, :within => 10..10, :allow_blank=>true
6
+ end
@@ -0,0 +1,2 @@
1
+ class CustomerDetail < ActiveRecord::Base
2
+ end
@@ -0,0 +1,3 @@
1
+ class Employee < Person
2
+ has_attributes_from :employee_property
3
+ end
@@ -0,0 +1,2 @@
1
+ class EmployeeProperty < ActiveRecord::Base
2
+ end
@@ -0,0 +1,2 @@
1
+ class Manager < Person
2
+ end
@@ -0,0 +1,2 @@
1
+ class Person < ActiveRecord::Base
2
+ end
@@ -0,0 +1,110 @@
1
+ # Don't change this file!
2
+ # Configure your app in config/environment.rb and config/environments/*.rb
3
+
4
+ RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
5
+
6
+ module Rails
7
+ class << self
8
+ def boot!
9
+ unless booted?
10
+ preinitialize
11
+ pick_boot.run
12
+ end
13
+ end
14
+
15
+ def booted?
16
+ defined? Rails::Initializer
17
+ end
18
+
19
+ def pick_boot
20
+ (vendor_rails? ? VendorBoot : GemBoot).new
21
+ end
22
+
23
+ def vendor_rails?
24
+ File.exist?("#{RAILS_ROOT}/vendor/rails")
25
+ end
26
+
27
+ def preinitialize
28
+ load(preinitializer_path) if File.exist?(preinitializer_path)
29
+ end
30
+
31
+ def preinitializer_path
32
+ "#{RAILS_ROOT}/config/preinitializer.rb"
33
+ end
34
+ end
35
+
36
+ class Boot
37
+ def run
38
+ load_initializer
39
+ Rails::Initializer.run(:set_load_path)
40
+ end
41
+ end
42
+
43
+ class VendorBoot < Boot
44
+ def load_initializer
45
+ require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
46
+ Rails::Initializer.run(:install_gem_spec_stubs)
47
+ Rails::GemDependency.add_frozen_gem_path
48
+ end
49
+ end
50
+
51
+ class GemBoot < Boot
52
+ def load_initializer
53
+ self.class.load_rubygems
54
+ load_rails_gem
55
+ require 'initializer'
56
+ end
57
+
58
+ def load_rails_gem
59
+ if version = self.class.gem_version
60
+ gem 'rails', version
61
+ else
62
+ gem 'rails'
63
+ end
64
+ rescue Gem::LoadError => load_error
65
+ $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
66
+ exit 1
67
+ end
68
+
69
+ class << self
70
+ def rubygems_version
71
+ Gem::RubyGemsVersion rescue nil
72
+ end
73
+
74
+ def gem_version
75
+ if defined? RAILS_GEM_VERSION
76
+ RAILS_GEM_VERSION
77
+ elsif ENV.include?('RAILS_GEM_VERSION')
78
+ ENV['RAILS_GEM_VERSION']
79
+ else
80
+ parse_gem_version(read_environment_rb)
81
+ end
82
+ end
83
+
84
+ def load_rubygems
85
+ require 'rubygems'
86
+ min_version = '1.3.1'
87
+ unless rubygems_version >= min_version
88
+ $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
89
+ exit 1
90
+ end
91
+
92
+ rescue LoadError
93
+ $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
94
+ exit 1
95
+ end
96
+
97
+ def parse_gem_version(text)
98
+ $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
99
+ end
100
+
101
+ private
102
+ def read_environment_rb
103
+ File.read("#{RAILS_ROOT}/config/environment.rb")
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ # All that for this:
110
+ Rails.boot!
@@ -0,0 +1,11 @@
1
+ # SQLite version 3.x
2
+ # gem install sqlite3-ruby (not necessary on OS X Leopard)
3
+
4
+ # Warning: The database defined as "test" will be erased and
5
+ # re-generated from your development database when you run "rake".
6
+ # Do not set this db to the same as development or production.
7
+ test:
8
+ adapter: sqlite3
9
+ database: db/test.sqlite3
10
+ pool: 5
11
+ timeout: 5000
@@ -0,0 +1,12 @@
1
+ # Be sure to restart your server when you modify this file
2
+
3
+ # Specifies gem version of Rails to use when vendor/rails is not present
4
+ RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION
5
+
6
+ # Bootstrap the Rails environment, frameworks, and default configuration
7
+ require File.join(File.dirname(__FILE__), 'boot')
8
+
9
+ Rails::Initializer.run do |config|
10
+ config.action_controller.session = { :key => "_myapp_session",
11
+ :secret => "some secret phrase which is longer than 30 characters" }
12
+ end
File without changes
@@ -0,0 +1,15 @@
1
+ class CreatePeople < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :people do |t|
4
+ t.string :type
5
+ t.string :name
6
+ t.string :email
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ drop_table :people
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ class CreateEmployeeProperties < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :employee_properties do |t|
4
+ t.integer :reports_to
5
+ t.string :department
6
+ t.integer :employee_id
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ drop_table :employee_properties
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ class CreateCustomerDetails < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :customer_details do |t|
4
+ t.string :phone
5
+ t.integer :customer_id
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :customer_details
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ # This file is auto-generated from the current state of the database. Instead of editing this file,
2
+ # please use the migrations feature of Active Record to incrementally modify your database, and
3
+ # then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
+ # to create the application database on another system, you should be using db:schema:load, not running
7
+ # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
9
+ #
10
+ # It's strongly recommended to check this file into your version control system.
11
+
12
+ ActiveRecord::Schema.define(:version => 20090820110621) do
13
+
14
+ create_table "customer_details", :force => true do |t|
15
+ t.string "phone"
16
+ t.integer "customer_id"
17
+ t.datetime "created_at"
18
+ t.datetime "updated_at"
19
+ end
20
+
21
+ create_table "employee_properties", :force => true do |t|
22
+ t.integer "reports_to"
23
+ t.string "department"
24
+ t.integer "employee_id"
25
+ t.datetime "created_at"
26
+ t.datetime "updated_at"
27
+ end
28
+
29
+ create_table "people", :force => true do |t|
30
+ t.string "type"
31
+ t.string "name"
32
+ t.string "email"
33
+ t.datetime "created_at"
34
+ t.datetime "updated_at"
35
+ end
36
+
37
+ end
@@ -0,0 +1,15 @@
1
+ # Using the STI example from 'Agile Web development with Rails' Second Edition - 18.4
2
+
3
+ $: << File.join(File.dirname(__FILE__), '..', 'lib')
4
+ $: << File.join(File.dirname(__FILE__))
5
+
6
+ ENV["RAILS_ENV"] = "test"
7
+
8
+ require 'has_attributes_from'
9
+ require File.expand_path(File.dirname(__FILE__) + "/rails_root/config/environment")
10
+ require 'test_help'
11
+ require 'shoulda'
12
+ require 'factory_girl'
13
+ require 'test/factories/general'
14
+ require 'set'
15
+
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class CustomerDetailTest < Test::Unit::TestCase
4
+ context 'A customer_detail' do
5
+ setup do
6
+ @customer_detail = Factory(:customer_detail)
7
+ end
8
+
9
+ should 'be valid' do
10
+ assert_valid @customer_detail
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,70 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class CustomerTest < Test::Unit::TestCase
4
+ context 'A customer with_properties' do
5
+ setup do
6
+ @customer = Factory(:customer)
7
+ @customer.customer_detail=Factory(:customer_detail, :phone=>'0222311304', :customer_id=>@customer)
8
+ @customer.save
9
+ end
10
+
11
+ should_have_one :customer_detail
12
+ should_have_class_methods :has_attributes_from
13
+ should_have_instance_methods :save_properties
14
+ should_have_instance_methods :phone
15
+ should_have_instance_methods :phone=
16
+
17
+ should 'be valid' do
18
+ assert_valid @customer
19
+ end
20
+
21
+ should 'return its phone number (based on customer properties)' do
22
+ assert_equal '0222311304', @customer.phone
23
+ end
24
+
25
+ should 'create a customer with its properties' do
26
+ customer = Customer.create(:name =>'Dovadi', :email=>'frank@dovadi.com', :phone=>'0649416406')
27
+ assert_valid customer
28
+ assert_valid customer.customer_detail
29
+ end
30
+
31
+ should 'update attributes with a property' do
32
+ customer = Customer.create(:name =>'Dovadi', :email=>'frank@dovadi.com')
33
+ customer.update_attributes(:phone=>'0222300100')
34
+ customer.reload
35
+ assert_equal '0222300100', customer.phone
36
+ end
37
+
38
+ should 'update one attribute with a property' do
39
+ customer = Customer.create(:name =>'Dovadi', :email=>'frank@dovadi.com')
40
+ customer.update_attribute(:phone,'0222300200')
41
+ customer.reload
42
+ assert_equal '0222300200', customer.phone
43
+ end
44
+ end
45
+
46
+ context 'Validations of a property (through customer_detail)' do
47
+ setup do
48
+ @customer = Factory(:customer)
49
+ @customer.customer_detail=Factory(:customer_detail, :phone=>'0222311304', :customer_id=>@customer)
50
+ @customer.save
51
+ end
52
+ should_ensure_length_in_range :phone, 10..10
53
+
54
+ should "validate length of phone (which is a property through customer_detail)" do
55
+ @customer.phone="012345678"
56
+ assert !@customer.save
57
+ end
58
+
59
+ should "validate format of phone (which is a property through customer_detail)" do
60
+ @customer.phone="012345678A"
61
+ assert !@customer.save
62
+ end
63
+
64
+ should "allow blank a phone number (which is a property through customer_detail)" do
65
+ @customer.phone=""
66
+ assert @customer.save
67
+ end
68
+ end
69
+
70
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class EmployeePropertyTest < Test::Unit::TestCase
4
+ context 'A employee_property' do
5
+ setup do
6
+ @employee_property = Factory(:employee_property)
7
+ end
8
+
9
+ should 'be valid' do
10
+ assert_valid @employee_property
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,48 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class EmployeeTest < Test::Unit::TestCase
4
+ context 'An employee with_properties' do
5
+ setup do
6
+ @employee = Factory(:employee)
7
+ @employee.employee_property=Factory(:employee_property, :reports_to=>123, :department=>'Sales', :employee_id=>@employee)
8
+ @employee.save
9
+ end
10
+
11
+ should_have_one :employee_property
12
+ should_have_class_methods :has_attributes_from
13
+ should_have_instance_methods :save_properties
14
+ should_have_instance_methods :department
15
+ should_have_instance_methods :department=
16
+ should_have_instance_methods :reports_to
17
+ should_have_instance_methods :reports_to=
18
+
19
+ should 'be valid' do
20
+ assert_valid @employee
21
+ end
22
+
23
+ should 'return its department (based on employee properties)' do
24
+ assert_equal 'Sales', @employee.department
25
+ end
26
+
27
+ should 'create a employee with its properties' do
28
+ employee = Employee.create(:name =>'Dovadi', :email=>'frank@dovadi.com', :reports_to=>55, :department=>'Customer support')
29
+ assert_valid employee
30
+ assert_valid employee.employee_property
31
+ end
32
+
33
+ should 'update attributes with a property' do
34
+ employee = Employee.create(:name =>'Dovadi', :email=>'frank@dovadi.com')
35
+ employee.update_attributes(:reports_to=>100)
36
+ employee.reload
37
+ assert_equal 100, employee.reports_to
38
+ end
39
+
40
+ should 'update one attribute with a property' do
41
+ employee = Employee.create(:name =>'Dovadi', :email=>'frank@dovadi.com')
42
+ employee.update_attribute(:reports_to,200)
43
+ employee.reload
44
+ assert_equal 200, employee.reports_to
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class ManagerTest < Test::Unit::TestCase
4
+ context 'A manager' do
5
+ setup do
6
+ @manager = Factory(:manager)
7
+ end
8
+
9
+ should 'be valid' do
10
+ assert_valid @manager
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class PersonTest < Test::Unit::TestCase
4
+ context 'A person' do
5
+ setup do
6
+ @person = Factory(:person)
7
+ end
8
+
9
+ should 'be valid' do
10
+ assert_valid @person
11
+ end
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: has_attributes_from
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Frank Oxener
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-08-21 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Merge the attributes from another ActiveRecord class to an individual STI subclass.
17
+ email: frank.oxener@dovadi.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - History.txt
26
+ - Manifest.txt
27
+ - Rakefile
28
+ - README.textile
29
+ - lib/has_attributes_from/base.rb
30
+ - lib/has_attributes_from.rb
31
+ - tasks/has_attributes_from.rake
32
+ - test/factories/general.rb
33
+ - test/rails_root/app/models/customer.rb
34
+ - test/rails_root/app/models/customer_detail.rb
35
+ - test/rails_root/app/models/employee.rb
36
+ - test/rails_root/app/models/employee_property.rb
37
+ - test/rails_root/app/models/manager.rb
38
+ - test/rails_root/app/models/person.rb
39
+ - test/rails_root/config/boot.rb
40
+ - test/rails_root/config/database.yml
41
+ - test/rails_root/config/environment.rb
42
+ - test/rails_root/config/environments/test.rb
43
+ - test/rails_root/config/routes.rb
44
+ - test/rails_root/db/migrate/20090820105348_create_people.rb
45
+ - test/rails_root/db/migrate/20090820105521_create_employee_properties.rb
46
+ - test/rails_root/db/migrate/20090820110621_create_customer_details.rb
47
+ - test/rails_root/db/schema.rb
48
+ - test/rails_root/db/test.sqlite3
49
+ - test/test_helper.rb
50
+ - test/unit/customer_detail_test.rb
51
+ - test/unit/customer_test.rb
52
+ - test/unit/employee_property_test.rb
53
+ - test/unit/employee_test.rb
54
+ - test/unit/manager_test.rb
55
+ - test/unit/person_test.rb
56
+ has_rdoc: false
57
+ homepage: http://github.com/dovadi/has_attributes_from
58
+ licenses: []
59
+
60
+ post_install_message:
61
+ rdoc_options: []
62
+
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: "0"
70
+ version:
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: "0"
76
+ version:
77
+ requirements: []
78
+
79
+ rubyforge_project:
80
+ rubygems_version: 1.3.2
81
+ signing_key:
82
+ specification_version: 3
83
+ summary: Merge the attributes from another ActiveRecord class to an individual STI subclass.
84
+ test_files: []
85
+