noun-project-api 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bb8a4380606b5d326ccc449f4a077194e6386631
4
- data.tar.gz: 54a5dad9793a4ee4d0ed2bebd75a546285e2235d
3
+ metadata.gz: 0dcbb2c72c7cbc5df96879c43521e83d3016f70c
4
+ data.tar.gz: 7f6855dcc4b3f50824c83354401b7b3895a50cc5
5
5
  SHA512:
6
- metadata.gz: a825ef76bc8e82cc2a6b7657e6f0b1a1bedff16370c682461c40238d5173d2b08e0f7c83aa1eebb7ab49c3d3545c7aa8f838793ee45e37d3ed40b004579196e8
7
- data.tar.gz: a9e9ee20eba171b591213b651a47af9ad207fef400005ed8ae40fab7780876ba714b52797d16658252c6fad522eea09cfe06e4ec1e3c322e9578be47ed5c368b
6
+ metadata.gz: 60016d2253fe5e65ce2aec847d0c26d76e348baecf6f2b7c53e33eaca44bb97a2824d3d0abe495be68755bffc1ff394b2b1104dc132c19676d8f36d79243218a
7
+ data.tar.gz: 1951a91ccdf5b4e83be25c3612a84beb987a7af3d2de524d916eef2d142724cd76ea0262c35fd6de484c8380c403291051ac3b243d6f0f079a12e558f3bfb909
@@ -1,10 +1,15 @@
1
1
  require 'oauth'
2
2
  require 'json'
3
+ require 'noun-project-api/connection'
3
4
  require 'noun-project-api/icon_retriever'
5
+ require 'noun-project-api/reporter'
4
6
  require 'noun-project-api/icons_retriever'
5
7
  require 'noun-project-api/icon'
6
8
 
9
+ # Top level name space for the entire Gem.
7
10
  module NounProjectApi
11
+ API_BASE = 'http://api.thenounproject.com'
12
+
8
13
  def self.configuration
9
14
  @configuration ||= Configuration.new
10
15
  end
@@ -14,6 +19,7 @@ module NounProjectApi
14
19
  yield(configuration) if block_given?
15
20
  end
16
21
 
22
+ # Main configuration class.
17
23
  class Configuration
18
24
  attr_accessor :public_domain
19
25
 
@@ -0,0 +1,14 @@
1
+ module NounProjectApi
2
+ # Basic connection methods and setup.
3
+ module Connection
4
+ attr_accessor :token, :secret, :access_token
5
+
6
+ def initialize(token, secret)
7
+ @token = token
8
+ @secret = secret
9
+ fail(ArgumentError, 'Missing token or secret') unless @token && @secret
10
+
11
+ @access_token = OAuth::AccessToken.new(OAuth::Consumer.new(token, secret))
12
+ end
13
+ end
14
+ end
@@ -1,35 +1,36 @@
1
1
  module NounProjectApi
2
+ # A single Icon as an abstracted ruby object.
2
3
  class Icon
3
4
  PREVIEW_SIZE_200 = 200
4
5
  PREVIEW_SIZE_42 = 42
5
6
  PREVIEW_SIZE_84 = 84
6
7
 
7
- PUBLIC_DOMAIN_LICENSE = "public-domain"
8
+ PUBLIC_DOMAIN_LICENSE = 'public-domain'
8
9
 
9
10
  attr_accessor :original_hash
10
11
 
11
12
  def initialize(origin)
12
13
  origin = JSON.parse(origin) if origin.is_a? String
13
- origin = origin.delete("icon") if origin.key? "icon"
14
+ origin = origin.delete('icon') if origin.key? 'icon'
14
15
 
15
16
  @original_hash = origin
16
17
  end
17
18
 
18
19
  def id
19
- original_hash["id"].to_i
20
+ original_hash['id'].to_i
20
21
  end
21
22
 
22
23
  def public_domain?
23
- original_hash["license_description"] == PUBLIC_DOMAIN_LICENSE
24
+ original_hash['license_description'] == PUBLIC_DOMAIN_LICENSE
24
25
  end
25
26
 
26
27
  def svg_url
27
- original_hash["icon_url"]
28
+ original_hash['icon_url']
28
29
  end
29
30
 
30
31
  def preview_url(size = PREVIEW_SIZE_200)
31
32
  if size == PREVIEW_SIZE_200
32
- original_hash["preview_url"]
33
+ original_hash['preview_url']
33
34
  else
34
35
  original_hash["preview_url_#{size}"]
35
36
  end
@@ -1,14 +1,16 @@
1
1
  require 'noun-project-api/retriever'
2
2
 
3
3
  module NounProjectApi
4
+ # Retrieve an icon.
4
5
  class IconRetriever < Retriever
5
- API_PATH = "/icon/"
6
+ API_PATH = '/icon/'
6
7
 
8
+ # Find an icon based on it's id.
7
9
  def find(id)
8
- raise ArgumentError.new('Missing id/slug') unless id
10
+ fail(ArgumentError, 'Missing id/slug') unless id
9
11
 
10
- result = self.access_token.get("#{API_BASE}#{API_PATH}#{id}")
11
- raise ArgumentError.new('Bad request') unless result.code == '200'
12
+ result = access_token.get("#{API_BASE}#{API_PATH}#{id}")
13
+ fail(ArgumentError, 'Bad request') unless result.code == '200'
12
14
 
13
15
  Icon.new(result.body)
14
16
  end
@@ -1,32 +1,40 @@
1
1
  require 'noun-project-api/retriever'
2
2
 
3
3
  module NounProjectApi
4
+ # Retrieve icons.
4
5
  class IconsRetriever < Retriever
5
- API_PATH = "/icons/"
6
+ API_PATH = '/icons/'
6
7
 
8
+ # Finds multiple icons based on the term
9
+ # * term - search term
10
+ # * limit - limit the amount of results
11
+ # * offset - offset the results
12
+ # * page - page number
7
13
  def find(term, limit = nil, offset = nil, page = nil)
8
- raise ArgumentError.new('Missing search term') unless term
14
+ fail(ArgumentError, 'Missing search term') unless term
9
15
 
10
- search = OAuth::Helper::escape(term)
16
+ search = OAuth::Helper.escape(term)
11
17
  search += "?limit_to_public_domain=#{NounProjectApi.configuration.public_domain ? 1 : 0}"
12
18
 
13
- args = { "limit" => limit, "offset" => offset, "page" => page }.reject { |k, v| v.nil? }
14
- if args.size > 0
15
- args.each { |k, v| search += "&#{k}=#{v}" }
16
- end
19
+ args = { 'limit' => limit, 'offset' => offset, 'page' => page }.reject { |_, v| v.nil? }
20
+ args.each { |k, v| search += "&#{k}=#{v}" } if args.size > 0
17
21
 
18
- result = self.access_token.get("#{API_BASE}#{API_PATH}#{search}")
19
- raise ArgumentError.new('Bad request') unless ['200', '404'].include? result.code
22
+ result = access_token.get("#{API_BASE}#{API_PATH}#{search}")
23
+ fail(ArgumentError, 'Bad request') unless %w(200 404).include? result.code
20
24
 
21
25
  if result.code == '200'
22
- JSON.parse(result.body)["icons"].map { |icon| Icon.new(icon) }
26
+ JSON.parse(result.body)['icons'].map { |icon| Icon.new(icon) }
23
27
  else
24
28
  []
25
29
  end
26
30
  end
27
31
 
32
+ # List recent uploads
33
+ # * limit - limit the amount of results
34
+ # * offset - offset the results
35
+ # * page - page number
28
36
  def recent_uploads(limit = nil, offset = nil, page = nil)
29
- args = { "limit" => limit, "offset" => offset, "page" => page }.reject { |k, v| v.nil? }
37
+ args = { 'limit' => limit, 'offset' => offset, 'page' => page }.reject { |k, v| v.nil? }
30
38
  if args.size > 0
31
39
  search = '?'
32
40
  args.each { |k, v| search += "#{k}=#{v}&" }
@@ -34,10 +42,10 @@ module NounProjectApi
34
42
  search = ''
35
43
  end
36
44
 
37
- result = self.access_token.get("#{API_BASE}#{API_PATH}recent_uploads#{search}")
38
- raise ArgumentError.new('Bad request') unless result.code == '200'
45
+ result = access_token.get("#{API_BASE}#{API_PATH}recent_uploads#{search}")
46
+ fail(ArgumentError, 'Bad request') unless result.code == '200'
39
47
 
40
- JSON.parse(result.body)["recent_uploads"].map { |icon| Icon.new(icon) }
48
+ JSON.parse(result.body)['recent_uploads'].map { |icon| Icon.new(icon) }
41
49
  end
42
50
  end
43
51
  end
@@ -0,0 +1,16 @@
1
+ module NounProjectApi
2
+ # Main class to hold reporting actions back to the Noun Project.
3
+ class Reporter
4
+ include Connection
5
+
6
+ API_PATH = '/notify/publish'
7
+
8
+ def report_used(ids)
9
+ ids = [ids] if ids.is_a?(String) || ids.is_a?(Fixnum)
10
+ fail(ArgumentError, 'Missing ids') if ids.nil? || ids.empty?
11
+
12
+ result = access_token.post("#{API_BASE}#{API_PATH}", icons: ids.join(','))
13
+ result.code == '200'
14
+ end
15
+ end
16
+ end
@@ -1,14 +1,6 @@
1
1
  module NounProjectApi
2
- API_BASE = 'http://api.thenounproject.com'
3
-
2
+ # A base class for different retriever classes.
4
3
  class Retriever
5
- attr_accessor :token, :secret, :access_token
6
- def initialize(token, secret)
7
- @token = token
8
- @secret = secret
9
- raise ArgumentError.new('Missing token or secret') unless @token && @secret
10
-
11
- @access_token = OAuth::AccessToken.new(OAuth::Consumer.new(token, secret))
12
- end
4
+ include Connection
13
5
  end
14
6
  end
@@ -0,0 +1,93 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe NounProjectApi::Reporter do
4
+ it 'raises an error when initialized without token' do
5
+ expect { NounProjectApi::Reporter.new(nil, Faker::Internet.password(16)) }.to raise_error(ArgumentError)
6
+ end
7
+
8
+ it 'raises an error when initialized without secret' do
9
+ expect { NounProjectApi::Reporter.new(Faker::Internet.password(16), nil) }.to raise_error(ArgumentError)
10
+ end
11
+
12
+ it 'initializes the values properly' do
13
+ token = Faker::Internet.password(16)
14
+ secret = Faker::Internet.password(16)
15
+ reporter = NounProjectApi::Reporter.new(token, secret)
16
+
17
+ expect(reporter.token).to eq(token)
18
+ expect(reporter.secret).to eq(secret)
19
+ end
20
+
21
+ context 'reports ids usage' do
22
+ before :each do
23
+ token = Faker::Internet.password(16)
24
+ secret = Faker::Internet.password(16)
25
+ @reporter = NounProjectApi::Reporter.new(token, secret)
26
+ end
27
+
28
+ it 'reports a singular id' do
29
+ valid_response = OpenStruct.new(
30
+ body: Fakes::Results::REPORTED_ONE,
31
+ code: '200'
32
+ )
33
+
34
+ id = 122
35
+
36
+ expect(@reporter.access_token).to receive(
37
+ :post
38
+ ).with(
39
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::Reporter::API_PATH}",
40
+ icons: id.to_s
41
+ ).and_return(
42
+ valid_response
43
+ )
44
+
45
+ result = @reporter.report_used(id)
46
+ expect(result).to be true
47
+ end
48
+
49
+ it 'reports a singular id for a string' do
50
+ valid_response = OpenStruct.new(
51
+ body: Fakes::Results::REPORTED_ONE,
52
+ code: '200'
53
+ )
54
+
55
+ id = '122'
56
+
57
+ expect(@reporter.access_token).to receive(
58
+ :post
59
+ ).with(
60
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::Reporter::API_PATH}",
61
+ icons: id
62
+ ).and_return(
63
+ valid_response
64
+ )
65
+
66
+ result = @reporter.report_used(id)
67
+ expect(result).to be true
68
+ end
69
+
70
+
71
+
72
+ it 'reports multiple ids' do
73
+ valid_response = OpenStruct.new(
74
+ body: Fakes::Results::REPORTED_ONE,
75
+ code: '200'
76
+ )
77
+
78
+ ids = [122, 4541, 342_11, 4352]
79
+
80
+ expect(@reporter.access_token).to receive(
81
+ :post
82
+ ).with(
83
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::Reporter::API_PATH}",
84
+ icons: ids.join(',')
85
+ ).and_return(
86
+ valid_response
87
+ )
88
+
89
+ result = @reporter.report_used(ids)
90
+ expect(result).to be true
91
+ end
92
+ end
93
+ end
@@ -296,5 +296,17 @@ module Fakes
296
296
  }
297
297
  ]
298
298
  }'''
299
+
300
+ REPORTED_ONE = '''
301
+ {
302
+ "licenses_consumed": 1,
303
+ "result": "success"
304
+ }'''
305
+
306
+ REPORTED_THREE = '''
307
+ {
308
+ "licenses_consumed": 1,
309
+ "result": "success"
310
+ }'''
299
311
  end
300
312
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noun-project-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nadav Shatz
@@ -94,13 +94,16 @@ extra_rdoc_files: []
94
94
  files:
95
95
  - Rakefile
96
96
  - lib/noun-project-api.rb
97
+ - lib/noun-project-api/connection.rb
97
98
  - lib/noun-project-api/icon.rb
98
99
  - lib/noun-project-api/icon_retriever.rb
99
100
  - lib/noun-project-api/icons_retriever.rb
101
+ - lib/noun-project-api/reporter.rb
100
102
  - lib/noun-project-api/retriever.rb
101
103
  - spec/lib/noun-project-api/icon_retriever_spec.rb
102
104
  - spec/lib/noun-project-api/icon_spec.rb
103
105
  - spec/lib/noun-project-api/icons_retriever_spec.rb
106
+ - spec/lib/noun-project-api/reporter_spec.rb
104
107
  - spec/lib/noun-project-api/retriever_spec.rb
105
108
  - spec/lib/nount_project_api_spec.rb
106
109
  - spec/spec_helper.rb
@@ -125,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
128
  version: '0'
126
129
  requirements: []
127
130
  rubyforge_project:
128
- rubygems_version: 2.2.2
131
+ rubygems_version: 2.4.5
129
132
  signing_key:
130
133
  specification_version: 4
131
134
  summary: An API wrapper for The Noun Project API's
@@ -133,6 +136,7 @@ test_files:
133
136
  - spec/lib/noun-project-api/icon_retriever_spec.rb
134
137
  - spec/lib/noun-project-api/icon_spec.rb
135
138
  - spec/lib/noun-project-api/icons_retriever_spec.rb
139
+ - spec/lib/noun-project-api/reporter_spec.rb
136
140
  - spec/lib/noun-project-api/retriever_spec.rb
137
141
  - spec/lib/nount_project_api_spec.rb
138
142
  - spec/spec_helper.rb