masked-identifier 0.0.2 → 0.0.3
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.
- data/README.markdown +107 -0
- metadata +21 -8
- data/README.txt +0 -53
data/README.markdown
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
# Masked Identifier
|
2
|
+
|
3
|
+
Masked Identifier makes it easy to add a non-incrementing identifier to any ActiveRecord object.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add ```gem 'masked-identifier'``` to your Rails project Gemfile.
|
8
|
+
|
9
|
+
Verified to work with Rails 3.1.0.rc5. Let me know if you use it in older versions of Rails.
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
Add a column named 'masked_identifier' to the table of the ActiveRecord object that you want to
|
14
|
+
be able to refer to using a masked identifier. Also, don't forget to add an index for this new
|
15
|
+
column
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
def change
|
19
|
+
add_column :users, :masked_identifier
|
20
|
+
add_index :users, :masked_identifier
|
21
|
+
end
|
22
|
+
```
|
23
|
+
|
24
|
+
Add ```has_masked_identifier``` to the ActiveRecord object
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
class User < ActiveRecord::Base
|
28
|
+
has_masked_identifier
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
Create a new object and you'll see that a masked identifier has been added
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
user = User.create!(name: 'Matt')
|
36
|
+
user.masked_identifier
|
37
|
+
=> "2xfYgm1pQ8"
|
38
|
+
```
|
39
|
+
|
40
|
+
Lookup users based on the object's ```masked_identifier``` property
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
user = User.find_by_masked_identifier("2xfYgm1pQ8")
|
44
|
+
user.name
|
45
|
+
=> "Matt"
|
46
|
+
```
|
47
|
+
|
48
|
+
If you want ```User``` to automatically return ```masked_identifier``` instead of ```id``` when
|
49
|
+
```to_param``` is called, you can override ```to_param``` in the ```User``` class
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
class User < ActiveRecord::Base
|
53
|
+
def to_param
|
54
|
+
self.masked_identifier
|
55
|
+
end
|
56
|
+
end
|
57
|
+
```
|
58
|
+
|
59
|
+
## Options
|
60
|
+
|
61
|
+
Masked Identifier lets you edit a number of settings by including an options hash following
|
62
|
+
```has_masked_identifier```:
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
class User < ActiveRecord::Base
|
66
|
+
has_masked_identifier length: 8, property: 'mid', charset: %w{ a b c d }, attempts: 10
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
_Note: This is for example purposes only. You should never use a charset this small. You run the
|
71
|
+
risk of running out of possible unique values and throwing a CodeGenerator::TooManyFailedAttempts
|
72
|
+
error._
|
73
|
+
|
74
|
+
* ```length``` - the number of characters to include in the masked identifier. _Note: As the
|
75
|
+
length is increased, the number of possible unique masked identifiers also increases_
|
76
|
+
|
77
|
+
* ```property``` - override the default ```masked_identifier``` property with a custom named
|
78
|
+
property. _Don't forget you'll need to use this custom name in your database migration too_
|
79
|
+
|
80
|
+
* ```charset``` - override the defailt character set used when generating masked identifiers
|
81
|
+
(default character set includes a-z, A-Z, and 0-9). _Note: As the size of the character set is
|
82
|
+
increased, the number of possible unique masked identifiers also increases_
|
83
|
+
|
84
|
+
* ```attempts``` - override the number of attempts to identifiy a unique masked identifier. Each
|
85
|
+
'attempt' requires one SELECT query on the database. If you have a sufficiently large charset
|
86
|
+
and length >=10 chars, your app should rarely require more than one attempt
|
87
|
+
|
88
|
+
## Exceptions
|
89
|
+
|
90
|
+
Make sure you handle the following possible exceptions in your applicaiton:
|
91
|
+
|
92
|
+
* ```[YourActiveRecordObject]::InvalidProperty``` - if object does not have a
|
93
|
+
```masked_identifier``` property (or the custom property passed to the ```property``` option
|
94
|
+
does not exist)
|
95
|
+
|
96
|
+
* ```CodeGenerator::TooManyFailedAttempts``` - if unable to find a unique code to user as a masked
|
97
|
+
identifier
|
98
|
+
|
99
|
+
* ```CodeGenerator::InvalidAttemptsValue``` - if the value provided to the ```attempts``` option
|
100
|
+
is not an Integer or < 1
|
101
|
+
|
102
|
+
* ```CodeGenerator::InvalidCodeLength``` - if the value provided to the ```length``` option is not
|
103
|
+
an ```Integer``` or is < 1
|
104
|
+
|
105
|
+
* ```CodeGenerator::InvalidCharset``` - if value provided to the ```charset``` is not an
|
106
|
+
```Array``` with a size >= 1
|
107
|
+
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: masked-identifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
hash: 25
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Matt Hodan
|
@@ -10,10 +15,11 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-
|
18
|
+
date: 2011-07-31 00:00:00 -07:00
|
19
|
+
default_executable:
|
14
20
|
dependencies: []
|
15
21
|
|
16
|
-
description: Automatically adds a masked identifier to an ActiveRecord object on create.
|
22
|
+
description: Automatically adds a masked identifier to an ActiveRecord object on create. View the project GitHub page for more info.
|
17
23
|
email:
|
18
24
|
- matthew.c.hodan@gmail.com
|
19
25
|
executables: []
|
@@ -28,7 +34,7 @@ files:
|
|
28
34
|
- lib/tasks/masked-identifier_tasks.rake
|
29
35
|
- MIT-LICENSE
|
30
36
|
- Rakefile
|
31
|
-
- README.
|
37
|
+
- README.markdown
|
32
38
|
- test/dummy/app/assets/javascripts/application.js
|
33
39
|
- test/dummy/app/assets/stylesheets/application.css
|
34
40
|
- test/dummy/app/controllers/application_controller.rb
|
@@ -67,7 +73,8 @@ files:
|
|
67
73
|
- test/dummy/test/unit/user_test.rb
|
68
74
|
- test/masked-identifier_test.rb
|
69
75
|
- test/test_helper.rb
|
70
|
-
|
76
|
+
has_rdoc: true
|
77
|
+
homepage: http://github.com/matthodan/masked-identifier
|
71
78
|
licenses: []
|
72
79
|
|
73
80
|
post_install_message:
|
@@ -80,20 +87,26 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
80
87
|
requirements:
|
81
88
|
- - ">="
|
82
89
|
- !ruby/object:Gem::Version
|
90
|
+
hash: 3
|
91
|
+
segments:
|
92
|
+
- 0
|
83
93
|
version: "0"
|
84
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
95
|
none: false
|
86
96
|
requirements:
|
87
97
|
- - ">="
|
88
98
|
- !ruby/object:Gem::Version
|
99
|
+
hash: 3
|
100
|
+
segments:
|
101
|
+
- 0
|
89
102
|
version: "0"
|
90
103
|
requirements: []
|
91
104
|
|
92
105
|
rubyforge_project:
|
93
|
-
rubygems_version: 1.
|
106
|
+
rubygems_version: 1.3.7
|
94
107
|
signing_key:
|
95
108
|
specification_version: 3
|
96
|
-
summary: Use a masked identifier as a
|
109
|
+
summary: Use a masked identifier as a non-incrementing reference to an ActiveRecord object
|
97
110
|
test_files:
|
98
111
|
- test/dummy/app/assets/javascripts/application.js
|
99
112
|
- test/dummy/app/assets/stylesheets/application.css
|
data/README.txt
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
= MaskedIdentifier
|
2
|
-
#
|
3
|
-
# MASKED IDENTIFIER DOCUMENTATION
|
4
|
-
# ===============================
|
5
|
-
#
|
6
|
-
# Automatically adds a masked identifier to an ActiveRecord object on create. Default assumes the
|
7
|
-
# ActiveRecord object contains a property called 'masked_identifier', which should be added to your
|
8
|
-
# database migration. Don't forget to add an index on this column!
|
9
|
-
#
|
10
|
-
# Usage:
|
11
|
-
# class User < ActiveRecord::Base
|
12
|
-
# has_masked_identifier
|
13
|
-
# end
|
14
|
-
#
|
15
|
-
# Or, with optional settings:
|
16
|
-
# class User < ActiveRecord::Base
|
17
|
-
# has_masked_identifier property: 'mid', attempts: 10, length: 8, charset: %w{ a b c d e }
|
18
|
-
# end
|
19
|
-
#
|
20
|
-
# Optional (options hash):
|
21
|
-
# property: override default property name with a custom name (default is 'masked_identifier')
|
22
|
-
# attempts: number of attempts to try to find a unique code (default is 20)
|
23
|
-
# length: number of characters to include in masked identifier code (default is 10)
|
24
|
-
# charset: character set to use when generating codes (default includes a-z, A-Z, and 0-9)
|
25
|
-
#
|
26
|
-
# Possible Errors:
|
27
|
-
# [YourActiveRecordObject]::InvalidProperty if property does not exist
|
28
|
-
# See CodeGenerator for additional errors
|
29
|
-
#
|
30
|
-
#
|
31
|
-
# CODE GENERATOR DOCUMENTATION
|
32
|
-
# ============================
|
33
|
-
#
|
34
|
-
# Generates a unique code based on a property of an ActiveRecord object
|
35
|
-
#
|
36
|
-
# Usage:
|
37
|
-
# code = CodeGenerator.unique_code(klass, property, options = {})
|
38
|
-
#
|
39
|
-
# Required parameters:
|
40
|
-
# klass = the ActiveRecord object
|
41
|
-
# property = the name of the property to check for uniqueness
|
42
|
-
#
|
43
|
-
# Optional (options hash):
|
44
|
-
# length: number of characters to include in code (default = 10)
|
45
|
-
# charset: character set to use when generating codes (default = a-zA-Z0-9)
|
46
|
-
# attempts: number of attempts to find a unique code (default = 20)
|
47
|
-
#
|
48
|
-
# Possible Errors:
|
49
|
-
# CodeGenerator::TooManyFailedAttempts if unable to find a unique code
|
50
|
-
# CodeGenerator::InvalidAttemptsValue if value provided is not an Integer or < 1
|
51
|
-
# CodeGenerator::InvalidCodeLength if value provided is not an Integer or < 1
|
52
|
-
# CodeGenerator::InvalidCharset if value provided is not an Array with size >= 1
|
53
|
-
#
|