sjain-natural_key 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,8 @@
1
+ == 0.1.0 2009-01-07
2
+ * fixed to accept hash with string keys in addition to symbols
3
+ * cleaned up unnecessary files
4
+ * using Echoe instead of newgem for gem generation
5
+ * github updated
6
+
7
+ == 0.0.1 2009-01-07
8
+ * initial release
@@ -1,14 +1,13 @@
1
- .gitignore
2
- History.txt
3
- lib/natural_key/natural_key.rb
4
- lib/natural_key.rb
5
- Manifest.txt
6
- PostInstall.txt
1
+ CHANGELOG
7
2
  Rakefile
8
3
  README.rdoc
9
- test/database.yml
4
+ Manifest
5
+ lib/natural_key/base.rb
6
+ lib/natural_key.rb
10
7
  test/fixtures/schema.rb
11
- test/lib/activerecord_test_case.rb
12
- test/lib/activerecord_test_connector.rb
13
8
  test/test_helper.rb
9
+ test/database.yml
14
10
  test/test_natural_key.rb
11
+ test/lib/activerecord_test_connector.rb
12
+ test/lib/activerecord_test_case.rb
13
+ VERSION.yml
data/README.rdoc CHANGED
@@ -6,34 +6,31 @@
6
6
 
7
7
  This gem adds create_or_update functionality to ActiveRecord based on a user-defined natural-key.
8
8
 
9
- == FEATURES/PROBLEMS:
10
-
11
- * TODO
12
-
13
9
  == SYNOPSIS:
14
10
 
15
- #
16
- # Table users(first_name varchar, last_name varchar, age integer, address string, salary integer)
17
- #
18
- class User < ActiveRecord::Base
19
- natural_key :first_name, :last_name
20
- end
11
+ Define natural key for your model as follows:
21
12
 
22
- User.create_or_update_by_natural_key(:first_name => 'John', :last_name => "Smith", :age => 25, :address => "New York")
13
+ #
14
+ # Table users(first_name varchar, last_name varchar, age integer, address string, salary integer)
15
+ #
16
+ class User < ActiveRecord::Base
17
+ natural_key :first_name, :last_name
18
+ end
23
19
 
24
- == REQUIREMENTS:
20
+ With this in place, a method 'create_or_update_by_natural_key' can be used to invoke create/update.
25
21
 
26
- * TODO
22
+ User.create_or_update_by_natural_key(:first_name => 'John', :last_name => "Smith", :age => 25, :address => "New York")
27
23
 
28
24
  == INSTALL:
29
25
 
30
- * gem install natural_key; rake gems:unpack GEM=natural_key
26
+ gem sources -a http://gems.github.com
27
+ gem install sjain-natural_key
31
28
 
32
29
  == LICENSE:
33
30
 
34
31
  (The MIT License)
35
32
 
36
- Copyright (c) 2009 FIXME full name
33
+ Copyright (c) 2009 Pathfinder Associates, LLC.
37
34
 
38
35
  Permission is hereby granted, free of charge, to any person obtaining
39
36
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -1,28 +1,15 @@
1
- %w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
2
- require File.dirname(__FILE__) + '/lib/natural_key'
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+ require 'lib/natural_key'
3
5
 
4
- # Generate all the Rake tasks
5
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
6
- $hoe = Hoe.new('natural_key', NaturalKey::VERSION) do |p|
7
- p.developer('Pathfinder Associates', 'info@pathf.com')
8
- p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
- p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
10
- p.rubyforge_name = p.name # TODO this is default value
11
- # p.extra_deps = [
12
- # ['activesupport','>= 2.0.2'],
13
- # ]
14
- p.extra_dev_deps = [
15
- ['newgem', ">= #{::Newgem::VERSION}"]
16
- ]
17
-
18
- p.clean_globs |= %w[**/.DS_Store tmp *.log]
19
- path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
20
- p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
21
- p.rsync_args = '-av --delete --ignore-errors'
6
+ Echoe.new('natural_key', NaturalKey::VERSION) do |p|
7
+ p.description = "ActiveRecord.create_or_update based on a user-defined natural-key"
8
+ p.url = "http://github.com/sjain/natural_key"
9
+ p.author = "Sharad Jain"
10
+ p.email = "shaanjain@gmail.com"
11
+ p.ignore_pattern = ["tmp/*", "script/*", "nbproject/**/*"]
12
+ p.development_dependencies = []
22
13
  end
23
14
 
24
- require 'newgem/tasks' # load /tasks/*.rake
25
- Dir['tasks/**/*.rake'].each { |t| load t }
26
-
27
- # TODO - want other tests/tasks run by default? Add them to the list
28
- # task :default => [:spec, :features]
15
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 0
3
+ :minor: 1
4
+ :patch: 0
data/lib/natural_key.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
- require 'natural_key/natural_key'
5
-
6
4
  module NaturalKey
7
- VERSION = '0.0.1'
5
+ version = YAML.load_file(File.dirname(__FILE__) + "/../VERSION.yml")
6
+ VERSION = "#{version[:major]}.#{version[:minor]}.#{version[:patch]}"
8
7
  end
8
+
9
+ require 'natural_key/base'
@@ -0,0 +1,38 @@
1
+ require 'activerecord'
2
+
3
+ module NaturalKey
4
+ module Base
5
+ def natural_key(*key_attributes)
6
+ # TODO validate the supplied key_attributes are subset of all attributes
7
+ # TODO key_attributes should default to primary_key/surrogate_key (:id)
8
+ # TODO if natural_key is composed of non-primary-key, then it should not contain primary_key
9
+ raise "natural key attributes cannot be empty" if key_attributes.empty?
10
+ @@key_attributes = key_attributes
11
+ end
12
+
13
+ # can't use method "create_or_update" since there is already a private method with that name
14
+ # in ActiveRecord::Base
15
+ # TODO The following method should only be made available when natural_key is called with proper
16
+ # attributes. (hint: use class_eval?)
17
+ def create_or_update_by_natural_key(options)
18
+ options.symbolize_keys!
19
+ #TODO options should contain all key_attributes, and their values should be non-nil
20
+ key_options = options.reject { |k,v| !@@key_attributes.include?(k) }
21
+ record = find(:first, :conditions => key_options)
22
+ if(record.nil?)
23
+ record = create(options)
24
+ else
25
+ record.update_attributes!(options)
26
+ end
27
+ record
28
+ end
29
+ end
30
+ end
31
+
32
+ module ActiveRecord
33
+ class Base
34
+ class << self
35
+ include NaturalKey::Base
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{natural_key}
5
+ s.version = "0.1.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Sharad Jain"]
9
+ s.date = %q{2009-08-08}
10
+ s.description = %q{ActiveRecord.create_or_update based on a user-defined natural-key}
11
+ s.email = %q{shaanjain@gmail.com}
12
+ s.extra_rdoc_files = ["CHANGELOG", "README.rdoc", "lib/natural_key/base.rb", "lib/natural_key.rb"]
13
+ s.files = ["CHANGELOG", "Rakefile", "README.rdoc", "Manifest", "lib/natural_key/base.rb", "lib/natural_key.rb", "test/fixtures/schema.rb", "test/test_helper.rb", "test/database.yml", "test/test_natural_key.rb", "test/lib/activerecord_test_connector.rb", "test/lib/activerecord_test_case.rb", "VERSION.yml", "natural_key.gemspec"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://github.com/sjain/natural_key}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Natural_key", "--main", "README.rdoc"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{natural_key}
19
+ s.rubygems_version = %q{1.3.1}
20
+ s.summary = %q{ActiveRecord.create_or_update based on a user-defined natural-key}
21
+ s.test_files = ["test/test_helper.rb", "test/test_natural_key.rb"]
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 2
26
+
27
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
+ else
29
+ end
30
+ else
31
+ end
32
+ end
@@ -1,6 +1,8 @@
1
1
  require 'lib/activerecord_test_connector'
2
2
 
3
- class ActiveRecordTestCase < Test::Unit::TestCase
3
+ class ActiveRecordTestCase < ActiveRecord::TestCase
4
+ include ActiveRecord::TestFixtures
5
+
4
6
  # Set our fixture path
5
7
  if ActiveRecordTestConnector.able_to_connect
6
8
  self.fixture_path = File.join(File.dirname(__FILE__), '..', 'fixtures')
@@ -15,22 +17,18 @@ class ActiveRecordTestCase < Test::Unit::TestCase
15
17
  super if ActiveRecordTestConnector.connected
16
18
  end
17
19
 
18
- # Default so Test::Unit::TestCase doesn't complain
19
- def test_truth
20
- end
21
-
22
20
  protected
23
21
 
24
- def assert_queries(num = 1)
25
- $query_count = 0
26
- yield
27
- ensure
28
- assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
29
- end
22
+ def assert_queries(num = 1)
23
+ $query_count = 0
24
+ yield
25
+ ensure
26
+ assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
27
+ end
30
28
 
31
- def assert_no_queries(&block)
32
- assert_queries(0, &block)
33
- end
29
+ def assert_no_queries(&block)
30
+ assert_queries(0, &block)
31
+ end
34
32
  end
35
33
 
36
34
  ActiveRecordTestConnector.setup
@@ -1,3 +1,4 @@
1
+ require 'rubygems'
1
2
  require 'active_record'
2
3
  require 'active_record/version'
3
4
  require 'active_record/fixtures'
@@ -32,7 +33,7 @@ class ActiveRecordTestConnector
32
33
  end
33
34
 
34
35
  def self.setup_connection
35
- db = ENV['DB'].blank?? 'mysql' : ENV['DB']
36
+ db = ENV['DB'].blank?? 'sqlite3' : ENV['DB']
36
37
 
37
38
  configurations = YAML.load_file(File.join(File.dirname(__FILE__), '..', 'database.yml'))
38
39
  raise "no configuration for '#{db}'" unless configurations.key? db
data/test/test_helper.rb CHANGED
@@ -4,7 +4,7 @@ require 'lib/activerecord_test_case'
4
4
  require File.dirname(__FILE__) + '/../lib/natural_key'
5
5
 
6
6
  # gem install redgreen for colored test output
7
- begin require 'redgreen'; rescue LoadError; end
7
+ #begin require 'redgreen'; rescue LoadError; end
8
8
 
9
9
  # The following is not required since we use active-record gem installed on the system
10
10
  #require 'boot' unless defined?(ActiveRecord)
@@ -5,6 +5,13 @@ class User < ActiveRecord::Base
5
5
  end
6
6
 
7
7
  class TestNaturalKey < ActiveRecordTestCase
8
+ def test_create_by_natural_key
9
+ created_record = User.create(:first_name => 'John', :last_name => "Smith", :age => 21, :address => "Chicago")
10
+ updated_record = User.create_or_update_by_natural_key(:first_name => 'Different', :last_name => "Smith", :age => 25, :address => "New York")
11
+ assert_not_equal(created_record.id, updated_record.id)
12
+ assert_equal(25, updated_record.age)
13
+ assert_equal("New York", updated_record.address)
14
+ end
8
15
  def test_update_by_natural_key
9
16
  created_record = User.create(:first_name => 'John', :last_name => "Smith", :age => 21, :address => "Chicago")
10
17
  updated_record = User.create_or_update_by_natural_key(:first_name => 'John', :last_name => "Smith", :age => 25, :address => "New York")
@@ -12,10 +19,14 @@ class TestNaturalKey < ActiveRecordTestCase
12
19
  assert_equal(25, updated_record.age)
13
20
  assert_equal("New York", updated_record.address)
14
21
  end
15
- def test_create_by_natural_key
16
- created_record = User.create(:first_name => 'John', :last_name => "Smith", :age => 21, :address => "Chicago")
17
- updated_record = User.create_or_update_by_natural_key(:first_name => 'Different', :last_name => "Smith", :age => 25, :address => "New York")
18
- assert_not_equal(created_record.id, updated_record.id)
22
+ def test_update_by_natural_key_when_keys_are_strings_instead_of_symbols
23
+ User.create(:first_name => 'Mary', :last_name => "Beth", :age => 21, :address => "Chicago")
24
+ john_smith = User.create(:first_name => 'John', :last_name => "Smith", :age => 21, :address => "Chicago")
25
+ updated_record = User.create_or_update_by_natural_key('first_name' => 'John',
26
+ 'last_name' => "Smith",
27
+ 'age' => 25,
28
+ 'address' => "New York")
29
+ assert_equal(john_smith.id, updated_record.id)
19
30
  assert_equal(25, updated_record.age)
20
31
  assert_equal("New York", updated_record.address)
21
32
  end
metadata CHANGED
@@ -1,66 +1,53 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sjain-natural_key
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - Pathfinder Associates
7
+ - Sharad Jain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-09 00:00:00 -08:00
12
+ date: 2009-08-08 00:00:00 -07:00
13
13
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: newgem
17
- version_requirement:
18
- version_requirements: !ruby/object:Gem::Requirement
19
- requirements:
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 1.2.3
23
- version:
24
- - !ruby/object:Gem::Dependency
25
- name: hoe
26
- version_requirement:
27
- version_requirements: !ruby/object:Gem::Requirement
28
- requirements:
29
- - - ">="
30
- - !ruby/object:Gem::Version
31
- version: 1.8.0
32
- version:
33
- description: This gem adds create_or_update functionality to ActiveRecord based on a user-defined natural-key.
34
- email:
35
- - info@pathf.com
14
+ dependencies: []
15
+
16
+ description: ActiveRecord.create_or_update based on a user-defined natural-key
17
+ email: shaanjain@gmail.com
36
18
  executables: []
37
19
 
38
20
  extensions: []
39
21
 
40
22
  extra_rdoc_files:
41
- - History.txt
42
- - Manifest.txt
43
- - PostInstall.txt
23
+ - CHANGELOG
44
24
  - README.rdoc
45
- files:
46
- - .gitignore
47
- - History.txt
48
- - lib/natural_key/natural_key.rb
25
+ - lib/natural_key/base.rb
49
26
  - lib/natural_key.rb
50
- - Manifest.txt
51
- - PostInstall.txt
27
+ files:
28
+ - CHANGELOG
52
29
  - Rakefile
53
30
  - README.rdoc
54
- - test/database.yml
31
+ - Manifest
32
+ - lib/natural_key/base.rb
33
+ - lib/natural_key.rb
55
34
  - test/fixtures/schema.rb
56
- - test/lib/activerecord_test_case.rb
57
- - test/lib/activerecord_test_connector.rb
58
35
  - test/test_helper.rb
36
+ - test/database.yml
59
37
  - test/test_natural_key.rb
38
+ - test/lib/activerecord_test_connector.rb
39
+ - test/lib/activerecord_test_case.rb
40
+ - VERSION.yml
41
+ - natural_key.gemspec
60
42
  has_rdoc: true
61
- homepage: http://www.pathf.com
62
- post_install_message: PostInstall.txt
43
+ homepage: http://github.com/sjain/natural_key
44
+ licenses:
45
+ post_install_message:
63
46
  rdoc_options:
47
+ - --line-numbers
48
+ - --inline-source
49
+ - --title
50
+ - Natural_key
64
51
  - --main
65
52
  - README.rdoc
66
53
  require_paths:
@@ -75,15 +62,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
62
  requirements:
76
63
  - - ">="
77
64
  - !ruby/object:Gem::Version
78
- version: "0"
65
+ version: "1.2"
79
66
  version:
80
67
  requirements: []
81
68
 
82
69
  rubyforge_project: natural_key
83
- rubygems_version: 1.2.0
70
+ rubygems_version: 1.3.5
84
71
  signing_key:
85
72
  specification_version: 2
86
- summary: This gem adds create_or_update functionality to ActiveRecord based on a user-defined natural-key.
73
+ summary: ActiveRecord.create_or_update based on a user-defined natural-key
87
74
  test_files:
88
75
  - test/test_helper.rb
89
76
  - test/test_natural_key.rb
data/.gitignore DELETED
@@ -1 +0,0 @@
1
- pkg/*
data/History.txt DELETED
@@ -1,4 +0,0 @@
1
- == 0.0.1 2009-01-07
2
-
3
- * 1 major enhancement:
4
- * Initial release
data/PostInstall.txt DELETED
@@ -1,7 +0,0 @@
1
-
2
- For more information on ar_natural_key_utils, see http://ar_natural_key_utils.rubyforge.org
3
-
4
- NOTE: Change this information in PostInstall.txt
5
- You can also delete it if you don't want it.
6
-
7
-
@@ -1,37 +0,0 @@
1
- module ActiveRecord
2
- class Base
3
- class << self
4
- def natural_key(*key_attributes)
5
- # TODO validate the supplied key_attributes are subset of all attributes
6
- # TODO key_attributes should default to primary_key/surrogate_key (:id)
7
- # TODO if natural_key is composed of non-primary-key, then it should not contain primary_key
8
- raise "natural key attributes cannot be empty" if key_attributes.empty?
9
- @@key_attributes = key_attributes
10
- end
11
-
12
- # can't use method "create_or_update" since there is already a private method with that name
13
- # in ActiveRecord::Base
14
- # TODO The following method should only be made available when natural_key is called with proper
15
- # attributes. (hint: use class_eval?)
16
- def create_or_update_by_natural_key(options)
17
- #TODO options should contain all key_attributes, and their values should be non-nil
18
- key_options = options.reject { |k,v| !@@key_attributes.include?(k) }
19
- record = find(:first, :conditions => key_options)
20
- if(record.nil?)
21
- record = create(options)
22
- else
23
- record.update_attributes!(options)
24
- end
25
- record
26
- end
27
- end
28
- end
29
- end
30
-
31
- #module NaturalKey
32
- # def self.included other
33
- # other.extend self
34
- # end
35
- #end
36
- #
37
- #ActiveRecord::Base.send :include, NaturalKey