jagg 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cad2ab2e9fca8656974b6348bbfbf7889c083824
4
+ data.tar.gz: 62a6b23ae9ad5e7a760825d6c3d7252fa1ae41ff
5
+ SHA512:
6
+ metadata.gz: 36868c4227ec13ef3ca9ebc3f21682de1fe1212ff44dd28c4ebb5f1879dacfb304ae019e6361038147247d190516975851b19307bd96709a45fe3e03458567a5
7
+ data.tar.gz: 8eb5b1e1cbe564f8f3d6de2c0225055e2d922557e5dc87f286e818fe3be6759c67363213397c38a26273fc6e70b680458d1d78e68fe79ec5d68d8de027ad8e8d
data/.gitignore ADDED
@@ -0,0 +1,45 @@
1
+ # Packages #
2
+ ############
3
+ *.7z
4
+ *.dmg
5
+ *.gz
6
+ *.iso
7
+ *.jar
8
+ *.rar
9
+ *.tar
10
+ *.zip
11
+
12
+ # Logs #
13
+ ########
14
+ *.log
15
+
16
+ # Databases #
17
+ #############
18
+ *.sql
19
+ *.sqlite
20
+
21
+ # OS Files #
22
+ ############
23
+ .DS_Store
24
+ .Trashes
25
+ ehthumbs.db
26
+ Icon?
27
+ Thumbs.db
28
+
29
+ # Vagrant #
30
+ ###########
31
+ .vagrant
32
+
33
+ # Ruby Files #
34
+ ##############
35
+ /.bundle/
36
+ /.yardoc
37
+ /Gemfile.lock
38
+ /_yardoc/
39
+ /coverage/
40
+ /doc/
41
+ /pkg/
42
+ /spec/reports/
43
+ /tmp/
44
+ /vendor/bundle/
45
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format doc
3
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # JAGG
2
+
3
+ Just Another Gravatar Gem!
4
+
5
+ This gem uses the Gravatar API to provide you with both profile and image data.
6
+
7
+ ## Installation
8
+
9
+ You can install **JAGG** using the following command:
10
+
11
+ $ gem install jagg
12
+
13
+ ## Development
14
+
15
+ After checking out the repo, run `rake spec` to run the tests.
16
+
17
+ To install this gem onto your local machine, run `bundle exec rake install`.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
data/Vagrantfile ADDED
@@ -0,0 +1,22 @@
1
+ # Get the name of the gem
2
+ name = File.basename(File.expand_path('..', __FILE__))
3
+ raise 'Could not determine gem name' unless name
4
+
5
+ # Configure Vagrant
6
+ Vagrant.configure(2) do |config|
7
+ config.vm.box = 'ubuntu/xenial64'
8
+ config.vm.synced_folder './', "/opt/#{name}"
9
+ config.vm.provision 'shell', inline: <<-SHELL
10
+ locale-gen en_GB.UTF-8
11
+ apt-get update
12
+ apt-get dist-upgrade -y
13
+ apt-get install build-essential git software-properties-common -y
14
+ apt-add-repository ppa:brightbox/ruby-ng -y
15
+ apt-get update
16
+ apt-get install ruby2.3 ruby2.3-dev -y
17
+ echo 'export PATH="$PATH:$HOME/.gem/ruby/2.3.0/bin"' | su vagrant -l -c 'tee -a ~/.bash_profile'
18
+ echo 'gem: --no-document --user-install' | su vagrant -l -c 'tee -a ~/.gemrc'
19
+ su vagrant -l -c 'gem install bundle'
20
+ su vagrant -l -c "cd /opt/#{name}; bundle install"
21
+ SHELL
22
+ end
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'jagg'
5
+ require 'irb'
6
+
7
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
data/jagg.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jagg/constants'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'jagg'
8
+ spec.version = JAGG::VERSION
9
+ spec.authors = ['Nialto Services']
10
+ spec.email = ['support@nialtoservices.co.uk']
11
+
12
+ spec.summary = %q{Just Another Gravatar Gem}
13
+ spec.description = %q{This gem uses the Gravatar API to provide you with both profile and image data.}
14
+ spec.homepage = 'https://github.com/nialtoservices/jagg'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'argspec', '~> 0.3', '>= 0.3.3'
22
+ spec.add_dependency 'httpclient', '~> 2.8', '>= 2.8.2.4'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.11'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 3.0'
27
+ end
data/lib/jagg.rb ADDED
@@ -0,0 +1,23 @@
1
+ module JAGG
2
+ class << self
3
+ # Load the gem's dependencies
4
+ #
5
+ # @api private
6
+ #
7
+ def load!
8
+ require 'argspec'
9
+ require 'digest/md5'
10
+ require 'httpclient'
11
+ require 'json'
12
+ require 'uri'
13
+
14
+ require 'jagg/constants'
15
+ require 'jagg/helpers/string'
16
+ require 'jagg/gravatar'
17
+ require 'jagg/gravatar/image'
18
+ require 'jagg/gravatar/profile'
19
+ end
20
+ end
21
+ end
22
+
23
+ JAGG.load!
@@ -0,0 +1,3 @@
1
+ module JAGG
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,22 @@
1
+ module JAGG
2
+ # The Gravatar class (and it's namespaces) are used to convert the data from
3
+ # Gravatar's API into objects.
4
+ #
5
+ class Gravatar
6
+ class << self
7
+ # Get the HTTP Client.
8
+ #
9
+ # @return [HTTPClient] A HTTPClient instance.
10
+ # @example
11
+ # JAGG::Gravatar.http_client
12
+ #
13
+ def http_client
14
+ return @client if @client
15
+
16
+ @client = HTTPClient.new
17
+ @client.redirect_uri_callback = Proc.new { |uri, result| result.header['location'][0] }
18
+ @client
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,105 @@
1
+ module JAGG
2
+ class Gravatar
3
+ # This class holds an image contained within the profile data.
4
+ #
5
+ class Image
6
+ class << self
7
+ include ArgumentSpecification::DSL
8
+
9
+ # Get the Gravatar image URL for an email.
10
+ #
11
+ # @param email [String] The user's email address.
12
+ # @param size [Integer] The size of the image (in pixels).
13
+ # @return [String] The URL to the gravatar image.
14
+ # @example Get a Thumbnail
15
+ # JAGG::Gravatar::Image.url('user@example.com') #=> "https://www.gravatar.com/avatar/b58996c504c5638798eb6b511e6f49af"
16
+ # @example Get a custom size
17
+ # JAGG::Gravatar::Image.url('user@example.com', 256) #=> "https://www.gravatar.com/avatar/b58996c504c5638798eb6b511e6f49af?size=256"
18
+ #
19
+ def url(email, size = nil)
20
+ argument(email) { should be_a(String) }
21
+ argument(size) { should be_an(Integer) } if size
22
+
23
+ uri = URI.parse('https://www.gravatar.com/')
24
+ uri.path = '/avatar/' + email.to_md5
25
+ uri.query = 'size=' + size.to_s if size
26
+ uri.to_s
27
+ end
28
+
29
+ # Get a Gravatar image object for an email.
30
+ #
31
+ # @param email [String] The user's email address.
32
+ # @return [JAGG::Gravatar::Image] A gravatar image object.
33
+ # @example
34
+ # JAGG::Gravatar::Image.for('user@example.com') #=> #<JAGG::Gravatar::Image:0x00000000000000 ...>
35
+ #
36
+ def for(email)
37
+ new(url(email))
38
+ end
39
+ end
40
+
41
+ include ArgumentSpecification::DSL
42
+
43
+ # The URL to the image.
44
+ #
45
+ attr_reader :url
46
+
47
+ # The type/kind of image (optional).
48
+ #
49
+ attr_reader :kind
50
+
51
+ # Create a new image object.
52
+ #
53
+ # @param url [String] The url to the image.
54
+ # @param kind [Symbol] The type/kind of image.
55
+ # @example
56
+ # JAGG::Gravatar::Image.new(url, kind) #=> #<JAGG::Gravatar::Image:0x00000000000000 ...>
57
+ #
58
+ def initialize(url, kind = nil)
59
+ uri = URI.parse(url)
60
+ uri.query = nil
61
+ @url = uri.to_s
62
+ @kind = kind
63
+ end
64
+
65
+ # Get the URL for the image at a specific size.
66
+ #
67
+ # @param size [Integer] The size of the image (in pixels).
68
+ # @return [String] The URL of the image at the specified size.
69
+ # @example
70
+ # image.url_of_size(256) #=> "https://www.gravatar.com/avatar/b58996c504c5638798eb6b511e6f49af?size=256"
71
+ #
72
+ def url_of_size(size)
73
+ return nil unless @url
74
+
75
+ argument(size) do
76
+ should be_an(Integer)
77
+ should be_within_range(1..2048)
78
+ end
79
+
80
+ uri = URI.parse(@url)
81
+ uri.query = 'size=' + size.to_s
82
+ uri.to_s
83
+ end
84
+
85
+ # Fetch the image data.
86
+ #
87
+ # @param size [Integer] The size of the image (in pixels).
88
+ # @return [String] The raw image data.
89
+ # @example
90
+ # image.fetch #=> "..."
91
+ #
92
+ def fetch(size = nil)
93
+ return nil unless @url
94
+
95
+ url = size ? url_of_size(size) : @url
96
+
97
+ response = Gravatar.http_client.get(url, follow_redirect: true)
98
+
99
+ return nil unless response.ok?
100
+
101
+ response.body
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,127 @@
1
+ module JAGG
2
+ class Gravatar
3
+ # This class is responsible for fetching and parsing a user's profile.
4
+ #
5
+ class Profile
6
+ class << self
7
+ include ArgumentSpecification::DSL
8
+
9
+ # Get the Gravatar profile URL for an email.
10
+ #
11
+ # @param email [String] The user's email address.
12
+ # @param format [Symbol] The format to render the profile in.
13
+ # @return [String] The URL to the gravatar profile.
14
+ # @example HTML Format (default)
15
+ # JAGG::Gravatar::Profile.url('user@example.com') #=> "https://www.gravatar.com/b58996c504c5638798eb6b511e6f49af"
16
+ # @example JSON Format
17
+ # JAGG::Gravatar::Profile.url('user@example.com', :json) #=> "https://www.gravatar.com/b58996c504c5638798eb6b511e6f49af.json"
18
+ # @example XML Format
19
+ # JAGG::Gravatar::Profile.url('user@example.com', :xml) #=> "https://www.gravatar.com/b58996c504c5638798eb6b511e6f49af.xml"
20
+ #
21
+ def url(email, format = nil)
22
+ argument(email) { should be_a(String) }
23
+ argument(format) { should be_one_of(:json, :xml) } if format
24
+
25
+ uri = URI.parse('https://www.gravatar.com/')
26
+ uri.path = '/' + email.to_md5
27
+ uri.path += '.' + format.to_s if format
28
+ uri.to_s
29
+ end
30
+
31
+ # Get a Gravatar profile object for an email.
32
+ #
33
+ # @param email [String] The user's email address.
34
+ # @return [JAGG::Gravatar::Profile] A gravatar profile object.
35
+ # @example
36
+ # JAGG::Gravatar::Profile.for('user@example.com') #=> #<JAGG::Gravatar::Profile:0x00000000000000 ...>
37
+ #
38
+ def for(email)
39
+ response = Gravatar.http_client.get(url(email, :json), follow_redirect: true)
40
+
41
+ return nil unless response.ok?
42
+ return nil unless response = JSON.parse(response.body)
43
+ return nil unless response = response['entry'][0] rescue nil
44
+
45
+ new(response)
46
+ end
47
+ end
48
+
49
+ # The user's gravatar identifier.
50
+ #
51
+ attr_reader :gravatar_id
52
+
53
+ # The user's first name.
54
+ #
55
+ attr_reader :first_name
56
+
57
+ # The user's last name.
58
+ #
59
+ attr_reader :last_name
60
+
61
+ # The user's formatted name (usually full name).
62
+ #
63
+ attr_reader :formatted_name
64
+
65
+ # The user's display name.
66
+ #
67
+ attr_reader :display_name
68
+
69
+ # The user's preferred username.
70
+ #
71
+ attr_reader :preferred_username
72
+
73
+ # The user's thumbnail image.
74
+ #
75
+ attr_reader :thumbnail
76
+
77
+ # An array of the user's images.
78
+ #
79
+ attr_reader :images
80
+
81
+ private
82
+ # Create a new profile instance
83
+ #
84
+ # @param raw [Hash] A hash containins raw profile data.
85
+ # @example
86
+ # Profile.new(raw) #=> #<JAGG::Gravatar::Profile:0x00000000000000 ...>
87
+ #
88
+ def initialize(raw)
89
+ @gravatar_id = raw['id']
90
+
91
+ if display_name = raw['displayName']
92
+ @display_name = display_name
93
+ end
94
+
95
+ if preferred_username = raw['preferredUsername']
96
+ @preferred_username = preferred_username
97
+ end
98
+
99
+ if thumbnail_url = raw['thumbnailUrl']
100
+ @thumbnail = Gravatar::Image.new(thumbnail_url, :thumbnail)
101
+ end
102
+
103
+ if raw['photos'].is_a?(Array)
104
+ @images = raw['photos'].map do |data|
105
+ Gravatar::Image.new(data['value'], data['type'].to_sym)
106
+ end
107
+ else
108
+ @images = []
109
+ end
110
+
111
+ if raw['name'].is_a?(Hash)
112
+ if first_name = raw['name']['givenName']
113
+ @first_name = first_name
114
+ end
115
+
116
+ if last_name = raw['name']['familyName']
117
+ @last_name = last_name
118
+ end
119
+
120
+ if formatted_name = raw['name']['formatted']
121
+ @formatted_name = formatted_name
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,10 @@
1
+ class ::String
2
+ # Convert the string into an MD5 hash
3
+ #
4
+ # @example
5
+ # "Hello, World!".to_md5 #=> "65a8e27d8879283831b664bd8b7f0ad4"
6
+ #
7
+ def to_md5
8
+ Digest::MD5.hexdigest(self)
9
+ end
10
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'jagg'
@@ -0,0 +1,2 @@
1
+ describe JAGG::Gravatar::Image do
2
+ end
@@ -0,0 +1,2 @@
1
+ describe JAGG::Gravatar::Profile do
2
+ end
@@ -0,0 +1,10 @@
1
+ describe String do
2
+ context 'a string' do
3
+ subject { 'Hello, World!' }
4
+ let(:md5) { '65a8e27d8879283831b664bd8b7f0ad4' }
5
+
6
+ it '.to_md5' do
7
+ expect(subject.to_md5).to eq(md5)
8
+ end
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jagg
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Nialto Services
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: argspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.3'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.3.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.3'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.3.3
33
+ - !ruby/object:Gem::Dependency
34
+ name: httpclient
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.8'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 2.8.2.4
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '2.8'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.8.2.4
53
+ - !ruby/object:Gem::Dependency
54
+ name: bundler
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.11'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '1.11'
67
+ - !ruby/object:Gem::Dependency
68
+ name: rake
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '10.0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '10.0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: rspec
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '3.0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '3.0'
95
+ description: This gem uses the Gravatar API to provide you with both profile and image
96
+ data.
97
+ email:
98
+ - support@nialtoservices.co.uk
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - ".gitignore"
104
+ - ".rspec"
105
+ - Gemfile
106
+ - README.md
107
+ - Rakefile
108
+ - Vagrantfile
109
+ - bin/console
110
+ - bin/setup
111
+ - jagg.gemspec
112
+ - lib/jagg.rb
113
+ - lib/jagg/constants.rb
114
+ - lib/jagg/gravatar.rb
115
+ - lib/jagg/gravatar/image.rb
116
+ - lib/jagg/gravatar/profile.rb
117
+ - lib/jagg/helpers/string.rb
118
+ - spec/spec_helper.rb
119
+ - spec/unit/jagg/gravatar/image_spec.rb
120
+ - spec/unit/jagg/gravatar/profile_spec.rb
121
+ - spec/unit/jagg/helpers/string_spec.rb
122
+ homepage: https://github.com/nialtoservices/jagg
123
+ licenses:
124
+ - MIT
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.6.7
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Just Another Gravatar Gem
146
+ test_files:
147
+ - spec/spec_helper.rb
148
+ - spec/unit/jagg/gravatar/image_spec.rb
149
+ - spec/unit/jagg/gravatar/profile_spec.rb
150
+ - spec/unit/jagg/helpers/string_spec.rb