has_one_autocreate 1.0.0

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,4 @@
1
+ v1.0.0. Minor improvements to project and relased to gemcutter.
2
+ v0.0.3. Bumping version for no good reason!
3
+ v0.0.2. Initial gem, cleaned up project and abstracted tests some.
4
+ v0.0.1. Initial release.
@@ -0,0 +1,9 @@
1
+ CHANGELOG
2
+ init.rb
3
+ lib/has_one_autocreate.rb
4
+ Manifest
5
+ Rakefile
6
+ README.rdoc
7
+ spec/has_one_autocreate_spec.rb
8
+ spec/models.rb
9
+ spec/spec_helper.rb
@@ -0,0 +1,45 @@
1
+ = Has One Autocreate
2
+
3
+ Automatic creation of a has_one associated object when it is first accessed.
4
+
5
+ == Examples
6
+
7
+ class User < ActiveRecord::Base
8
+ has_one :profile, :autocreate => true
9
+ end
10
+
11
+ class Profile < ActiveRecord::Base
12
+ belongs_to :user
13
+ end
14
+
15
+ # make a single user
16
+ >> user = User.create(:name => 'Dr. User')
17
+ => #<User id: 1, name: "Dr. User">
18
+
19
+ # look for any profile objects
20
+ >> Profile.count
21
+ => 0
22
+
23
+ # access the user's profile object to see it automatically created
24
+ >> user.profile
25
+ => #<Profile id: 1, title: nil, user_id: 1>
26
+
27
+
28
+ == Install
29
+
30
+ As a Rails plugin.
31
+
32
+ ./script/plugin install git://github.com/jqr/has_one_autocreate.git
33
+
34
+ Prefer gems? Add this to your environment.rb and run the following command.
35
+
36
+ config.gem 'has_one_autocreate'
37
+
38
+ $ rake gems:install
39
+
40
+ == Docs
41
+
42
+ http://rdoc.info/projects/jqr/has_one_autocreate
43
+
44
+ Homepage:: http://github.com/jqr/has_one_autocreate
45
+ License:: Copyright (c) 2008 Elijah Miller <mailto:elijah.miller@gmail.com>, released under the MIT license.
@@ -0,0 +1,18 @@
1
+ require 'spec/rake/spectask'
2
+
3
+ require 'echoe'
4
+ Echoe.new 'has_one_autocreate' do |p|
5
+ p.description = "Automatic creation and building for has_one relationships."
6
+ p.url = "http://github.com/jqr/has_one_autocreate"
7
+ p.author = "Elijah Miller"
8
+ p.email = "elijah.miller@gmail.com"
9
+ p.retain_gemspec = true
10
+ p.need_tar_gz = false
11
+ p.extra_deps = [
12
+ ]
13
+ p.ignore_pattern = ['spec/test.sqlite3']
14
+ end
15
+
16
+ desc 'Default: run specs'
17
+ task :default => :spec
18
+ task :test => :spec
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{has_one_autocreate}
5
+ s.version = "1.0.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Elijah Miller"]
9
+ s.date = %q{2009-12-03}
10
+ s.description = %q{Automatic creation and building for has_one relationships.}
11
+ s.email = %q{elijah.miller@gmail.com}
12
+ s.extra_rdoc_files = ["CHANGELOG", "lib/has_one_autocreate.rb", "README.rdoc"]
13
+ s.files = ["CHANGELOG", "init.rb", "lib/has_one_autocreate.rb", "Manifest", "Rakefile", "README.rdoc", "spec/has_one_autocreate_spec.rb", "spec/models.rb", "spec/spec_helper.rb", "has_one_autocreate.gemspec"]
14
+ s.homepage = %q{http://github.com/jqr/has_one_autocreate}
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Has_one_autocreate", "--main", "README.rdoc"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{has_one_autocreate}
18
+ s.rubygems_version = %q{1.3.5}
19
+ s.summary = %q{Automatic creation and building for has_one relationships.}
20
+
21
+ if s.respond_to? :specification_version then
22
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
+ s.specification_version = 3
24
+
25
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
26
+ else
27
+ end
28
+ else
29
+ end
30
+ end
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'has_one_autocreate'
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'activerecord'
3
+
4
+ # Functional prototype of automatic create/build on a has_one relationship.
5
+ # TODO: needs to be loaded before cache_fu extensions.
6
+ module HasOneAutocreate
7
+ # TODO: alias_method_chainize these
8
+ module ClassMethods
9
+ def has_one(*args)
10
+ options = args.extract_options!
11
+ autocreate = options.delete(:autocreate)
12
+ args << options
13
+ super(*args)
14
+
15
+ if autocreate
16
+ reflections[args.first].send "autocreate=", autocreate
17
+ end
18
+ end
19
+ end
20
+
21
+ module InstanceMethods
22
+ # TODO: Move to find_target once we're in front of cache_fu.
23
+ def reload
24
+ value = find_target
25
+ if value
26
+ @target = value
27
+ elsif method = @reflection.send(:autocreate)
28
+ @target =
29
+ case method
30
+ when true
31
+ create!
32
+ when Symbol, String
33
+ self.send(method)
34
+ when false
35
+ # nop
36
+ else
37
+ # default
38
+ # ActiveRecord::Associations::HasOneAssociation.autocreate
39
+ end
40
+ end
41
+ loaded
42
+ end
43
+ end
44
+ end
45
+
46
+ ActiveRecord::Base.extend HasOneAutocreate::ClassMethods
47
+ ActiveRecord::Associations::HasOneAssociation.send :include, HasOneAutocreate::InstanceMethods
48
+ ActiveRecord::Reflection::AssociationReflection.send :attr_accessor, :autocreate
@@ -0,0 +1,76 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+
4
+ describe HasOneAutocreate do
5
+ before(:all) do
6
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3',
7
+ :database => TEST_DATABASE_FILE)
8
+
9
+ User.connection.create_table :users do |t|
10
+ t.string :name
11
+ end
12
+
13
+ Profile.connection.create_table :profiles do |t|
14
+ t.integer :user_id
15
+ end
16
+ end
17
+
18
+ after(:all) do
19
+ User.connection.drop_table(:users)
20
+ Profile.connection.drop_table(:profiles)
21
+
22
+ FileUtils.rm(TEST_DATABASE_FILE) if File.exist?(TEST_DATABASE_FILE)
23
+ end
24
+
25
+ before(:each) do
26
+ @user = User.create(:name => 'Dr. User')
27
+ end
28
+
29
+ describe 'before accessing the profile' do
30
+ it "has NOT created the profile" do
31
+ Profile.count.should == 0
32
+ end
33
+ end
34
+
35
+ describe 'after accessing the profile' do
36
+ before(:each) do
37
+ @profile = @user.profile
38
+ end
39
+
40
+ it "creates the profile" do
41
+ Profile.count.should_not == 0
42
+ end
43
+
44
+ it "is a profile" do
45
+ @profile.should be_kind_of(Profile)
46
+ end
47
+ end
48
+
49
+ describe 'with an unsaved user' do
50
+
51
+ before(:each) do
52
+ @user = User.new(:name => 'Dr. User')
53
+ end
54
+
55
+ describe 'before accessing the profile' do
56
+ it "has NOT created the profile" do
57
+ Profile.count.should == 0
58
+ end
59
+ end
60
+
61
+ describe 'after accessing the profile' do
62
+ before(:each) do
63
+ @profile = @user.profile
64
+ end
65
+
66
+ it "does not create the profile" do
67
+ Profile.count.should_not == 0
68
+ end
69
+
70
+ it "is a profile" do
71
+ @profile.should be_kind_of(Profile)
72
+ end
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,7 @@
1
+ class User < ActiveRecord::Base
2
+ has_one :profile, :autocreate => true
3
+ end
4
+
5
+ class Profile < ActiveRecord::Base
6
+ belongs_to :user
7
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec'
2
+ require 'fileutils'
3
+
4
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'has_one_autocreate')
5
+
6
+ require File.join(File.dirname(__FILE__), 'models')
7
+
8
+ TEST_DATABASE_FILE = File.join(File.dirname(__FILE__), 'test.sqlite3')
9
+
10
+ Spec::Runner.configure do |config|
11
+
12
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: has_one_autocreate
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Elijah Miller
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-03 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Automatic creation and building for has_one relationships.
17
+ email: elijah.miller@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - CHANGELOG
24
+ - lib/has_one_autocreate.rb
25
+ - README.rdoc
26
+ files:
27
+ - CHANGELOG
28
+ - init.rb
29
+ - lib/has_one_autocreate.rb
30
+ - Manifest
31
+ - Rakefile
32
+ - README.rdoc
33
+ - spec/has_one_autocreate_spec.rb
34
+ - spec/models.rb
35
+ - spec/spec_helper.rb
36
+ - has_one_autocreate.gemspec
37
+ has_rdoc: true
38
+ homepage: http://github.com/jqr/has_one_autocreate
39
+ licenses: []
40
+
41
+ post_install_message:
42
+ rdoc_options:
43
+ - --line-numbers
44
+ - --inline-source
45
+ - --title
46
+ - Has_one_autocreate
47
+ - --main
48
+ - README.rdoc
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
+ version:
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "1.2"
62
+ version:
63
+ requirements: []
64
+
65
+ rubyforge_project: has_one_autocreate
66
+ rubygems_version: 1.3.5
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: Automatic creation and building for has_one relationships.
70
+ test_files: []
71
+