noun-project-api 0.0.4 → 0.0.5

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: 619e990e330b1b4f052966c8451846e258765009
4
- data.tar.gz: 4a0151db35041c2019ebb02e7c559c65adeeaea3
3
+ metadata.gz: 810e93f2a6007af38536ac99d6d297b8a84419df
4
+ data.tar.gz: f672c9976b6425ca47ac49046b86ed52b43dcbd7
5
5
  SHA512:
6
- metadata.gz: 77ff6f20e725233243c6a880d4261fe95d1dd478c15c0cd3f54c5e9d90c3e8f8e28ff658c3cef1c3657e83e866b06f989779de0e5ae7631ddb3fc0a37863a2fa
7
- data.tar.gz: 8ddebd880e73358891119d2aee21dd1fc363a7cf03bf2b62bb8a8cbb5f89ed7136c607cbac6d0c34e5140cb0aecc38e5919e722bee51e16352f6fc537cc1f6a6
6
+ metadata.gz: f825fc58d3e1a3a217433488f0c3e91fab753eb05c7241a410690a50af2968b8f0448d5c787d630fb9e86e76155d461c81a336727fbc9cb54dd14af895231a0b
7
+ data.tar.gz: 80c91604f12dc4df532f30347efa178abefe40b74962593e67773cf89bb2a11e138ac2a096e1930c8e0e1f1db37e6b1235abf91901e9c7de7ebc0ec151efe299
@@ -1,5 +1,6 @@
1
+ require 'noun-project-api/icon_retriever'
2
+ require 'noun-project-api/icons_retriever'
1
3
  require 'noun-project-api/icon'
2
- require 'noun-project-api/icons'
3
4
 
4
5
  module NounProjectApi
5
6
  end
@@ -1,18 +1,38 @@
1
- require 'noun-project-api/retriever'
2
-
3
1
  module NounProjectApi
4
- class Icon < Retriever
5
- API_PATH = "/icon/"
2
+ class Icon
3
+ PREVIEW_SIZE_200 = 200
4
+ PREVIEW_SIZE_42 = 42
5
+ PREVIEW_SIZE_84 = 84
6
+
7
+ PUBLIC_DOMAIN_LICENSE = "public-domain"
6
8
 
7
- def find(id)
8
- raise ArgumentError.new('Missing id/slug') unless id
9
+ attr_accessor :original_hash
9
10
 
10
- result = self.access_token.get("#{API_BASE}#{API_PATH}#{id}")
11
- raise ArgumentError.new('Bad request') unless result.code == '200'
11
+ def initialize(origin)
12
+ origin = JSON.parse(origin) if origin.is_a? String
13
+ origin = origin.delete("icon") if origin.key? "icon"
12
14
 
13
- JSON.parse(result.body)["icon"]
15
+ @original_hash = origin
14
16
  end
15
17
 
16
- alias_method :find_by_slug, :find
18
+ def id
19
+ original_hash["id"].to_i
20
+ end
21
+
22
+ def public_domain?
23
+ original_hash["license_description"] == PUBLIC_DOMAIN_LICENSE
24
+ end
25
+
26
+ def svg_url
27
+ original_hash["icon_url"]
28
+ end
29
+
30
+ def preview_url(size = PREVIEW_SIZE_200)
31
+ if size == PREVIEW_SIZE_200
32
+ original_hash["preview_url"]
33
+ else
34
+ original_hash["preview_url_#{size}"]
35
+ end
36
+ end
17
37
  end
18
38
  end
@@ -0,0 +1,18 @@
1
+ require 'noun-project-api/retriever'
2
+
3
+ module NounProjectApi
4
+ class IconRetriever < Retriever
5
+ API_PATH = "/icon/"
6
+
7
+ def find(id)
8
+ raise ArgumentError.new('Missing id/slug') unless id
9
+
10
+ result = self.access_token.get("#{API_BASE}#{API_PATH}#{id}")
11
+ raise ArgumentError.new('Bad request') unless result.code == '200'
12
+
13
+ Icon.new(result.body)
14
+ end
15
+
16
+ alias_method :find_by_slug, :find
17
+ end
18
+ end
@@ -2,7 +2,7 @@ require 'noun-project-api/retriever'
2
2
  require 'open-uri'
3
3
 
4
4
  module NounProjectApi
5
- class Icons < Retriever
5
+ class IconsRetriever < Retriever
6
6
  API_PATH = "/icons/"
7
7
 
8
8
  def find(term, limit = nil, offset = nil, page = nil)
@@ -20,7 +20,7 @@ module NounProjectApi
20
20
  raise ArgumentError.new('Bad request') unless ['200', '404'].include? result.code
21
21
 
22
22
  if result.code == '200'
23
- JSON.parse(result.body)["icons"]
23
+ JSON.parse(result.body)["icons"].map { |icon| Icon.new(icon) }
24
24
  else
25
25
  []
26
26
  end
@@ -38,7 +38,7 @@ module NounProjectApi
38
38
  result = self.access_token.get("#{API_BASE}#{API_PATH}recent_uploads#{search}")
39
39
  raise ArgumentError.new('Bad request') unless result.code == '200'
40
40
 
41
- JSON.parse(result.body)["recent_uploads"]
41
+ JSON.parse(result.body)["recent_uploads"].map { |icon| Icon.new(icon) }
42
42
  end
43
43
  end
44
44
  end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+ require 'ostruct'
3
+
4
+ RSpec.describe NounProjectApi::IconRetriever do
5
+ before :each do
6
+ @icon = NounProjectApi::IconRetriever.new(Faker::Internet.password(16), Faker::Internet.password(16))
7
+ @valid_hash = JSON.parse(Fakes::Results::ICON_VALID)
8
+ @valid_response = OpenStruct.new(
9
+ body: Fakes::Results::ICON_VALID,
10
+ code: '200'
11
+ )
12
+
13
+ @missing_response = OpenStruct.new(
14
+ code: '404'
15
+ )
16
+ end
17
+
18
+ context "id" do
19
+ it 'raises an error when no id is provided' do
20
+ expect { @icon.find(nil) }.to raise_error(ArgumentError)
21
+ end
22
+
23
+ it 'returns a proper result with a correct id' do
24
+ id = 1
25
+ expect(@icon.access_token).to receive(
26
+ :get
27
+ ).with(
28
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::IconRetriever::API_PATH}#{id}"
29
+ ).and_return(
30
+ @valid_response
31
+ )
32
+
33
+ result = @icon.find(id)
34
+ expect(result).to be_a(NounProjectApi::Icon)
35
+ expect(result.original_hash).to eq(@valid_hash["icon"])
36
+ end
37
+
38
+ it 'raises an error with a missing id' do
39
+ id = 1
40
+ expect(@icon.access_token).to receive(
41
+ :get
42
+ ).with(
43
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::IconRetriever::API_PATH}#{id}"
44
+ ).and_return(
45
+ @missing_response
46
+ )
47
+
48
+ expect { @icon.find(id) }.to raise_error(ArgumentError)
49
+ end
50
+ end
51
+
52
+ context "slug" do
53
+ it 'raises an error when no slug is provided' do
54
+ expect { @icon.find_by_slug(nil) }.to raise_error(ArgumentError)
55
+ end
56
+
57
+ it 'returns a proper result with a correct slug' do
58
+ slug = 'existing_slug'
59
+ expect(@icon.access_token).to receive(
60
+ :get
61
+ ).with(
62
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::IconRetriever::API_PATH}#{slug}"
63
+ ).and_return(
64
+ @valid_response
65
+ )
66
+
67
+ result = @icon.find(slug)
68
+ expect(result).to be_a(NounProjectApi::Icon)
69
+ expect(result.original_hash).to eq(@valid_hash["icon"])
70
+ end
71
+
72
+ it 'raises an error with a missing slug' do
73
+ slug = 'missing_slug'
74
+ expect(@icon.access_token).to receive(
75
+ :get
76
+ ).with(
77
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::IconRetriever::API_PATH}#{slug}"
78
+ ).and_return(
79
+ @missing_response
80
+ )
81
+
82
+ expect { @icon.find_by_slug(slug) }.to raise_error(ArgumentError)
83
+ end
84
+ end
85
+ end
@@ -1,81 +1,64 @@
1
1
  require 'spec_helper'
2
2
  require 'ostruct'
3
3
 
4
- RSpec.describe NounProjectApi::Icon do
5
- before :each do
6
- @icon = NounProjectApi::Icon.new(Faker::Internet.password(16), Faker::Internet.password(16))
7
- @valid_hash = JSON.parse(Fakes::Results::ICON_VALID)
8
- @valid_response = OpenStruct.new(
9
- body: Fakes::Results::ICON_VALID,
10
- code: '200'
11
- )
4
+ RSpec.describe NounProjectApi::IconRetriever do
5
+ it 'raises an error on empty initialization input' do
6
+ expect { NounProjectApi::Icon.new }.to raise_error(ArgumentError)
7
+ end
12
8
 
13
- @missing_response = OpenStruct.new(
14
- code: '404'
15
- )
9
+ it 'accepts JSON string input' do
10
+ data = JSON.parse(Fakes::Results::ICON_VALID)
11
+ expect { NounProjectApi::Icon.new(JSON.dump(data["icon"])) }.to_not raise_error
16
12
  end
17
13
 
18
- context "id" do
19
- it 'raises an error when no id is provided' do
20
- expect { @icon.find(nil) }.to raise_error(ArgumentError)
21
- end
14
+ it 'accepts JSON string input with icon encapsulation' do
15
+ expect { NounProjectApi::Icon.new(Fakes::Results::ICON_VALID) }.to_not raise_error
16
+ end
17
+
18
+ it 'accepts hash input' do
19
+ data = JSON.parse(Fakes::Results::ICON_VALID)
20
+ expect { NounProjectApi::Icon.new(data) }.to_not raise_error
21
+ end
22
22
 
23
- it 'returns a proper result with a correct id' do
24
- id = 1
25
- expect(@icon.access_token).to receive(
26
- :get
27
- ).with(
28
- "#{NounProjectApi::API_BASE}#{NounProjectApi::Icon::API_PATH}#{id}"
29
- ).and_return(
30
- @valid_response
31
- )
23
+ context "exposed attributes" do
24
+ before :each do
25
+ @json = JSON.parse(Fakes::Results::ICON_VALID)
26
+ @valid_icon = NounProjectApi::Icon.new(Fakes::Results::ICON_VALID)
27
+ end
32
28
 
33
- expect(@icon.find(id)).to eq(@valid_hash["icon"])
29
+ it 'public domain' do
30
+ expect(@valid_icon.public_domain?).to eq(@json["icon"]["license_description"] == "public-domain")
34
31
  end
35
32
 
36
- it 'raises an error with a missing id' do
37
- id = 1
38
- expect(@icon.access_token).to receive(
39
- :get
40
- ).with(
41
- "#{NounProjectApi::API_BASE}#{NounProjectApi::Icon::API_PATH}#{id}"
42
- ).and_return(
43
- @missing_response
44
- )
33
+ it 'SVG url' do
34
+ expect(@valid_icon.svg_url).to eq(@json["icon"]["icon_url"])
35
+ end
45
36
 
46
- expect { @icon.find(id) }.to raise_error(ArgumentError)
37
+ it 'nil on missing SVG url' do
38
+ @json["icon"].delete("icon_url")
39
+ icon = NounProjectApi::Icon.new(@json)
40
+ expect(icon.svg_url).to be_nil
47
41
  end
48
- end
49
42
 
50
- context "slug" do
51
- it 'raises an error when no slug is provided' do
52
- expect { @icon.find_by_slug(nil) }.to raise_error(ArgumentError)
43
+ it 'preview url defaults at 200 size' do
44
+ expect(@valid_icon.preview_url).to eq(@json["icon"]["preview_url"])
53
45
  end
54
46
 
55
- it 'returns a proper result with a correct slug' do
56
- slug = 'existing_slug'
57
- expect(@icon.access_token).to receive(
58
- :get
59
- ).with(
60
- "#{NounProjectApi::API_BASE}#{NounProjectApi::Icon::API_PATH}#{slug}"
61
- ).and_return(
62
- @valid_response
63
- )
47
+ it 'preview url for 200 size' do
48
+ expect(@valid_icon.preview_url(NounProjectApi::Icon::PREVIEW_SIZE_200)).to eq(@json["icon"]["preview_url"])
49
+ end
64
50
 
65
- expect(@icon.find_by_slug(slug)).to eq(@valid_hash["icon"])
51
+ it 'preview url for 84 size' do
52
+ expect(@valid_icon.preview_url(NounProjectApi::Icon::PREVIEW_SIZE_84)).to eq(@json["icon"]["preview_url_84"])
66
53
  end
67
54
 
68
- it 'raises an error with a missing slug' do
69
- slug = 'missing_slug'
70
- expect(@icon.access_token).to receive(
71
- :get
72
- ).with(
73
- "#{NounProjectApi::API_BASE}#{NounProjectApi::Icon::API_PATH}#{slug}"
74
- ).and_return(
75
- @missing_response
76
- )
55
+ it 'preview url for 42 size' do
56
+ expect(@valid_icon.preview_url(NounProjectApi::Icon::PREVIEW_SIZE_42)).to eq(@json["icon"]["preview_url_42"])
57
+ end
77
58
 
78
- expect { @icon.find_by_slug(slug) }.to raise_error(ArgumentError)
59
+ it 'id as number' do
60
+ expect(@valid_icon.id).to be_a(Fixnum)
61
+ expect(@valid_icon.id).to eq(@json["icon"]["id"].to_i)
79
62
  end
80
63
  end
81
64
  end
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
- RSpec.describe NounProjectApi::Icons do
3
+ RSpec.describe NounProjectApi::IconsRetriever do
4
4
  before :each do
5
- @icons = NounProjectApi::Icons.new(Faker::Internet.password(16), Faker::Internet.password(16))
5
+ @icons = NounProjectApi::IconsRetriever.new(Faker::Internet.password(16), Faker::Internet.password(16))
6
6
  end
7
7
 
8
8
  context "recent uploads" do
@@ -16,32 +16,39 @@ RSpec.describe NounProjectApi::Icons do
16
16
  expect(@icons.access_token).to receive(
17
17
  :get
18
18
  ).with(
19
- "#{NounProjectApi::API_BASE}#{NounProjectApi::Icons::API_PATH}recent_uploads"
19
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::IconsRetriever::API_PATH}recent_uploads"
20
20
  ).and_return(
21
21
  valid_response
22
22
  )
23
23
 
24
- expect(@icons.recent_uploads).to eq(valid_hash["recent_uploads"])
24
+ results = @icons.recent_uploads
25
+ expect(results.size).to eq(valid_hash["recent_uploads"].size)
26
+ results.each do |icon|
27
+ expect(icon).to be_a(NounProjectApi::Icon)
28
+ end
25
29
  end
26
30
 
27
31
  it "returns the recent uploads and passes limit when passed" do
28
- valid_hash = JSON.parse(Fakes::Results::ICONS_RECENT_VALID)
29
32
  valid_response = OpenStruct.new(
30
33
  body: Fakes::Results::ICONS_RECENT_VALID,
31
34
  code: '200'
32
35
  )
33
36
 
34
- limit = 10
37
+ limit = 3
35
38
 
36
39
  expect(@icons.access_token).to receive(
37
40
  :get
38
41
  ).with(
39
- "#{NounProjectApi::API_BASE}#{NounProjectApi::Icons::API_PATH}recent_uploads?limit=#{limit}&"
42
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::IconsRetriever::API_PATH}recent_uploads?limit=#{limit}&"
40
43
  ).and_return(
41
44
  valid_response
42
45
  )
43
46
 
44
- expect(@icons.recent_uploads(limit)).to eq(valid_hash["recent_uploads"])
47
+ results = @icons.recent_uploads(limit)
48
+ expect(results.size).to eq(limit)
49
+ results.each do |icon|
50
+ expect(icon).to be_a(NounProjectApi::Icon)
51
+ end
45
52
  end
46
53
  end
47
54
 
@@ -61,12 +68,16 @@ RSpec.describe NounProjectApi::Icons do
61
68
  expect(@icons.access_token).to receive(
62
69
  :get
63
70
  ).with(
64
- "#{NounProjectApi::API_BASE}#{NounProjectApi::Icons::API_PATH}#{URI::encode(term)}"
71
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::IconsRetriever::API_PATH}#{URI::encode(term)}"
65
72
  ).and_return(
66
73
  valid_response
67
74
  )
68
75
 
69
- expect(@icons.find(term)).to eq(valid_hash["icons"])
76
+ results = @icons.find(term)
77
+ expect(results.size).to eq(valid_hash["icons"].size)
78
+ results.each do |icon|
79
+ expect(icon).to be_a(NounProjectApi::Icon)
80
+ end
70
81
  end
71
82
 
72
83
  it 'returns a proper result with a correct phrase' do
@@ -80,32 +91,39 @@ RSpec.describe NounProjectApi::Icons do
80
91
  expect(@icons.access_token).to receive(
81
92
  :get
82
93
  ).with(
83
- "#{NounProjectApi::API_BASE}#{NounProjectApi::Icons::API_PATH}#{URI::encode(term)}"
94
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::IconsRetriever::API_PATH}#{URI::encode(term)}"
84
95
  ).and_return(
85
96
  valid_response
86
97
  )
87
98
 
88
- expect(@icons.find(term)).to eq(valid_hash["icons"])
99
+ results = @icons.find(term)
100
+ expect(results.size).to eq(valid_hash["icons"].size)
101
+ results.each do |icon|
102
+ expect(icon).to be_a(NounProjectApi::Icon)
103
+ end
89
104
  end
90
105
 
91
106
  it 'returns a proper result with a correct phrase and passes along the args' do
92
- valid_hash = JSON.parse(Fakes::Results::ICONS_VALID)
93
107
  valid_response = OpenStruct.new(
94
108
  body: Fakes::Results::ICONS_VALID,
95
109
  code: '200'
96
110
  )
97
111
 
98
112
  term = 'some search'
99
- limit = 10
113
+ limit = 4
100
114
  expect(@icons.access_token).to receive(
101
115
  :get
102
116
  ).with(
103
- "#{NounProjectApi::API_BASE}#{NounProjectApi::Icons::API_PATH}#{URI::encode(term)}?limit=#{limit}&"
117
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::IconsRetriever::API_PATH}#{URI::encode(term)}?limit=#{limit}&"
104
118
  ).and_return(
105
119
  valid_response
106
120
  )
107
121
 
108
- expect(@icons.find(term, limit)).to eq(valid_hash["icons"])
122
+ results = @icons.find(term, limit)
123
+ expect(results.size).to eq(limit)
124
+ results.each do |icon|
125
+ expect(icon).to be_a(NounProjectApi::Icon)
126
+ end
109
127
  end
110
128
 
111
129
  it 'returns an empty array for no result' do
@@ -117,12 +135,13 @@ RSpec.describe NounProjectApi::Icons do
117
135
  expect(@icons.access_token).to receive(
118
136
  :get
119
137
  ).with(
120
- "#{NounProjectApi::API_BASE}#{NounProjectApi::Icons::API_PATH}#{URI::encode(term)}"
138
+ "#{NounProjectApi::API_BASE}#{NounProjectApi::IconsRetriever::API_PATH}#{URI::encode(term)}"
121
139
  ).and_return(
122
140
  missing_response
123
141
  )
124
142
 
125
- expect(@icons.find(term)).to eq([])
143
+ results = @icons.find(term)
144
+ expect(results.size).to eq(0)
126
145
  end
127
146
  end
128
147
  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.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nadav Shatz
@@ -81,10 +81,12 @@ files:
81
81
  - Rakefile
82
82
  - lib/noun-project-api.rb
83
83
  - lib/noun-project-api/icon.rb
84
- - lib/noun-project-api/icons.rb
84
+ - lib/noun-project-api/icon_retriever.rb
85
+ - lib/noun-project-api/icons_retriever.rb
85
86
  - lib/noun-project-api/retriever.rb
87
+ - spec/lib/noun-project-api/icon_retriever_spec.rb
86
88
  - spec/lib/noun-project-api/icon_spec.rb
87
- - spec/lib/noun-project-api/icons_spec.rb
89
+ - spec/lib/noun-project-api/icons_retriever_spec.rb
88
90
  - spec/lib/noun-project-api/retriever_spec.rb
89
91
  - spec/spec_helper.rb
90
92
  - spec/support/fakes.rb
@@ -113,8 +115,9 @@ signing_key:
113
115
  specification_version: 4
114
116
  summary: An API wrapper for The Noun Project API's
115
117
  test_files:
118
+ - spec/lib/noun-project-api/icon_retriever_spec.rb
116
119
  - spec/lib/noun-project-api/icon_spec.rb
117
- - spec/lib/noun-project-api/icons_spec.rb
120
+ - spec/lib/noun-project-api/icons_retriever_spec.rb
118
121
  - spec/lib/noun-project-api/retriever_spec.rb
119
122
  - spec/spec_helper.rb
120
123
  - spec/support/fakes.rb