acts_as_digested_on 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +20 -1
- data/.rspec +1 -0
- data/.travis.yml +21 -4
- data/Gemfile +1 -1
- data/{LICENSE → LICENSE.txt} +3 -1
- data/README.md +86 -0
- data/Rakefile +6 -0
- data/acts_as_digested_on.gemspec +22 -22
- data/gemfiles/active_record_30.gemfile +5 -0
- data/gemfiles/active_record_31.gemfile +5 -0
- data/gemfiles/active_record_32.gemfile +5 -0
- data/gemfiles/active_record_40.gemfile +5 -0
- data/gemfiles/active_record_41.gemfile +5 -0
- data/lib/acts_as_digested_on.rb +14 -6
- data/lib/acts_as_digested_on/version.rb +1 -1
- data/spec/acts_as_digested_on_spec.rb +71 -34
- data/spec/spec_helper.rb +4 -11
- metadata +70 -29
- data/README.rdoc +0 -70
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9fe716747e29040d5d295efb36190265a35ffffe
|
4
|
+
data.tar.gz: f58ea0447b586740db607e35c3985a1406efbda9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 17765a65a22b98c6bcd2ed75135a09d476809a4f7aeaa5b0ba3bd36d0ed003f27909396627233d427508a6f09972b480b36dbe47096cd6965e7ca966c71ab1fc
|
7
|
+
data.tar.gz: 04e334c76ceb1ad2124cd52573c737d533f02e15971fd4936f8bfa4290984e957ba96ad6d7ed2d66fdcb10c5718097e3fdb0aa8b1eb3aabd15c7743a5fac2fb4
|
data/.gitignore
CHANGED
@@ -1,4 +1,23 @@
|
|
1
1
|
*.gem
|
2
|
+
*.rbc
|
2
3
|
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
3
6
|
Gemfile.lock
|
4
|
-
|
7
|
+
gemfiles/*.lock
|
8
|
+
InstalledFiles
|
9
|
+
_yardoc
|
10
|
+
coverage
|
11
|
+
doc/
|
12
|
+
lib/bundler/man
|
13
|
+
pkg
|
14
|
+
rdoc
|
15
|
+
spec/reports
|
16
|
+
test/tmp
|
17
|
+
test/version_tmp
|
18
|
+
tmp
|
19
|
+
*.bundle
|
20
|
+
*.so
|
21
|
+
*.o
|
22
|
+
*.a
|
23
|
+
mkmf.log
|
data/.rspec
CHANGED
data/.travis.yml
CHANGED
@@ -1,7 +1,24 @@
|
|
1
1
|
language: ruby
|
2
|
+
script: "bundle exec rake spec"
|
2
3
|
rvm:
|
3
|
-
- 1.8.7
|
4
|
-
- 1.9.2
|
5
4
|
- 1.9.3
|
6
|
-
-
|
7
|
-
|
5
|
+
- 2.0.0
|
6
|
+
- 2.1
|
7
|
+
- ruby-head
|
8
|
+
gemfile:
|
9
|
+
- gemfiles/active_record_30.gemfile
|
10
|
+
- gemfiles/active_record_31.gemfile
|
11
|
+
- gemfiles/active_record_32.gemfile
|
12
|
+
- gemfiles/active_record_40.gemfile
|
13
|
+
- gemfiles/active_record_41.gemfile
|
14
|
+
matrix:
|
15
|
+
exclude:
|
16
|
+
- rvm: ruby-head
|
17
|
+
gemfile: gemfiles/active_record_30.gemfile
|
18
|
+
- rvm: ruby-head
|
19
|
+
gemfile: gemfiles/active_record_31.gemfile
|
20
|
+
- rvm: ruby-head
|
21
|
+
gemfile: gemfiles/active_record_32.gemfile
|
22
|
+
allow_failures:
|
23
|
+
- rvm: ruby-head
|
24
|
+
fast_finish: true
|
data/Gemfile
CHANGED
data/{LICENSE → LICENSE.txt}
RENAMED
data/README.md
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
# ActsAsDigestedOn [![Build Status](https://travis-ci.org/milk1000cc/acts_as_digested_on.svg)](https://travis-ci.org/milk1000cc/acts_as_digested_on)
|
2
|
+
|
3
|
+
acts_as_digested_on is a gem for Rails 3 and Rails 4.
|
4
|
+
|
5
|
+
This sets the digested value before validation and validates uniqueness of the digested value.
|
6
|
+
|
7
|
+
If you use this gem for Rails 2, see rails-2 branch.
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
gem 'acts_as_digested_on'
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install acts_as_digested_on
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
# db/migrate/20090706000000_create_articles.rb
|
27
|
+
class CreateArticles < ActiveRecord::Migration
|
28
|
+
def self.up
|
29
|
+
create_table :articles do |t|
|
30
|
+
t.text :url # any type is ok
|
31
|
+
t.string :digest # this is sha-1 hex digest field of url value
|
32
|
+
...
|
33
|
+
end
|
34
|
+
|
35
|
+
add_index :articles, :digest, :unique => true # you can add index on digest field
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.down
|
39
|
+
drop_table :articles
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# app/models/article.rb
|
44
|
+
class Article < ActiveRecord::Base
|
45
|
+
acts_as_digested_on :url # please add this
|
46
|
+
...
|
47
|
+
end
|
48
|
+
|
49
|
+
# this means
|
50
|
+
class Article < ActiveRecord::Base
|
51
|
+
validates_uniqueness_of :digest
|
52
|
+
before_validation :set_digest
|
53
|
+
|
54
|
+
def generate_digest
|
55
|
+
Digest::SHA1.hexdigest "--#{ url.to_s }--"
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def set_digest
|
60
|
+
self.digest = generate_digest
|
61
|
+
end
|
62
|
+
...
|
63
|
+
end
|
64
|
+
```
|
65
|
+
|
66
|
+
## Examples
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
acts_as_digested_on :url, :unique => false
|
70
|
+
|
71
|
+
acts_as_digested_on :url, :digest_column => :url_digest
|
72
|
+
|
73
|
+
acts_as_digested_on [:url, :salt]
|
74
|
+
|
75
|
+
acts_as_digested_on :url, :scope => :site_id
|
76
|
+
|
77
|
+
Article.new(:url => 'http://example.com').generate_digest
|
78
|
+
```
|
79
|
+
|
80
|
+
## Contributing
|
81
|
+
|
82
|
+
1. Fork it ( https://github.com/milk1000cc/acts_as_digested_on/fork )
|
83
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
84
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
85
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
86
|
+
5. Create a new Pull Request
|
data/Rakefile
CHANGED
data/acts_as_digested_on.gemspec
CHANGED
@@ -1,27 +1,27 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'acts_as_digested_on/version'
|
4
5
|
|
5
|
-
Gem::Specification.new do |
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "acts_as_digested_on"
|
8
|
+
spec.version = ActsAsDigestedOn::VERSION
|
9
|
+
spec.authors = ["milk1000cc"]
|
10
|
+
spec.email = ["info@milk1000.cc"]
|
11
|
+
spec.summary = %q{Automatically set sha-1 hex digest}
|
12
|
+
spec.description = %q{This gem sets the digested value before validation and validates uniqueness of the digested value.}
|
13
|
+
spec.homepage = "https://github.com/milk1000cc/acts_as_digested_on"
|
14
|
+
spec.license = "MIT"
|
13
15
|
|
14
|
-
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
15
20
|
|
16
|
-
|
17
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
-
s.require_paths = ["lib"]
|
21
|
+
spec.add_dependency 'activerecord', '>= 3.0.0'
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
s.add_development_dependency "rspec"
|
26
|
-
s.add_development_dependency "sqlite3"
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "rspec"
|
26
|
+
spec.add_development_dependency "sqlite3"
|
27
27
|
end
|
data/lib/acts_as_digested_on.rb
CHANGED
@@ -25,14 +25,22 @@ module ActsAsDigestedOn
|
|
25
25
|
|
26
26
|
module InstanceMethods
|
27
27
|
def generate_digest
|
28
|
-
|
29
|
-
original_string = "--#{ original_columns.map { |v| self[v].to_s }.join('--') }--"
|
30
|
-
digest = Digest::SHA1.hexdigest(original_string)
|
28
|
+
digest = Digest::SHA1.hexdigest(original_string_for_digest)
|
31
29
|
digest.encode! 'utf-8' if RUBY_VERSION.to_f >= 1.9
|
32
30
|
digest
|
33
31
|
end
|
34
32
|
|
35
33
|
private
|
34
|
+
def original_string_for_digest
|
35
|
+
separator = '--'
|
36
|
+
attr_names = self.class.acts_as_digested_on_vars[:attr_names]
|
37
|
+
|
38
|
+
str = separator.dup
|
39
|
+
str << attr_names.map { |v| send(v).to_s }.join(separator)
|
40
|
+
str << separator
|
41
|
+
str
|
42
|
+
end
|
43
|
+
|
36
44
|
def set_digest
|
37
45
|
digest_column = self.class.acts_as_digested_on_vars[:digest_column]
|
38
46
|
self[digest_column] = generate_digest
|
@@ -40,16 +48,16 @@ module ActsAsDigestedOn
|
|
40
48
|
end
|
41
49
|
|
42
50
|
module ClassMethods
|
43
|
-
def acts_as_digested_on(
|
51
|
+
def acts_as_digested_on(attr_names, options = {})
|
44
52
|
options = options.symbolize_keys
|
45
53
|
|
46
|
-
|
54
|
+
attr_names = Array(attr_names).flatten
|
47
55
|
digest_column = options.delete(:digest_column) || 'digest'
|
48
56
|
unique = options.key?(:unique) ? options.delete(:unique) : true
|
49
57
|
|
50
58
|
class_attribute :acts_as_digested_on_vars
|
51
59
|
self.acts_as_digested_on_vars = {
|
52
|
-
:
|
60
|
+
:attr_names => attr_names,
|
53
61
|
:digest_column => digest_column,
|
54
62
|
:unique => unique,
|
55
63
|
:validates_uniqueness_of_options => options
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
class Article < ActiveRecord::Base
|
4
4
|
define_table do |t|
|
@@ -9,9 +9,13 @@ class Article < ActiveRecord::Base
|
|
9
9
|
t.string :my_digest
|
10
10
|
t.text :content
|
11
11
|
end
|
12
|
+
|
13
|
+
def stripped_title
|
14
|
+
title.strip
|
15
|
+
end
|
12
16
|
end
|
13
17
|
|
14
|
-
describe
|
18
|
+
describe ActsAsDigestedOn do
|
15
19
|
before do
|
16
20
|
Article.reset_callbacks :validate
|
17
21
|
Article.destroy_all
|
@@ -21,12 +25,29 @@ describe "ActsAsDigestedOn" do
|
|
21
25
|
@url = 'http://example.com'
|
22
26
|
end
|
23
27
|
|
28
|
+
it 'has a version number' do
|
29
|
+
expect(ActsAsDigestedOn::VERSION).not_to be nil
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'can use a method name instead of a column name' do
|
33
|
+
Article.acts_as_digested_on :stripped_title
|
34
|
+
|
35
|
+
article = Article.create!(title: ' hello ')
|
36
|
+
|
37
|
+
expect(article.digest).to eq Digest::SHA1.hexdigest('--hello--')
|
38
|
+
|
39
|
+
expect {
|
40
|
+
Article.create! title: 'hello'
|
41
|
+
}.to raise_error(ActiveRecord::RecordInvalid)
|
42
|
+
end
|
43
|
+
|
24
44
|
describe '#generate_digest' do
|
25
45
|
it 'should generate sha-1 digest of target field with some string' do
|
26
46
|
Article.acts_as_digested_on :url
|
27
47
|
|
28
|
-
article = Article.new(:
|
29
|
-
article.generate_digest.
|
48
|
+
article = Article.new(url: @url)
|
49
|
+
expect(article.generate_digest).to eq(
|
50
|
+
Digest::SHA1.hexdigest("--#{ @url }--"))
|
30
51
|
end
|
31
52
|
|
32
53
|
describe 'when more than one target field is given' do
|
@@ -34,8 +55,9 @@ describe "ActsAsDigestedOn" do
|
|
34
55
|
Article.acts_as_digested_on [:title, :url]
|
35
56
|
|
36
57
|
title = 'an article'
|
37
|
-
article = Article.new(:
|
38
|
-
article.generate_digest.
|
58
|
+
article = Article.new(title: title, url: @url)
|
59
|
+
expect(article.generate_digest).to eq(
|
60
|
+
Digest::SHA1.hexdigest("--#{ title }--#{ @url }--"))
|
39
61
|
end
|
40
62
|
end
|
41
63
|
end
|
@@ -44,21 +66,22 @@ describe "ActsAsDigestedOn" do
|
|
44
66
|
it 'should set "digest" field' do
|
45
67
|
Article.acts_as_digested_on :url
|
46
68
|
|
47
|
-
article = Article.new(:
|
48
|
-
article.digest.
|
69
|
+
article = Article.new(url: @url)
|
70
|
+
expect(article.digest).to be_nil
|
49
71
|
article.valid?
|
50
|
-
article.digest.
|
72
|
+
expect(article.digest).to eq article.generate_digest
|
51
73
|
end
|
52
74
|
|
53
75
|
it 'should set the digest value to :digest_column field when :digest_column option is set' do
|
54
|
-
Article.acts_as_digested_on :url, :
|
76
|
+
Article.acts_as_digested_on :url, digest_column: :my_digest
|
77
|
+
|
78
|
+
article = Article.new(url: @url)
|
79
|
+
expect(article.digest).to be_nil
|
80
|
+
expect(article.my_digest).to be_nil
|
55
81
|
|
56
|
-
article = Article.new(:url => @url)
|
57
|
-
article.digest.should be_nil
|
58
|
-
article.my_digest.should be_nil
|
59
82
|
article.valid?
|
60
|
-
article.digest.
|
61
|
-
article.my_digest.
|
83
|
+
expect(article.digest).to be_nil
|
84
|
+
expect(article.my_digest).to eq article.generate_digest
|
62
85
|
end
|
63
86
|
end
|
64
87
|
|
@@ -66,40 +89,54 @@ describe "ActsAsDigestedOn" do
|
|
66
89
|
it 'should validate uniqueness of digest field by default' do
|
67
90
|
Article.acts_as_digested_on :url
|
68
91
|
|
69
|
-
Article.create! :
|
70
|
-
|
71
|
-
|
92
|
+
Article.create! url: @url
|
93
|
+
expect {
|
94
|
+
Article.create! url: @url
|
95
|
+
}.to raise_error(ActiveRecord::RecordInvalid)
|
96
|
+
expect {
|
97
|
+
Article.create! url: 'http://example2.com'
|
98
|
+
}.not_to raise_error
|
72
99
|
end
|
73
100
|
|
74
101
|
it 'should carry over the options to the validates_uniqueness_of options' do
|
75
|
-
Article.acts_as_digested_on :url, :
|
76
|
-
|
77
|
-
Article.create! :
|
78
|
-
|
79
|
-
|
80
|
-
|
102
|
+
Article.acts_as_digested_on :url, scope: :user_id
|
103
|
+
|
104
|
+
Article.create! url: @url, user_id: 1
|
105
|
+
expect {
|
106
|
+
Article.create! url: @url, user_id: 1
|
107
|
+
}.to raise_error(ActiveRecord::RecordInvalid)
|
108
|
+
expect {
|
109
|
+
Article.create! url: @url, user_id: 2
|
110
|
+
}.not_to raise_error
|
111
|
+
expect {
|
112
|
+
Article.create! url: 'http://example2.com', user_id: 1
|
113
|
+
}.not_to raise_error
|
81
114
|
end
|
82
115
|
|
83
116
|
it 'should validate uniqueness of digest field when :unique option is true' do
|
84
|
-
Article.acts_as_digested_on :url, :
|
85
|
-
|
86
|
-
Article.create! :
|
87
|
-
|
88
|
-
|
117
|
+
Article.acts_as_digested_on :url, unique: true
|
118
|
+
|
119
|
+
Article.create! url: @url
|
120
|
+
expect {
|
121
|
+
Article.create! url: @url
|
122
|
+
}.to raise_error(ActiveRecord::RecordInvalid)
|
123
|
+
expect {
|
124
|
+
Article.create! url: 'http://example2.com'
|
125
|
+
}.not_to raise_error
|
89
126
|
end
|
90
127
|
|
91
128
|
it 'should not validate uniqueness of digest field when :unique option is false' do
|
92
|
-
Article.acts_as_digested_on :url, :
|
129
|
+
Article.acts_as_digested_on :url, unique: false
|
93
130
|
|
94
|
-
Article.create! :
|
95
|
-
|
131
|
+
Article.create! url: @url
|
132
|
+
expect { Article.create! url: @url }.not_to raise_error
|
96
133
|
end
|
97
134
|
|
98
135
|
it 'should support string key options' do
|
99
136
|
Article.acts_as_digested_on :url, 'unique' => false
|
100
137
|
|
101
|
-
Article.create! :
|
102
|
-
|
138
|
+
Article.create! url: @url
|
139
|
+
expect { Article.create! url: @url }.not_to raise_error
|
103
140
|
end
|
104
141
|
end
|
105
142
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,18 +1,11 @@
|
|
1
|
-
|
2
|
-
require 'rspec'
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
3
2
|
require 'active_record'
|
4
|
-
|
5
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
6
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
3
|
require 'acts_as_digested_on'
|
8
4
|
|
9
|
-
|
10
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
11
|
-
config.filter_run :focus => true
|
12
|
-
config.run_all_when_everything_filtered = true
|
13
|
-
end
|
5
|
+
I18n.enforce_available_locales = true
|
14
6
|
|
15
|
-
ActiveRecord::Base.establish_connection(
|
7
|
+
ActiveRecord::Base.establish_connection(
|
8
|
+
:adapter => 'sqlite3', :database => ':memory:')
|
16
9
|
|
17
10
|
class ActiveRecord::Base
|
18
11
|
def self.define_table(table_name = self.name.tableize, &migration)
|
metadata
CHANGED
@@ -1,49 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_digested_on
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- milk1000cc
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-06-15 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement:
|
17
|
-
none: false
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 3.0.0
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.6'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
25
55
|
- !ruby/object:Gem::Dependency
|
26
56
|
name: rspec
|
27
|
-
requirement:
|
28
|
-
none: false
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
29
58
|
requirements:
|
30
|
-
- -
|
59
|
+
- - ">="
|
31
60
|
- !ruby/object:Gem::Version
|
32
61
|
version: '0'
|
33
62
|
type: :development
|
34
63
|
prerelease: false
|
35
|
-
version_requirements:
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
36
69
|
- !ruby/object:Gem::Dependency
|
37
70
|
name: sqlite3
|
38
|
-
requirement:
|
39
|
-
none: false
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
40
72
|
requirements:
|
41
|
-
- -
|
73
|
+
- - ">="
|
42
74
|
- !ruby/object:Gem::Version
|
43
75
|
version: '0'
|
44
76
|
type: :development
|
45
77
|
prerelease: false
|
46
|
-
version_requirements:
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
47
83
|
description: This gem sets the digested value before validation and validates uniqueness
|
48
84
|
of the digested value.
|
49
85
|
email:
|
@@ -52,41 +88,46 @@ executables: []
|
|
52
88
|
extensions: []
|
53
89
|
extra_rdoc_files: []
|
54
90
|
files:
|
55
|
-
- .gitignore
|
56
|
-
- .rspec
|
57
|
-
- .travis.yml
|
91
|
+
- ".gitignore"
|
92
|
+
- ".rspec"
|
93
|
+
- ".travis.yml"
|
58
94
|
- Gemfile
|
59
|
-
- LICENSE
|
60
|
-
- README.
|
95
|
+
- LICENSE.txt
|
96
|
+
- README.md
|
61
97
|
- Rakefile
|
62
98
|
- acts_as_digested_on.gemspec
|
99
|
+
- gemfiles/active_record_30.gemfile
|
100
|
+
- gemfiles/active_record_31.gemfile
|
101
|
+
- gemfiles/active_record_32.gemfile
|
102
|
+
- gemfiles/active_record_40.gemfile
|
103
|
+
- gemfiles/active_record_41.gemfile
|
63
104
|
- lib/acts_as_digested_on.rb
|
64
105
|
- lib/acts_as_digested_on/version.rb
|
65
106
|
- spec/acts_as_digested_on_spec.rb
|
66
107
|
- spec/spec_helper.rb
|
67
108
|
homepage: https://github.com/milk1000cc/acts_as_digested_on
|
68
|
-
licenses:
|
109
|
+
licenses:
|
110
|
+
- MIT
|
111
|
+
metadata: {}
|
69
112
|
post_install_message:
|
70
113
|
rdoc_options: []
|
71
114
|
require_paths:
|
72
115
|
- lib
|
73
116
|
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
117
|
requirements:
|
76
|
-
- -
|
118
|
+
- - ">="
|
77
119
|
- !ruby/object:Gem::Version
|
78
120
|
version: '0'
|
79
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
-
none: false
|
81
122
|
requirements:
|
82
|
-
- -
|
123
|
+
- - ">="
|
83
124
|
- !ruby/object:Gem::Version
|
84
125
|
version: '0'
|
85
126
|
requirements: []
|
86
|
-
rubyforge_project:
|
87
|
-
rubygems_version:
|
127
|
+
rubyforge_project:
|
128
|
+
rubygems_version: 2.2.2
|
88
129
|
signing_key:
|
89
|
-
specification_version:
|
130
|
+
specification_version: 4
|
90
131
|
summary: Automatically set sha-1 hex digest
|
91
132
|
test_files:
|
92
133
|
- spec/acts_as_digested_on_spec.rb
|
data/README.rdoc
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
= ActsAsDigestedOn {<img src="https://secure.travis-ci.org/milk1000cc/acts_as_digested_on.png?branch=master" alt="Build Status" />}[http://travis-ci.org/milk1000cc/acts_as_digested_on]
|
2
|
-
|
3
|
-
acts_as_digested_on is a gem for Rails 3.
|
4
|
-
|
5
|
-
This sets the digested value before validation and validates uniqueness of the digested value.
|
6
|
-
|
7
|
-
If you use this gem for Rails 2, see rails-2 branch.
|
8
|
-
|
9
|
-
== Install
|
10
|
-
|
11
|
-
sudo gem install acts_as_digested_on
|
12
|
-
|
13
|
-
== Usage
|
14
|
-
|
15
|
-
# db/migrate/20090706000000_create_articles.rb
|
16
|
-
class CreateArticles < ActiveRecord::Migration
|
17
|
-
def self.up
|
18
|
-
create_table :articles do |t|
|
19
|
-
t.text :url # any type is ok
|
20
|
-
t.string :digest # this is sha-1 hex digest field of url value
|
21
|
-
...
|
22
|
-
end
|
23
|
-
|
24
|
-
add_index :articles, :digest, :unique => true # you can add index on digest field
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.down
|
28
|
-
drop_table :articles
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
# app/models/article.rb
|
33
|
-
class Article < ActiveRecord::Base
|
34
|
-
acts_as_digested_on :url # please add this
|
35
|
-
...
|
36
|
-
end
|
37
|
-
|
38
|
-
# this means
|
39
|
-
class Article < ActiveRecord::Base
|
40
|
-
validates_uniqueness_of :digest
|
41
|
-
before_validation :set_digest
|
42
|
-
|
43
|
-
def generate_digest
|
44
|
-
Digest::SHA1.hexdigest "--#{ url.to_s }--"
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
def set_digest
|
49
|
-
self.digest = generate_digest
|
50
|
-
end
|
51
|
-
...
|
52
|
-
end
|
53
|
-
|
54
|
-
== Examples
|
55
|
-
|
56
|
-
acts_as_digested_on :url, :unique => false
|
57
|
-
|
58
|
-
acts_as_digested_on :url, :digest_column => :url_digest
|
59
|
-
|
60
|
-
acts_as_digested_on [:url, :salt]
|
61
|
-
|
62
|
-
acts_as_digested_on :url, :scope => :site_id
|
63
|
-
|
64
|
-
Article.new(:url => 'http://example.com').generate_digest
|
65
|
-
|
66
|
-
== Copyright
|
67
|
-
|
68
|
-
Copyright (c) 2009-2012 milk1000cc, released under the MIT license
|
69
|
-
|
70
|
-
milk1000cc <mailto:info@milk1000.cc>
|