jagg 0.1.0

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: 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