active_record_uuid 0.0.1 → 0.1.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,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Serializer" do
4
+ it "should raise exception when loading invalid uuid" do
5
+ @serializer = ActiveRecordUuid::Serializer.new(:binary)
6
+
7
+ lambda {
8
+ @serializer.load("abkc")
9
+ }.should raise_error ActiveRecord::SerializationTypeMismatch
10
+ end
11
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe "String Uuid" do
4
+ context "configure: Post model" do
5
+ it "should have uuid as primary key based config" do
6
+ Post.primary_key.should eq('uuid')
7
+ end
8
+
9
+ it "should store uuid as String" do
10
+ post = Post.create(:text => "String uuid1")
11
+ post.reload
12
+
13
+ post.attributes_before_type_cast["uuid"]["value"].bytesize.should eq(36)
14
+ end
15
+
16
+ it "should retreive back as uuid string from String" do
17
+ post = Post.create(:text => "String uuid2")
18
+ post.reload
19
+
20
+ post.uuid.should be_present
21
+ post.uuid.should be_instance_of(String)
22
+ post.uuid.length.should eq(36)
23
+ end
24
+
25
+ it "should retreive uuid back with the same value that was assigned" do
26
+ post = Post.new(:text => "String uuid2")
27
+ post.uuid = "b360c78e-b62e-11e1-9870-0026b90faf3c"
28
+ post.save
29
+ post.reload
30
+
31
+ post.uuid.should eq("b360c78e-b62e-11e1-9870-0026b90faf3c")
32
+ post.uuid.should be_instance_of(String)
33
+ post.uuid.length.should eq(36)
34
+ end
35
+
36
+ it "should find by uuid column" do
37
+ post = Post.create(:text => "String uuid3")
38
+
39
+ Post.find_by_uuid(post.uuid).should eq(post)
40
+ Post.where(:uuid => post.uuid).should eq([post])
41
+ end
42
+
43
+ it "should find by primary key" do
44
+ post = Post.create(:text => "String uuid4")
45
+
46
+ Post.find(post).should eq(post)
47
+ Post.find(post.uuid).should eq(post)
48
+ end
49
+
50
+ it "should find by array of primary keys" do
51
+ post1 = Post.create(:text => "String uuid5")
52
+ post2 = Post.create(:text => "String uuid6")
53
+
54
+ Post.find([post1.uuid, post2.uuid]).should eq([post1, post2])
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+
3
+ describe "UuidConfig" do
4
+ context "uuid base configuration - default option" do
5
+ it "should not use primary_key" do
6
+ Article.primary_key.should eq("id")
7
+ end
8
+
9
+ it "should not set association" do
10
+ Article.reflections[:comments].options[:foreign_key].should be(nil)
11
+ end
12
+
13
+ it "should generate uuid string on uuid column" do
14
+ article = Article.create(:title => "Hello World")
15
+
16
+ article.uuid_valid?.should be_true
17
+ end
18
+
19
+ it "should generate uuid on before_validation" do
20
+ article = Article.new(:title => "Hello World")
21
+
22
+ article.valid?.should be_true
23
+ end
24
+ end
25
+
26
+ context "generate and validate uuid" do
27
+ it "should validate duplicate uuid" do
28
+ article1 = Article.create(:uuid => '8df4689b-b580-11e1-9d31-0026b90faf3c', :title => "Hello World1")
29
+ article2 = Article.new(:uuid => '8df4689b-b580-11e1-9d31-0026b90faf3c', :title => "Hello World2")
30
+
31
+ article2.valid?.should be_false
32
+ article2.errors[:uuid].first.should be_include("been taken")
33
+ end
34
+
35
+ it "should assign uuid manually" do
36
+ article = Article.new(:title => "Manual uuid")
37
+ article.uuid = "79f8a42e-ae60-11e1-9aa9-0026b90faf3c"
38
+ article.save
39
+ article.reload
40
+
41
+ article.uuid.should eq("79f8a42e-ae60-11e1-9aa9-0026b90faf3c")
42
+ end
43
+
44
+ it "should assign uuid if blank" do
45
+ article = Article.new(:title => "Manual uuid 2")
46
+ article.assign_uuid
47
+
48
+ article.uuid.should be_present
49
+ article.uuid_valid?.should be_true
50
+ end
51
+
52
+ it "should assign uuid if blank and save immediately" do
53
+ article = Article.new(:title => "Manual uuid 3")
54
+ article.assign_uuid!
55
+
56
+ article.uuid.should be_present
57
+ article.uuid_valid?.should be_true
58
+ end
59
+
60
+ it "should have valid uuid" do
61
+ article = Article.new(:title => "Invalid uuid")
62
+ article.uuid = "invalid"
63
+
64
+ article.valid?.should eq(false)
65
+ article.errors[:uuid].first.should be_include("is invalid")
66
+ end
67
+
68
+ it "should generate uuid" do
69
+ uuid = Article.generate_uuid
70
+
71
+ uuid.should be_present
72
+ uuid.should be_instance_of(String)
73
+ uuid.length.should eq(36)
74
+ end
75
+
76
+ it "should generate uuid on :after_initialize" do
77
+ class AfterInitializeArticle < ActiveRecord::Base
78
+ self.table_name = "articles"
79
+ uuid_config do
80
+ hook :after_initialize
81
+ end
82
+ end
83
+ article = AfterInitializeArticle.new(:title => "After initialize uuid")
84
+
85
+ article.uuid_valid?.should be_true
86
+ end
87
+
88
+ it "should generate uuid on :before_create" do
89
+ class BeforeCreateArticle < ActiveRecord::Base
90
+ self.table_name = "articles"
91
+ uuid_config do
92
+ hook :before_create
93
+ end
94
+ end
95
+ article = BeforeCreateArticle.create(:title => "Before create uuid")
96
+
97
+ article.uuid_valid?.should be_true
98
+ end
99
+ end
100
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,28 @@
1
1
  require 'active_record_uuid'
2
2
 
3
- ActiveRecord::Base.establish_connection(
4
- :adapter => "sqlite3",
5
- :database => File.dirname(__FILE__) + "/active_record_uuid.sqlite3"
6
- )
3
+ db_config = {
4
+ :adapter => "mysql2",
5
+ :database => "active_record_uuid",
6
+ :user => "root",
7
+ :password => "Q1p2m3g4"
8
+ }
7
9
 
10
+ ActiveRecord::Base.establish_connection(db_config) rescue nil
11
+ ActiveRecord::Base.connection.drop_database(db_config[:database]) rescue nil
12
+ ActiveRecord::Base.establish_connection(db_config.merge(:database => nil))
13
+ ActiveRecord::Base.connection.create_database(db_config[:database], { :charset => 'utf8', :collation => 'utf8_unicode_ci' })
14
+ ActiveRecord::Base.establish_connection(db_config)
15
+
16
+ # load extension
17
+ require 'active_record_uuid/extensions/quoting_extension'
18
+ ::ActiveRecord::Base.connection.class.send :include, ActiveRecordUuid::QuotingExtension
19
+ ::ActiveRecord::Base.send(:include, ActiveRecordUuid::Model)
20
+
21
+ # load support
8
22
  load File.dirname(__FILE__) + '/support/schema.rb'
9
- load File.dirname(__FILE__) + '/support/models.rb'
23
+ load File.dirname(__FILE__) + '/support/models.rb'
24
+
25
+ RSpec.configure do |config|
26
+ config.filter_run :focus => true
27
+ config.run_all_when_everything_filtered = true
28
+ end
@@ -1,22 +1,74 @@
1
- class PostInherit < ActiveRecord::UuidBase
2
- self.table_name = "posts"
1
+ class Blog < ActiveRecord::Base
2
+ uuid_config do
3
+ association true
4
+ primary_key true
5
+ store_as :binary
6
+ end
7
+
8
+ has_many :articles
9
+ end
10
+
11
+ class Article < ActiveRecord::Base
12
+ uuid_config
13
+
14
+ has_many :comments
15
+ end
16
+
17
+ class ArticleUuidBase < ActiveRecord::UuidBase
18
+ self.table_name = "articles"
19
+
20
+ has_many :comments
21
+ end
22
+
23
+ class PostBinary < ActiveRecord::Base
24
+ uuid_config do
25
+ association true
26
+ primary_key true
27
+ store_as :binary
28
+ end
29
+
30
+ has_many :comments
3
31
  end
4
32
 
5
- class PostInclude < ActiveRecord::Base
6
- include UuidBaseHelper
7
- self.table_name = "posts"
33
+ class PostBase64 < ActiveRecord::Base
34
+ uuid_config do
35
+ primary_key true
36
+ store_as :base64
37
+ end
8
38
  end
9
39
 
10
- class Author < ActiveRecord::UuidBase
40
+ class PostHexDigest < ActiveRecord::Base
41
+ uuid_config do
42
+ primary_key true
43
+ store_as :hexdigest
44
+ end
45
+ end
46
+
47
+ class Author < ActiveRecord::Base
48
+ uuid_config do
49
+ association true
50
+ primary_key true
51
+ end
52
+
11
53
  has_and_belongs_to_many :posts
12
54
  end
13
55
 
14
- class Post < ActiveRecord::UuidBase
56
+ class Post < ActiveRecord::Base
57
+ uuid_config do
58
+ primary_key true
59
+ association true
60
+ end
61
+
15
62
  has_many :comments
16
63
  has_one :comment
17
64
  has_and_belongs_to_many :authors
18
65
  end
19
66
 
20
- class Comment < ActiveRecord::UuidBase
67
+ class Comment < ActiveRecord::Base
68
+ uuid_config do
69
+ association true
70
+ primary_key true
71
+ end
72
+
21
73
  belongs_to :post
22
74
  end
@@ -1,6 +1,36 @@
1
1
  ActiveRecord::Schema.define do
2
2
  self.verbose = false
3
3
 
4
+ create_table :blogs, :force => true, :id => false do |t|
5
+ t.binary :uuid, :limit => 16
6
+ t.string :name
7
+ t.timestamps
8
+ end
9
+
10
+ create_table :articles, :force => true do |t|
11
+ t.string :title
12
+ t.string :uuid, :limit => 36
13
+ t.binary :blog_uuid, :limit => 16
14
+ end
15
+
16
+ create_table :post_binaries, :force => true, :id => false do |t|
17
+ t.binary :uuid, :limit => 16
18
+ t.string :text
19
+ t.timestamps
20
+ end
21
+
22
+ create_table :post_base64s, :force => true, :id => false do |t|
23
+ t.string :uuid, :limit => 24
24
+ t.string :text
25
+ t.timestamps
26
+ end
27
+
28
+ create_table :post_hex_digests, :force => true, :id => false do |t|
29
+ t.string :uuid, :limit => 32
30
+ t.string :text
31
+ t.timestamps
32
+ end
33
+
4
34
  create_table :posts, :force => true, :id => false do |t|
5
35
  t.string :uuid, :limit => 36
6
36
  t.string :text
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_uuid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-07 00:00:00.000000000 Z
12
+ date: 2012-06-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -44,7 +44,7 @@ dependencies:
44
44
  - !ruby/object:Gem::Version
45
45
  version: 2.8.0
46
46
  - !ruby/object:Gem::Dependency
47
- name: sqlite3
47
+ name: mysql2
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
@@ -91,7 +91,26 @@ dependencies:
91
91
  - - ~>
92
92
  - !ruby/object:Gem::Version
93
93
  version: 2.1.2
94
- description: A nice gem to add uuids to your models, associations, and schema.rb
94
+ - !ruby/object:Gem::Dependency
95
+ name: mysql2
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: ! 'active_record_uuid is a nice gem that add uuid supports to your activerecord
111
+ models (MySQL). It allows you to store uuid in various formats: binary (16 bytes),
112
+ base64 (24 bytes), hexdigest (32 bytes), or string (36 bytes), and query back with
113
+ uuid string.'
95
114
  email:
96
115
  - chamnapchhorn@gmail.com
97
116
  executables: []
@@ -107,14 +126,25 @@ files:
107
126
  - Rakefile
108
127
  - active_record_uuid.gemspec
109
128
  - lib/active_record_uuid.rb
110
- - lib/active_record_uuid/railtie.rb
111
- - lib/active_record_uuid/tasks/db.rake
129
+ - lib/active_record_uuid/association_methods.rb
130
+ - lib/active_record_uuid/config.rb
131
+ - lib/active_record_uuid/extensions/quoting_extension.rb
132
+ - lib/active_record_uuid/model.rb
133
+ - lib/active_record_uuid/rails/db.rake
134
+ - lib/active_record_uuid/rails/railtie.rb
135
+ - lib/active_record_uuid/serializer.rb
112
136
  - lib/active_record_uuid/uuid_base.rb
113
137
  - lib/active_record_uuid/uuid_base_helper.rb
114
138
  - lib/active_record_uuid/version.rb
115
139
  - spec/lib/association_spec.rb
116
- - spec/lib/uuid_base_helper_spec.rb
117
- - spec/lib/uuid_base_spec.rb
140
+ - spec/lib/base64_uuid_spec.rb
141
+ - spec/lib/binary_uuid_spec.rb
142
+ - spec/lib/config_spec.rb
143
+ - spec/lib/deprecation_spec.rb
144
+ - spec/lib/hexdigest_uuid_spec.rb
145
+ - spec/lib/serializer_spec.rb
146
+ - spec/lib/string_uuid_spec.rb
147
+ - spec/lib/uuid_config_spec.rb
118
148
  - spec/spec_helper.rb
119
149
  - spec/support/models.rb
120
150
  - spec/support/schema.rb
@@ -138,14 +168,20 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
168
  version: '0'
139
169
  requirements: []
140
170
  rubyforge_project:
141
- rubygems_version: 1.8.21
171
+ rubygems_version: 1.8.24
142
172
  signing_key:
143
173
  specification_version: 3
144
- summary: A gem for adding uuids to your active record models
174
+ summary: A full-featured gem for adding uuid support to your active record models
145
175
  test_files:
146
176
  - spec/lib/association_spec.rb
147
- - spec/lib/uuid_base_helper_spec.rb
148
- - spec/lib/uuid_base_spec.rb
177
+ - spec/lib/base64_uuid_spec.rb
178
+ - spec/lib/binary_uuid_spec.rb
179
+ - spec/lib/config_spec.rb
180
+ - spec/lib/deprecation_spec.rb
181
+ - spec/lib/hexdigest_uuid_spec.rb
182
+ - spec/lib/serializer_spec.rb
183
+ - spec/lib/string_uuid_spec.rb
184
+ - spec/lib/uuid_config_spec.rb
149
185
  - spec/spec_helper.rb
150
186
  - spec/support/models.rb
151
187
  - spec/support/schema.rb
@@ -1,7 +0,0 @@
1
- module ActiveRecordUuid
2
- class Railtie < Rails::Railtie
3
- rake_tasks do
4
- load "active_record_uuid/tasks/db.rake"
5
- end
6
- end
7
- end
@@ -1,26 +0,0 @@
1
- namespace :db do
2
- task :update_schema do
3
- system "sed -i '/:primary_key => \"uuid\"/ a\
4
- t.string \"uuid\", :limit => 36, :default => \"\", :null => false
5
- ' db/schema.rb"
6
- system "sed -i 's/:primary_key => \"uuid\"/:id => false/' db/schema.rb"
7
- end
8
-
9
- # Append behavior to rails rake task to correct db/schema.rb, so that the test would work correctly
10
- Rake::Task["db:schema:dump"].enhance do
11
- Rake::Task["db:update_schema"].invoke
12
- end
13
-
14
- task :add_primary_keys => :environment do
15
- Dir["#{Rails.root}/app/models/**/*.rb"].each { |path| require path }
16
- ActiveRecord::Base.descendants.each do |model|
17
- next if model.abstract_class
18
-
19
- begin
20
- ActiveRecord::Base.connection.execute "ALTER TABLE #{model.table_name} ADD PRIMARY KEY (#{model.primary_key});"
21
- rescue => e
22
- p e
23
- end
24
- end
25
- end
26
- end