sequel-hash_id 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.
- checksums.yaml +7 -0
- data/README.md +64 -0
- data/lib/sequel/plugins/hash_id.rb +58 -0
- metadata +115 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f0fda23b727eff09bf0c2047993946945ba8999f
|
4
|
+
data.tar.gz: 9ee99e696a6960f612ce546ff3d46731b7724f02
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 90cf852bcca48f78ecaffe374e91e54756e87f2592ef304a30f9c750610f417213aa1c91d7ca35350f29aa4b1a814ee5897331fba884503fe110d108231c95a0
|
7
|
+
data.tar.gz: ab19e431be943c905c83cf59582a6f1d28cc08b21df026529daf4fad7b4bbb54b9c2acbdcd56a24abb2182220484118fe8fda198cbba23529837e1bfc2b8568a
|
data/README.md
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# Sequel Hash ID
|
2
|
+
|
3
|
+
Easily obfuscate your Integer-based primary keys in Sequel models. The anonymity
|
4
|
+
of a UUID without any overhead.
|
5
|
+
|
6
|
+
These are commonly used for URL shorteners, but they have other use cases as well.
|
7
|
+
Specifically, they are very handy to prevent nieve crawling / scraping, where your
|
8
|
+
records are known to be incremental.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem "sequel-hash_id"
|
16
|
+
```
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
|
20
|
+
$ bundle
|
21
|
+
|
22
|
+
Or install it yourself as:
|
23
|
+
|
24
|
+
$ gem install sequel-hash_id
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
This plugin likely only makes sense at the Model level, so configure it
|
29
|
+
for each model you want to have a hashid for. The only required option
|
30
|
+
is the salt you wish to use.
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
plugin :hash_id, salt: "your-salt".freeze
|
34
|
+
```
|
35
|
+
|
36
|
+
Once you've done that, you can now access the following methods:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
# Get the instance's hashid
|
40
|
+
instance = YourModel.create
|
41
|
+
instance.hashid
|
42
|
+
|
43
|
+
# Lookup using a hashid
|
44
|
+
YourModel.with_hashid("the-hashid")
|
45
|
+
|
46
|
+
# Dataset lookup method
|
47
|
+
YourModel.where { ... }.with_hashid("the-hashid")
|
48
|
+
```
|
49
|
+
|
50
|
+
## Contributing
|
51
|
+
|
52
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/adam12/sequel-hash_id.
|
53
|
+
|
54
|
+
I love pull requests! If you fork this project and modify it, please ping me to see
|
55
|
+
if your changes can be incorporated back into this project.
|
56
|
+
|
57
|
+
That said, if your feature idea is nontrivial, you should probably open an issue to
|
58
|
+
[discuss it](http://www.igvita.com/2011/12/19/dont-push-your-pull-requests/)
|
59
|
+
before attempting a pull request.
|
60
|
+
|
61
|
+
## License
|
62
|
+
|
63
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
64
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
require "hashids"
|
3
|
+
|
4
|
+
module Sequel::Plugins # :nodoc:
|
5
|
+
# This plugin allows you to easily obscure the primary key of your models with
|
6
|
+
# an encoded hashid equivalent.
|
7
|
+
#
|
8
|
+
# A few convenience methods are provided which wrap around the +Hashids+ library.
|
9
|
+
#
|
10
|
+
# = Plugin Options
|
11
|
+
#
|
12
|
+
# :salt :: The salt used to hash/unhash the primary key values. Required.
|
13
|
+
# :length :: By default, the length is variable. Setting an integer here forces
|
14
|
+
# all hashids to be a specific length.
|
15
|
+
module HashId
|
16
|
+
def self.apply(model, opts = {}) # :nodoc:
|
17
|
+
model.instance_eval do
|
18
|
+
@hash_id_state = {}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.configure(model, opts = {}) # :nodoc:
|
23
|
+
model.instance_eval do
|
24
|
+
@hash_id_state[:salt] = opts[:salt] || raise(ArgumentError, "hash_id plugin missing salt option")
|
25
|
+
@hash_id_state[:length] = opts[:length] || 0
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module ClassMethods
|
30
|
+
Sequel::Plugins.def_dataset_methods(self, :with_hashid)
|
31
|
+
|
32
|
+
# The instance of +Hashids+ used to encode and decode values
|
33
|
+
def hasher
|
34
|
+
Hashids.new(@hash_id_state[:salt], @hash_id_state[:length])
|
35
|
+
end
|
36
|
+
|
37
|
+
# Lookup a record with a hashid, returning nil if none is found
|
38
|
+
def with_hashid(hashid)
|
39
|
+
id ,= hasher.decode(hashid)
|
40
|
+
|
41
|
+
self[id] if id
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module InstanceMethods
|
46
|
+
# The hashid of the model instance
|
47
|
+
def hashid
|
48
|
+
self.class.hasher.encode(id) if id
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module DatasetMethods
|
53
|
+
extend Forwardable
|
54
|
+
|
55
|
+
def_delegators :model, :with_hashid
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
metadata
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sequel-hash_id
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Daniels
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-02-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sequel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: hashids
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubygems-tasks
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.2'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.2'
|
83
|
+
description:
|
84
|
+
email: adam@mediadrive.ca
|
85
|
+
executables: []
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- README.md
|
90
|
+
- lib/sequel/plugins/hash_id.rb
|
91
|
+
homepage: https://github.com/adam12/sequel-hash_id
|
92
|
+
licenses:
|
93
|
+
- MIT
|
94
|
+
metadata: {}
|
95
|
+
post_install_message:
|
96
|
+
rdoc_options: []
|
97
|
+
require_paths:
|
98
|
+
- lib
|
99
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
requirements: []
|
110
|
+
rubyforge_project:
|
111
|
+
rubygems_version: 2.6.8
|
112
|
+
signing_key:
|
113
|
+
specification_version: 4
|
114
|
+
summary: Easily obscure the primary key of your Sequel models
|
115
|
+
test_files: []
|