ruby_identicon 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 763a08551f9e59b52c16fd37d6f49a4818d1b474
4
+ data.tar.gz: ce13ad62ec04828f27d775eb59992e71eae6993c
5
+ SHA512:
6
+ metadata.gz: ad4ac658f45c965c815849e5b04d4fa74fa9206524a276368aaff96b8013673b4e4588e3e3ba5cdcc79c9cc9e5c03b4e49cb7d67ca601549a1589c09b205372e
7
+ data.tar.gz: 8f5a5a5b9e7d6b70dfefa75367b3fed413270ea15fd9557891083e191cada9c45fd5d88a39b5c0a5709f843e1c7868764b2f2b4a2eadc56d1469abeb0439b0dd
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ruby_identicon.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Chris Branson
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # RubyIdenticon
2
+
3
+ ![Example Identicon](https://dl.dropboxusercontent.com/u/176278/ruby_identicon.png)
4
+
5
+ A Ruby implementation of [go-identicon](https://github.com/dgryski/go-identicon) by Damian Gryski
6
+
7
+ RubyIdenticon creates an [identicon](https://en.wikipedia.org/wiki/Identicon), similar to those created by [Github](https://github.com/blog/1586-identicons).
8
+
9
+ A title and key are used by siphash to calculate a hash value that is then used to create a visual identicon representation. The identicon is made by creating a left hand side pixel representation of each bit in the hash value - this is then mirrored onto the right hand side to create an image that we see as a shape. The grid and square sizes can be varied to create identicons of differing size.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'ruby_identicon'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install ruby_identicon
24
+
25
+ ## Usage
26
+
27
+ Creating an identicon and saving to png
28
+
29
+ RubyIdenticon.create_and_save("RubyIdenticon", "ruby_identicon.png")
30
+
31
+ Creating an identicon and returning a binary string
32
+
33
+ blob = RubyIdenticon.create("RubyIdenticon")
34
+
35
+ # optional, save to a file
36
+ File.open("ruby_identicon.png", "wb") do |f| f.write(blob) end
37
+
38
+ ## Customising the identicon
39
+
40
+ The identicon can be customised by passing additional options
41
+
42
+ background_color: (Integer, default 0) the background color of the identicon in rgba notation (e.g. xffffffff for white)
43
+ border_size: (Integer, default 35) the size in pixels to leave as an empty border around the identicon image
44
+ grid_size: (Integer, default 7) the number of rows and columns in the identicon, minimum 4, maximum 9
45
+ square_size: (Integer, default 50) the size in pixels of each square that makes up the identicon
46
+ key: (String) a 16 byte key used by siphash when calculating the hash value (see note below)
47
+
48
+ Varying the key ensures uniqueness of an identicon for a given title, it is assumed desirable for different applications
49
+ to use a different key.
50
+
51
+ Example
52
+
53
+ blob = RubyIdenticon.create("identicons are great!", grid_size: 5, square_size: 70, background_color: 0xf0f0f0ff, key: "1234567890123456")
54
+ File.open("tmp/test_identicon.png", "wb") do |f| f.write(blob) end
55
+
56
+ ## Contributing
57
+
58
+ 1. Fork it
59
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
60
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
61
+ 4. Push to the branch (`git push origin my-new-feature`)
62
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,143 @@
1
+ #--
2
+ # Copyright (c) 2013 Chris Branson
3
+ #
4
+ # Based on the go-identicon code at https://github.com/dgryski/go-identicon
5
+ # go-identicon Copyright (c) 2013, Damian Gryski <damian@gryski.com>
6
+ # Credit to Damian Gryski for the original concept.
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining
9
+ # a copy of this software and associated documentation files (the
10
+ # "Software"), to deal in the Software without restriction, including
11
+ # without limitation the rights to use, copy, modify, merge, publish,
12
+ # distribute, sublicense, and/or sell copies of the Software, and to
13
+ # permit persons to whom the Software is furnished to do so, subject to
14
+ # the following conditions:
15
+ #
16
+ # The above copyright notice and this permission notice shall be
17
+ # included in all copies or substantial portions of the Software.
18
+ #
19
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
+ #++
27
+
28
+ #
29
+ # A Ruby implementation of go-identicon
30
+ #
31
+ # RubyIdenticon creates an Identicon, similar to those created by Github.
32
+ #
33
+ # A title and key are used by siphash to calculate a hash value that is
34
+ # then used to create a visual identicon representation.
35
+ #
36
+ # The identicon is made by creating a left hand side pixel representation
37
+ # of each bit in the hash value - this is then mirrored onto the right
38
+ # hand side to create an image that we see as a shape.
39
+ #
40
+ # The grid and square sizes can be varied to create identicons of
41
+ # differing size.
42
+ #
43
+
44
+ require "ruby_identicon/version"
45
+ require "chunky_png"
46
+ require "siphash"
47
+
48
+ module RubyIdenticon
49
+ # the default paramters used when creating identicons
50
+ #
51
+ # background_color: (Integer, default 0) the background color of the identicon in rgba notation (e.g. xffffffff for white)
52
+ # border_size: (Integer, default 35) the size in pixels to leave as an empty border around the identicon image
53
+ # grid_size: (Integer, default 7) the number of rows and columns in the identicon, minimum 4, maximum 9
54
+ # square_size: (Integer, default 50) the size in pixels of each square that makes up the identicon
55
+ # key: (String) a 16 byte key used by siphash when calculating the hash value (see note below)
56
+ #
57
+ # varying the key ensures uniqueness of an identicon for a given title, it is assumed desirable for different applications
58
+ # to use a different key.
59
+ #
60
+
61
+ DEFAULT_PARAMETERS = {
62
+ border_size: 35,
63
+ square_size: 50,
64
+ grid_size: 7,
65
+ background_color: ChunkyPNG::Color::TRANSPARENT,
66
+ key: "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xAA\xBB\xCC\xDD\xEE\xFF"
67
+ }
68
+
69
+ # create an identicon png and save it to the given filename
70
+ #
71
+ # Example:
72
+ # >> RubyIdenticon.create_and_save("identicons are great!", "test_identicon.png")
73
+ # => result (Boolean)
74
+ #
75
+ # Arguments:
76
+ # title: (String)
77
+ # filename: (String)
78
+ # options: (Hash)
79
+
80
+ def self.create_and_save(title, filename, options = {})
81
+ raise "filename cannot be nil" if filename == nil
82
+
83
+ blob = create(title, options)
84
+ return false if blob == nil
85
+
86
+ File.open(filename, "wb") do |f| f.write(blob) end
87
+ end
88
+
89
+ # create an identicon png and return it as a binary string
90
+ #
91
+ # Example:
92
+ # >> RubyIdenticon.create("identicons are great!")
93
+ # => binary blob (String)
94
+ #
95
+ # Arguments:
96
+ # title: (String)
97
+ # options: (Hash)
98
+
99
+ def self.create(title, options = {})
100
+ options = DEFAULT_PARAMETERS.merge(options)
101
+
102
+ raise "title cannot be nil" if title == nil
103
+ raise "key is nil or less than 16 bytes" if options[:key] == nil || options[:key].length < 16
104
+ raise "grid_size must be between 4 and 9" if options[:grid_size] < 4 || options[:grid_size] > 9
105
+ raise "invalid border size" if options[:border_size] < 0
106
+ raise "invalid square size" if options[:square_size] < 0
107
+
108
+ hash = SipHash.digest(options[:key], title)
109
+
110
+ png = ChunkyPNG::Image.new((options[:border_size] * 2) + (options[:square_size] * options[:grid_size]),
111
+ (options[:border_size] * 2) + (options[:square_size] * options[:grid_size]), options[:background_color])
112
+
113
+ # set the foreground color by using the first three bytes of the hash value
114
+ color = ChunkyPNG::Color.rgba((hash & 0xff), ((hash >> 8) & 0xff), ((hash >> 16) & 0xff), 0xff)
115
+
116
+ # remove the first three bytes that were used for the foreground color
117
+ hash >>= 24
118
+
119
+ sqx = sqy = 0
120
+ for i in 0..(options[:grid_size] * ((options[:grid_size]+1) / 2))
121
+ if hash & 1 == 1
122
+ x = options[:border_size] + (sqx * options[:square_size])
123
+ y = options[:border_size] + (sqy * options[:square_size])
124
+
125
+ # left hand side
126
+ png.rect(x, y, x + options[:square_size], y + options[:square_size], color, color)
127
+
128
+ # mirror right hand side
129
+ x = options[:border_size] + ((options[:grid_size] - 1 - sqx) * options[:square_size])
130
+ png.rect(x, y, x + options[:square_size], y + options[:square_size], color, color)
131
+ end
132
+
133
+ hash >>= 1
134
+ sqy += 1
135
+ if sqy == options[:grid_size]
136
+ sqy = 0
137
+ sqx += 1
138
+ end
139
+ end
140
+
141
+ png.to_blob :color_mode => ChunkyPNG::COLOR_INDEXED
142
+ end
143
+ end
@@ -0,0 +1,3 @@
1
+ module RubyIdenticon
2
+ VERSION = "0.0.1"
3
+ end
data/lib/siphash.rb ADDED
@@ -0,0 +1,117 @@
1
+ #--
2
+ # Copyright (c) 2012 Martin Boßlet
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ module SipHash
25
+
26
+ def self.digest(key, msg)
27
+ s = State.new(key)
28
+ len = msg.size
29
+ iter = len / 8
30
+
31
+ iter.times do |i|
32
+ m = msg.slice(i * 8, 8).unpack("Q<")[0]
33
+ s.apply_block(m)
34
+ end
35
+
36
+ m = last_block(msg, len, iter)
37
+
38
+ s.apply_block(m)
39
+ s.finalize
40
+ s.digest
41
+ end
42
+
43
+ private
44
+
45
+ def self.last_block(msg, len, iter)
46
+ last = (len << 56) & State::MASK_64;
47
+
48
+ r = len % 8
49
+ off = iter * 8
50
+
51
+ last |= msg[off + 6].ord << 48 if r >= 7
52
+ last |= msg[off + 5].ord << 40 if r >= 6
53
+ last |= msg[off + 4].ord << 32 if r >= 5
54
+ last |= msg[off + 3].ord << 24 if r >= 4
55
+ last |= msg[off + 2].ord << 16 if r >= 3
56
+ last |= msg[off + 1].ord << 8 if r >= 2
57
+ last |= msg[off].ord if r >= 1
58
+ last
59
+ end
60
+
61
+ class State
62
+
63
+ MASK_64 = 0xffffffffffffffff
64
+
65
+ def initialize(key)
66
+ @v0 = 0x736f6d6570736575
67
+ @v1 = 0x646f72616e646f6d
68
+ @v2 = 0x6c7967656e657261
69
+ @v3 = 0x7465646279746573
70
+
71
+ k0 = key.slice(0, 8).unpack("Q<")[0]
72
+ k1 = key.slice(8, 8).unpack("Q<")[0]
73
+
74
+ @v0 ^= k0
75
+ @v1 ^= k1
76
+ @v2 ^= k0
77
+ @v3 ^= k1
78
+ end
79
+
80
+ def apply_block(m)
81
+ @v3 ^= m
82
+ 2.times { compress }
83
+ @v0 ^= m
84
+ end
85
+
86
+ def rotl64(num, shift)
87
+ ((num << shift) & MASK_64) | (num >> (64 - shift))
88
+ end
89
+
90
+ def compress
91
+ @v0 = (@v0 + @v1) & MASK_64
92
+ @v2 = (@v2 + @v3) & MASK_64
93
+ @v1 = rotl64(@v1, 13)
94
+ @v3 = rotl64(@v3, 16)
95
+ @v1 ^= @v0
96
+ @v3 ^= @v2
97
+ @v0 = rotl64(@v0, 32)
98
+ @v2 = (@v2 + @v1) & MASK_64
99
+ @v0 = (@v0 + @v3) & MASK_64
100
+ @v1 = rotl64(@v1, 17)
101
+ @v3 = rotl64(@v3, 21)
102
+ @v1 ^= @v2
103
+ @v3 ^= @v0
104
+ @v2 = rotl64(@v2, 32)
105
+ end
106
+
107
+ def finalize
108
+ @v2 ^= 0xff
109
+ 4.times { compress }
110
+ end
111
+
112
+ def digest
113
+ @v0 ^ @v1 ^ @v2 ^ @v3
114
+ end
115
+
116
+ end
117
+ end
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ruby_identicon/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ruby_identicon"
8
+ spec.version = RubyIdenticon::VERSION
9
+ spec.authors = ["Chris Branson"]
10
+ spec.email = ["branson.chris@gmail.com"]
11
+
12
+ spec.description = <<-EOT
13
+ A Ruby implementation of go-identicon by Damian Gryski
14
+
15
+ RubyIdenticon creates an identicon, similar to those created by Github.
16
+
17
+ A title and key are used by siphash to calculate a hash value that is then used
18
+ to create a visual identicon representation. The identicon is made by creating
19
+ a left hand side pixel representation of each bit in the hash value, this is then
20
+ mirrored onto the right hand side to create an image that we see as a shape.
21
+
22
+ The grid and square sizes can be varied to create identicons of differing size.
23
+ EOT
24
+
25
+ spec.summary = %q{A Ruby Gem for creating GitHub like identicons}
26
+ spec.homepage = ""
27
+ spec.license = "MIT"
28
+
29
+ spec.files = `git ls-files`.split($/)
30
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
31
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
32
+ spec.require_paths = ["lib"]
33
+
34
+ spec.add_development_dependency "bundler", "~> 1.3"
35
+ spec.add_development_dependency "rake"
36
+ spec.add_development_dependency "rspec", "~> 2.6"
37
+
38
+ spec.add_dependency "chunky_png", "~> 1.2.8"
39
+ end
@@ -0,0 +1,66 @@
1
+ require 'rspec'
2
+ require 'ruby_identicon'
3
+
4
+ describe RubyIdenticon do
5
+ it "creates a binary string image blob" do
6
+ expect(RubyIdenticon.create("RubyIdenticon")).to be_a_kind_of(String)
7
+ end
8
+
9
+ it "does not create a binary string image blob with an invalid title" do
10
+ lambda { RubyIdenticon.create(nil) }.should raise_exception("title cannot be nil")
11
+ end
12
+
13
+ it "does not create a binary string image blob with an invalid key" do
14
+ lambda { RubyIdenticon.create("identicons are great!", key: "\x00\x11\x22\x33\x44") }.should raise_exception("key is nil or less than 16 bytes")
15
+ end
16
+
17
+ it "does not create a binary string image blob with an invalid grid size" do
18
+ lambda { RubyIdenticon.create("RubyIdenticon", grid_size: 2) }.should raise_exception("grid_size must be between 4 and 9")
19
+ lambda { RubyIdenticon.create("RubyIdenticon", grid_size: 20) }.should raise_exception("grid_size must be between 4 and 9")
20
+ end
21
+
22
+ it "does not create a binary string image blob with an invalid square_size size" do
23
+ lambda { RubyIdenticon.create("RubyIdenticon", square_size: -2) }.should raise_exception("invalid square size")
24
+ end
25
+
26
+ it "does not create a binary string image blob with an invalid border_size size" do
27
+ lambda { RubyIdenticon.create("RubyIdenticon", border_size: -2) }.should raise_exception("invalid border size")
28
+ end
29
+
30
+
31
+
32
+ it "creates a png image file" do
33
+ blob = RubyIdenticon.create("RubyIdenticon")
34
+ result = File.open("tmp/ruby_identicon.png", "wb") do |f| f.write(blob) end
35
+ expect(result).to be_true
36
+ end
37
+
38
+ it "creates a png image file of grid size 5, square size 70 and grey background" do
39
+ blob = RubyIdenticon.create("RubyIdenticon", grid_size: 5, square_size: 70, background_color: 0xf0f0f0ff, key: "1234567890123456")
40
+ result = File.open("tmp/ruby_identicon_gs5_white.png", "wb") do |f| f.write(blob) end
41
+ expect(result).to be_true
42
+ end
43
+
44
+ it "creates 10 png image files" do
45
+ 10.times do |count|
46
+ blob = RubyIdenticon.create("RubyIdenticon_#{count}")
47
+ result = File.open("tmp/ruby_identicon_#{count}.png", "wb") do |f| f.write(blob) end
48
+ expect(result).to be_true
49
+ end
50
+ end
51
+
52
+
53
+
54
+ it "creates a png image file via create_and_save" do
55
+ result = RubyIdenticon.create_and_save("RubyIdenticon is fun", "tmp/test_identicon.png")
56
+ expect(result).to be_true
57
+ end
58
+
59
+ it "does not create a png image file via create_and_save with an invalid filename" do
60
+ lambda { RubyIdenticon.create_and_save("RubyIdenticon is fun", nil) }.should raise_exception("filename cannot be nil")
61
+ end
62
+
63
+ it "does not create a png image file via create_and_save with an invalid title" do
64
+ lambda { RubyIdenticon.create_and_save(nil, "tmp/test_identicon.png") }.should raise_exception("title cannot be nil")
65
+ end
66
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby_identicon
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Chris Branson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '2.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: chunky_png
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.8
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 1.2.8
69
+ description: |2
70
+ A Ruby implementation of go-identicon by Damian Gryski
71
+
72
+ RubyIdenticon creates an identicon, similar to those created by Github.
73
+
74
+ A title and key are used by siphash to calculate a hash value that is then used
75
+ to create a visual identicon representation. The identicon is made by creating
76
+ a left hand side pixel representation of each bit in the hash value, this is then
77
+ mirrored onto the right hand side to create an image that we see as a shape.
78
+
79
+ The grid and square sizes can be varied to create identicons of differing size.
80
+ email:
81
+ - branson.chris@gmail.com
82
+ executables: []
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - .gitignore
87
+ - Gemfile
88
+ - LICENSE.txt
89
+ - README.md
90
+ - Rakefile
91
+ - lib/ruby_identicon.rb
92
+ - lib/ruby_identicon/version.rb
93
+ - lib/siphash.rb
94
+ - ruby_identicon.gemspec
95
+ - spec/ruby_identicon_spec.rb
96
+ homepage: ''
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 2.0.7
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: A Ruby Gem for creating GitHub like identicons
120
+ test_files:
121
+ - spec/ruby_identicon_spec.rb