id_pack 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +3 -1
- data/Gemfile.lock +14 -1
- data/README.adoc +212 -0
- data/app/assets/javascripts/lib/id-packer.js +2 -2
- data/bin/console +1 -1
- data/lib/id_pack/id_packer.rb +3 -3
- data/lib/id_pack/version.rb +1 -1
- metadata +3 -3
- data/README.md +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 40f1290972ca537009fdccbb9f92d43b945fc7f0
|
4
|
+
data.tar.gz: aca88be54e625a021247f0d0e7cd890c3a4248cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13a3bb10dd108bf19697cf285dbe16a91fb8dcf494c99bd4b667c1a81ea318b5d6088263b8c705694c7b637a6369f4ffa1f2967b6e41c56e133606f8b9ef8b51
|
7
|
+
data.tar.gz: 40644148114649ee617701d72a487eb18311ef2fc54bbeec9783f477e0220a02508534ffae7988a63c27fbe276a0d5ffaabaedd5e1453059b4d2d389e5452082
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
id_pack (
|
4
|
+
id_pack (1.0.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
+
codecov (0.1.10)
|
10
|
+
json
|
11
|
+
simplecov
|
12
|
+
url
|
9
13
|
diff-lcs (1.3)
|
14
|
+
docile (1.1.5)
|
15
|
+
json (2.1.0)
|
10
16
|
rake (10.5.0)
|
11
17
|
rspec (3.6.0)
|
12
18
|
rspec-core (~> 3.6.0)
|
@@ -21,12 +27,19 @@ GEM
|
|
21
27
|
diff-lcs (>= 1.2.0, < 2.0)
|
22
28
|
rspec-support (~> 3.6.0)
|
23
29
|
rspec-support (3.6.0)
|
30
|
+
simplecov (0.15.1)
|
31
|
+
docile (~> 1.1.0)
|
32
|
+
json (>= 1.8, < 3)
|
33
|
+
simplecov-html (~> 0.10.0)
|
34
|
+
simplecov-html (0.10.2)
|
35
|
+
url (0.3.2)
|
24
36
|
|
25
37
|
PLATFORMS
|
26
38
|
ruby
|
27
39
|
|
28
40
|
DEPENDENCIES
|
29
41
|
bundler (~> 1.15)
|
42
|
+
codecov
|
30
43
|
id_pack!
|
31
44
|
rake (~> 10.0)
|
32
45
|
rspec (~> 3.6)
|
data/README.adoc
ADDED
@@ -0,0 +1,212 @@
|
|
1
|
+
= id_pack
|
2
|
+
|
3
|
+
image:https://img.shields.io/gem/v/id_pack.svg[
|
4
|
+
Gem Version, link="https://rubygems.org/gems/id_pack"]
|
5
|
+
image:https://img.shields.io/travis/riboseinc/id_pack/master.svg[
|
6
|
+
Build Status, link="https://travis-ci.org/riboseinc/id_pack"]
|
7
|
+
image:https://api.codeclimate.com/v1/badges/655d7aa547daa7b45148/maintainability[
|
8
|
+
"Code Climate - Maintainability", link="https://codeclimate.com/github/riboseinc/id_pack/maintainability"]
|
9
|
+
image:https://img.shields.io/codecov/c/github/riboseinc/id_pack.svg[
|
10
|
+
"Test Coverage", link="https://codecov.io/gh/riboseinc/id_pack"]
|
11
|
+
|
12
|
+
== Introduction
|
13
|
+
|
14
|
+
This gem provides functionality to compress and decompress two different types
|
15
|
+
of objects:
|
16
|
+
|
17
|
+
1. a contiguous range or multiple contiguous ranges of integer ID
|
18
|
+
2. a set of UUID
|
19
|
+
|
20
|
+
as a single string.
|
21
|
+
|
22
|
+
Both Ruby and Javascript implementations are provided.
|
23
|
+
|
24
|
+
Javascript support for Rails is provided by means of a Rails engine (`IdPack::Engine`).
|
25
|
+
|
26
|
+
Further, for integer ID ranges, it provides serialization of a concept called
|
27
|
+
`sync_str`, which stands for "synchronization string".
|
28
|
+
|
29
|
+
`sync_str` represents a mapping from ID to timestamp.
|
30
|
+
It is typically generated on the client side for the server side.
|
31
|
+
Armed with the `sync_str`, the server knows which objects the client requires,
|
32
|
+
by comparing the timestamps from the `sync_str` with the update times of the
|
33
|
+
corresponding objects from the database, so synchronization could be done with
|
34
|
+
minimal waste of bandwidth.
|
35
|
+
|
36
|
+
Timestamps are really just integers, _e.g._ `Time.now.to_i`.
|
37
|
+
|
38
|
+
|
39
|
+
== Installation
|
40
|
+
|
41
|
+
There are at least two ways to install this:
|
42
|
+
|
43
|
+
A. The quickest way is to `gem install` on the terminal:
|
44
|
+
+
|
45
|
+
[source,bash]
|
46
|
+
....
|
47
|
+
gem install id_pack
|
48
|
+
....
|
49
|
+
|
50
|
+
B. If your application has a `Gemfile`, add the following line:
|
51
|
+
+
|
52
|
+
[source,ruby]
|
53
|
+
....
|
54
|
+
gem 'id_pack'
|
55
|
+
....
|
56
|
+
+
|
57
|
+
And then execute:
|
58
|
+
+
|
59
|
+
[source,bash]
|
60
|
+
....
|
61
|
+
bundle
|
62
|
+
....
|
63
|
+
|
64
|
+
== Usage
|
65
|
+
|
66
|
+
To experiment with the code, run `bin/console` for an interactive prompt.
|
67
|
+
|
68
|
+
[source,ruby]
|
69
|
+
----
|
70
|
+
require 'id_pack'
|
71
|
+
----
|
72
|
+
|
73
|
+
=== IdPacker
|
74
|
+
|
75
|
+
[source,ruby]
|
76
|
+
----
|
77
|
+
id_packer = IdPack::IdPacker.new
|
78
|
+
----
|
79
|
+
|
80
|
+
To encode/decode a set of IDs:
|
81
|
+
|
82
|
+
[source,ruby]
|
83
|
+
----
|
84
|
+
ids = [5, 6, 21, 23, 25]
|
85
|
+
encoded_ids = id_packer.encode(ids) #=> "_F~C_P.V"
|
86
|
+
decoded_ids = id_packer.decode(encoded_ids) #=> [5, 6, 21, 23, 25]
|
87
|
+
ids == decoded_ids #=> true
|
88
|
+
----
|
89
|
+
|
90
|
+
To work with `sync_str`:
|
91
|
+
|
92
|
+
[source,ruby]
|
93
|
+
----
|
94
|
+
ids_synced_at = {
|
95
|
+
1 => 1510294889,
|
96
|
+
2 => 1510292639,
|
97
|
+
10 => 1510279639,
|
98
|
+
}
|
99
|
+
|
100
|
+
sync_str = id_packer.encode_sync_str(ids_synced_at)
|
101
|
+
#=> "IwVmAYCYHYE4DYDMsg,IxA,IwVgTCAMQ,ExA,IwZgDBQ,IwBiA,AxA"
|
102
|
+
|
103
|
+
decoded_sync_map = id_packer.decode_sync_str(sync_str)
|
104
|
+
#=> {1=>1510294889, 2=>1510292639, 10=>1510279639}
|
105
|
+
|
106
|
+
ids_synced_at == decoded_sync_map
|
107
|
+
#=> true
|
108
|
+
----
|
109
|
+
|
110
|
+
==== Advanced `sync_str` usage
|
111
|
+
|
112
|
+
`IdPacker#decode_sync_str` optionally supports a `base_timestamp`:
|
113
|
+
|
114
|
+
[source,ruby]
|
115
|
+
----
|
116
|
+
base_timestamp2 = 1000
|
117
|
+
decoded_sync_map2 = id_packer.decode_sync_str(sync_str, base_timestamp2)
|
118
|
+
#=> {1=>1510295889, 2=>1510293639, 10=>1510280639}
|
119
|
+
|
120
|
+
base_timestamp3 = - ids_synced_at.min[1]
|
121
|
+
decoded_sync_map3 = id_packer.decode_sync_str(sync_str, base_timestamp3)
|
122
|
+
#=> {1=>0, 2=>-2250, 10=>-15250}
|
123
|
+
|
124
|
+
base_timestamp4 = - ids_synced_at.max[1]
|
125
|
+
decoded_sync_map4 = id_packer.decode_sync_str(sync_str, base_timestamp4)
|
126
|
+
#=> {1=>15250, 2=>13000, 10=>0}
|
127
|
+
----
|
128
|
+
|
129
|
+
`base_timestamp` is typically specified to reverse any normalization of
|
130
|
+
timestamps done on the client side (not shown in this README).
|
131
|
+
|
132
|
+
=== UuidPacker
|
133
|
+
|
134
|
+
[source,ruby]
|
135
|
+
----
|
136
|
+
uuid_packer = IdPack::UuidPacker.new
|
137
|
+
----
|
138
|
+
|
139
|
+
[source,ruby]
|
140
|
+
----
|
141
|
+
uuids = [
|
142
|
+
'ea8bed36-a73d-4fff-af36-32162274dfd1',
|
143
|
+
'22347af1-7c60-48e0-8cc5-a30746812267',
|
144
|
+
'3e514775-bfdb-44f9-92b2-c4c53a7dc89d',
|
145
|
+
]
|
146
|
+
----
|
147
|
+
|
148
|
+
To encode/decode a set of UUIDs, first, specify the set of encoding characters:
|
149
|
+
|
150
|
+
[source,ruby]
|
151
|
+
----
|
152
|
+
base_string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-_'
|
153
|
+
----
|
154
|
+
|
155
|
+
Also, decide whether we want to preserve the order of the UUIDs:
|
156
|
+
|
157
|
+
[source,ruby]
|
158
|
+
----
|
159
|
+
ordered = true
|
160
|
+
----
|
161
|
+
|
162
|
+
[source,ruby]
|
163
|
+
----
|
164
|
+
encoded_uuids = uuid_packer.alphanum_compress(uuids, base_string, ordered)
|
165
|
+
#=> "Rf2XIjQmNnr_8rzlbLfRV+ZEgWLgxaMxBxIGPo9eLES5E75coyNNSZ8i2_tdxRT4"
|
166
|
+
|
167
|
+
decoded_uuids = uuid_packer.alphanum_decompress(encoded_uuids, base_string)
|
168
|
+
#=> ["ea8bed36-a73d-4fff-af36-32162274dfd1", "22347af1-7c60-48e0-8cc5-a30746812267", "3e514775-bfdb-44f9-92b2-c4c53a7dc89d"]
|
169
|
+
|
170
|
+
uuids == decoded_uuids
|
171
|
+
#=> true
|
172
|
+
----
|
173
|
+
|
174
|
+
|
175
|
+
If we don't care for the order:
|
176
|
+
|
177
|
+
[source,ruby]
|
178
|
+
----
|
179
|
+
ordered = false
|
180
|
+
----
|
181
|
+
|
182
|
+
[source,ruby]
|
183
|
+
----
|
184
|
+
unordered_encoded_uuids = uuid_packer.alphanum_compress(uuids, base_string, ordered)
|
185
|
+
unordered_decoded_uuids = uuid_packer.alphanum_decompress(unordered_encoded_uuids, base_string)
|
186
|
+
|
187
|
+
uuids == unordered_decoded_uuids
|
188
|
+
#=> false
|
189
|
+
|
190
|
+
uuids.sort == unordered_decoded_uuids.sort
|
191
|
+
#=> true
|
192
|
+
----
|
193
|
+
|
194
|
+
== Development
|
195
|
+
|
196
|
+
After checking out the repo, run `bin/setup` to install dependencies.
|
197
|
+
Then, run `bundle exec rake spec` to run the tests.
|
198
|
+
You can also run `bin/console` for an interactive prompt that will allow you to
|
199
|
+
experiment.
|
200
|
+
|
201
|
+
== Contributing
|
202
|
+
|
203
|
+
Bug reports and pull requests are welcome on GitHub at
|
204
|
+
https://github.com/riboseinc/id_pack. This project is intended to be a
|
205
|
+
safe, welcoming space for collaboration, and contributors are expected
|
206
|
+
to adhere to the http://contributor-covenant.org[Contributor Covenant]
|
207
|
+
code of conduct.
|
208
|
+
|
209
|
+
== License
|
210
|
+
|
211
|
+
The gem is available as open source under the terms of the
|
212
|
+
http://opensource.org/licenses/MIT[MIT License].
|
@@ -18,12 +18,12 @@
|
|
18
18
|
*
|
19
19
|
* Examples:
|
20
20
|
*
|
21
|
-
* //
|
21
|
+
* // encode the items in an Array
|
22
22
|
* var collection = [5, 6, 21, 23, 25];
|
23
23
|
* IdPacker.encodeHashKeys(collection);
|
24
24
|
* => "_E~C_O.V"
|
25
25
|
*
|
26
|
-
* //
|
26
|
+
* // encode the keys of an Object
|
27
27
|
* var collection = {
|
28
28
|
* 5: "a",
|
29
29
|
* 6: "b",
|
data/bin/console
CHANGED
data/lib/id_pack/id_packer.rb
CHANGED
@@ -11,15 +11,15 @@ module IdPack
|
|
11
11
|
#
|
12
12
|
# Example:
|
13
13
|
#
|
14
|
-
# IdPack::IdPacker.encode([5, 6, 21, 23, 25]) # => "_F~C_P.V"
|
14
|
+
# IdPack::IdPacker.new.encode([5, 6, 21, 23, 25]) # => "_F~C_P.V"
|
15
15
|
#
|
16
16
|
# decode:
|
17
17
|
# mainly used by the server to convert the compressed string back into
|
18
18
|
# the integer array
|
19
19
|
#
|
20
|
-
#
|
20
|
+
# Example:
|
21
21
|
#
|
22
|
-
#
|
22
|
+
# IdPack::IdPacker.new.decode("_F~C_P.V") # => [5, 6, 21, 23, 25]
|
23
23
|
|
24
24
|
class IdPacker
|
25
25
|
|
data/lib/id_pack/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: id_pack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
@@ -66,7 +66,7 @@ files:
|
|
66
66
|
- Gemfile
|
67
67
|
- Gemfile.lock
|
68
68
|
- LICENSE
|
69
|
-
- README.
|
69
|
+
- README.adoc
|
70
70
|
- Rakefile
|
71
71
|
- app/assets/javascripts/lib/id-packer.js
|
72
72
|
- app/assets/javascripts/lib/lz-string.js
|
@@ -101,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
101
|
version: '0'
|
102
102
|
requirements: []
|
103
103
|
rubyforge_project:
|
104
|
-
rubygems_version: 2.
|
104
|
+
rubygems_version: 2.6.8
|
105
105
|
signing_key:
|
106
106
|
specification_version: 4
|
107
107
|
summary: Compression and packing methods for singular and collection IDs and UUIDs.
|
data/README.md
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# IdPack
|
2
|
-
|
3
|
-
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/id_pack`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
6
|
-
|
7
|
-
## Installation
|
8
|
-
|
9
|
-
Add this line to your application's Gemfile:
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
gem 'id_pack'
|
13
|
-
```
|
14
|
-
|
15
|
-
And then execute:
|
16
|
-
|
17
|
-
$ bundle
|
18
|
-
|
19
|
-
Or install it yourself as:
|
20
|
-
|
21
|
-
$ gem install id_pack
|
22
|
-
|
23
|
-
## Usage
|
24
|
-
|
25
|
-
TODO: Write usage instructions here
|
26
|
-
|
27
|
-
## Development
|
28
|
-
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
-
|
31
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
-
|
33
|
-
## Contributing
|
34
|
-
|
35
|
-
Bug reports and pull requests are welcome on GitHub at
|
36
|
-
https://github.com/riboseinc/id_pack. This project is intended to be a safe,
|
37
|
-
welcoming space for collaboration, and contributors are expected to adhere to
|
38
|
-
the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
39
|
-
|