apprank 0.0.1 → 1.0.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: 77139758135e695d99945a2ec7655de1bc05e0d0
4
+ data.tar.gz: b253389211a9491c55c6e0be4b6f052ef40ced3a
5
+ SHA512:
6
+ metadata.gz: 50795ef78b574be4a12b1714b532ffd4484d2c25f385550f1e77c4c80e4a7db0f623ba23405e1f298b5691419ea6f0975fc479f70f6bb8e5b72507fc069a24c2
7
+ data.tar.gz: 61fff4e7a2e055a6e0e2674153e943da12a16b83145ee59452208cfa513110529b427dad7b0335213b573bae47911bcf7949131f0b4f5c89d5d5f167cb09269c
data/Gemfile CHANGED
@@ -1,4 +1,7 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- gem 'json'
4
- gem 'rspec'
3
+ gem 'json', '~> 1.8'
4
+
5
+ group :test do
6
+ gem 'rspec', '~> 3.4'
7
+ end
data/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # Apprank
2
+
3
+ Get iOS app rank data from Apple.
4
+
5
+ # Installation
6
+
7
+ To install, add apprank to your @Gemfile@ and run `bundle install`:
8
+
9
+ ```
10
+ gem 'apprank'
11
+ ```
12
+
13
+ ## Demo
14
+
15
+ ```
16
+ require 'apprank'
17
+ json = open('http://itunes.apple.com/us/rss/topfreeapplications/limit=25/json')
18
+ rank = Apprank::Rank.new(json)
19
+ rank.apps.first.name # => "Some popular free app name"
20
+ ```
data/lib/apprank/app.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  module Apprank
2
2
  class App
3
3
 
4
- attr_accessor :name, :icon_urls, :summary, :price, :rights, :display_name,
5
- :preview, :link, :itunes_url, :developer, :category, :release_date
4
+ attr_accessor :name, :icon_urls, :summary, :price, :content_type, :rights, :title,
5
+ :link, :itunes_url, :itunes_id, :bundle_id, :artist, :artist, :category, :release_date
6
+
7
+ alias_method :developer, :artist
6
8
 
7
9
  def initialize(hash)
8
10
  @name = hash["im:name"]["label"]
@@ -23,17 +25,22 @@ module Apprank
23
25
  :amount => hash["im:price"]["attributes"]["amount"].to_f,
24
26
  :currency => hash["im:price"]["attributes"]["currency"]
25
27
  }
28
+ @content_type = hash["rights"]["contentType"]
26
29
  @rights = hash["rights"]["label"]
27
- @display_name = hash["title"]["label"]
28
- hash["link"].each do |link|
29
- if link["attributes"]["title"] == "Preview"
30
- @preview = link["attributes"]["href"]
31
- else
32
- @link = link["attributes"]["href"]
33
- end
30
+ @title = hash["title"]["label"]
31
+
32
+ link = hash["link"]
33
+ if link["attributes"]["title"] == "Preview"
34
+ @preview = link["attributes"]["href"]
35
+ else
36
+ @link = link["attributes"]["href"]
34
37
  end
38
+
35
39
  @itunes_url = hash["id"]["label"]
36
- @developer = {
40
+ @itunes_id = hash["id"]['attributes']['im:id']
41
+ @bundle_id = hash["id"]['attributes']['im:bundleId']
42
+
43
+ @artist = {
37
44
  :name => hash["im:artist"]["label"],
38
45
  :url => hash["im:artist"]["attributes"]["href"]
39
46
  }
data/spec/app_spec.rb CHANGED
@@ -5,24 +5,51 @@ describe App do
5
5
  describe "when you load the data" do
6
6
  it "should get data" do
7
7
 
8
- app, expected, data = create_fake_app
9
-
10
- app.name.should == expected[:name]
11
- app.icon_urls.should == expected[:icon_urls]
12
- app.summary.should == expected[:summary]
13
- app.price.should == expected[:price]
14
- app.rights.should == expected[:rights]
15
- app.display_name.should == expected[:title]
16
- app.link.should == expected[:link]
17
- app.preview.should == expected[:preview]
18
- app.itunes_url.should == expected[:itunes_url]
19
- app.developer.should == expected[:developer]
20
- app.category.should == expected[:category]
21
-
22
- date_diff = app.release_date - expected[:release_date]
23
- date_diff.abs.should <= 1
24
-
25
- app.itunes_id.should == expected[:itunes_id]
8
+ data = JSON.load(SpecHelper.data)
9
+ app = Apprank::App.new(data['feed']['entry'][0])
10
+
11
+ expected = {
12
+ name: "Color Switch",
13
+ icon_urls: {
14
+ small: "http://is3.mzstatic.com/image/thumb/Purple69/v4/d4/70/15/d4701594-2c52-185f-766f-45fd4eab0f75/mzl.ytgnpnrv.png/53x53bb-85.png",
15
+ medium: "http://is5.mzstatic.com/image/thumb/Purple69/v4/d4/70/15/d4701594-2c52-185f-766f-45fd4eab0f75/mzl.ytgnpnrv.png/75x75bb-85.png",
16
+ large: "http://is4.mzstatic.com/image/thumb/Purple69/v4/d4/70/15/d4701594-2c52-185f-766f-45fd4eab0f75/mzl.ytgnpnrv.png/100x100bb-85.png",
17
+ },
18
+ summary: "Tap the ball carefully through each obstacle and your ball will switch color with some powerups.\nYou must follow the color pattern on each obstacle to cross it ! \n\nBe careful not to pass through the wrong color, or you’ll have to start again.",
19
+ price: {
20
+ amount: 0.0,
21
+ currency: "USD"
22
+ },
23
+ rights: "© 2016 Fortafy Games",
24
+ title: "Color Switch - Samuel Ratumaitavuki",
25
+ link: "https://itunes.apple.com/us/app/color-switch/id1053533457?mt=8&uo=2",
26
+ itunes_url: "https://itunes.apple.com/us/app/color-switch/id1053533457?mt=8&uo=2",
27
+ itunes_id: "1053533457",
28
+ bundle_id: "com.fortafygames.colorswitch",
29
+ artist: {
30
+ name: "Samuel Ratumaitavuki",
31
+ url: "https://itunes.apple.com/us/developer/samuel-ratumaitavuki/id1053533456?mt=8&uo=2"
32
+ },
33
+ category: {
34
+ name: "Games",
35
+ url: "https://itunes.apple.com/us/genre/ios-games/id6014?mt=8&uo=2"
36
+ },
37
+ }
38
+
39
+ expect(app.name).to eq(expected[:name])
40
+ expect(app.icon_urls).to eq(expected[:icon_urls])
41
+ expect(app.summary).to eq(expected[:summary])
42
+ expect(app.price).to eq(expected[:price])
43
+ expect(app.rights).to eq(expected[:rights])
44
+ expect(app.title).to eq(expected[:title])
45
+ expect(app.link).to eq(expected[:link])
46
+ expect(app.itunes_url).to eq(expected[:itunes_url])
47
+ expect(app.itunes_id).to eq(expected[:itunes_id])
48
+ expect(app.bundle_id).to eq(expected[:bundle_id])
49
+ expect(app.artist).to eq(expected[:artist])
50
+ expect(app.category).to eq(expected[:category])
51
+ expect(app.release_date).to be_a(Time)
52
+
26
53
 
27
54
  end
28
55
  end
data/spec/rank_spec.rb CHANGED
@@ -5,11 +5,12 @@ describe Rank do
5
5
  describe "when you load the data" do
6
6
  it "should get data" do
7
7
 
8
- feed = create_fake_feed(100)
9
- rank = Rank.new({ :feed => feed }.to_json)
10
- rank.apps.length.should == 100
11
- rank.link.should == feed[:id][:href]
12
- (rank.updated - Time.now).abs.should < 10
8
+ data = SpecHelper.data
9
+ rank = Rank.new(data)
10
+
11
+ expect(rank.apps.length).to eq(25)
12
+ expect(rank.link).to eq("https://itunes.apple.com/us/rss/topfreeapplications/limit=25/json")
13
+ expect(rank.updated.to_i).to eq(1453708166)
13
14
 
14
15
  end
15
16
  end
data/spec/spec_helper.rb CHANGED
@@ -1,137 +1,23 @@
1
- require 'lib/apprank'
2
- require 'faker'
1
+ # load path for ruby 2.x
2
+ $:<< File.join(File.dirname(__FILE__), '..')
3
3
 
4
+ require 'lib/apprank'
4
5
  include Apprank
5
6
 
6
- def create_fake_app
7
- itunes_id = rand(100000).to_s
8
- expected = {
9
- :name => Faker::Company.bs,
10
- :icon_urls => {
11
- :small => Faker::Internet.domain_name,
12
- :medium => Faker::Internet.domain_name,
13
- :large => Faker::Internet.domain_name
14
- },
15
- :summary => Faker::Company.catch_phrase,
16
- :price => {
17
- :amount => rand(1000),
18
- :currency => Faker::Address.us_state_abbr,
19
- },
20
- :rights => Faker::Company.name,
21
- :title => Faker::Company.bs + Faker::Company.name,
22
- :link => Faker::Internet.domain_name,
23
- :preview => Faker::Internet.domain_name,
24
- :itunes_id => itunes_id,
25
- :itunes_url => Faker::Internet.domain_name + '/id' + itunes_id + '?foo=bar',
26
- :developer => {
27
- :name => Faker::Company.name,
28
- :url => Faker::Internet.domain_name
29
- },
30
- :category => {
31
- :name => Faker::Name.last_name,
32
- :url => Faker::Internet.domain_name
33
- },
34
- :release_date => Time.now
35
- }
7
+ RSpec.configure do |config|
8
+
9
+ config.expect_with :rspec do |expectations|
10
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
11
+ end
36
12
 
37
- data = {
38
- "im:name" => { "label" => expected[:name] },
39
- "im:image" => [
40
- {
41
- "label" => expected[:icon_urls][:small],
42
- "attributes" => { "height" => "53" }
43
- },
44
- {
45
- "label" => expected[:icon_urls][:medium],
46
- "attributes" => { "height" => "75" }
47
- },
48
- {
49
- "label" => expected[:icon_urls][:large],
50
- "attributes" => { "height" => "100" }
51
- }
52
- ],
53
- "summary" => { "label" => expected[:summary] },
54
- "im:price" => {
55
- "label" => "Free",
56
- "attributes" => {
57
- "amount" => expected[:price][:amount],
58
- "currency" => expected[:price][:currency]
59
- }
60
- },
61
- "im:contentType" => {
62
- "attributes" => {
63
- "term" => "Application",
64
- "label" => "Application"
65
- }
66
- },
67
- "rights" => { "label" => expected[:rights] },
68
- "title" => { "label" => expected[:title] },
69
- "link" => [
70
- {
71
- "attributes" => {
72
- "rel" => "alternate",
73
- "type" => "text/html",
74
- "href" => expected[:link]
75
- }
76
- },
77
- {
78
- "im:duration" => { "label" => "0" },
79
- "attributes" => {
80
- "title" => "Preview",
81
- "rel" => "enclosure",
82
- "type" => "image/jpeg",
83
- "href" => expected[:preview],
84
- "im:assetType" => "preview"
85
- }
86
- }
87
- ],
88
- "id" => { "label" => expected[:itunes_url] },
89
- "im:artist" => {
90
- "label" => expected[:developer][:name],
91
- "attributes" => { "href" => expected[:developer][:url] }
92
- },
93
- "category" => {
94
- "attributes" => {
95
- "term" => expected[:category][:name],
96
- "scheme" => expected[:category][:url],
97
- "label" => expected[:category][:name]
98
- }
99
- },
100
- "im:releaseDate" => {
101
- "label" => expected[:release_date].strftime("%Y-%m-%dT%H:%M:%S%z"),
102
- "attributes" => { "label" => "November 04, 2010" }
103
- }
104
- }
13
+ config.mock_with :rspec do |mocks|
14
+ mocks.verify_partial_doubles = true
15
+ end
105
16
 
106
- [App.new(data), expected, data]
107
17
  end
108
18
 
109
- def create_fake_feed(length=100)
110
- {
111
- :author => {
112
- :name => { :label => Faker::Company.name },
113
- :uri => { :label => Faker::Internet.domain_name }
114
- },
115
- :entry => length.times.map{ create_fake_app[2] },
116
- :updated => { :label => Time.now },
117
- :rights => { :label => Faker::Company.catch_phrase },
118
- :title => { :label => Faker::Company.bs },
119
- :icon => { :label => Faker::Internet.domain_name },
120
- :link => [
121
- {
122
- :attributes => {
123
- :rel => "alternate",
124
- :type => "text/html",
125
- :href => Faker::Internet.domain_name
126
- }
127
- },
128
- {
129
- :attributes => {
130
- :rel => "self",
131
- :href => Faker::Internet.domain_name + "?cc=us"
132
- }
133
- }
134
- ],
135
- :id => { :label => Faker::Internet.domain_name + "?cc=us" }
136
- }
19
+ module SpecHelper
20
+ def self.data
21
+ open('./spec/fixtures/data.json')
22
+ end
137
23
  end
metadata CHANGED
@@ -1,36 +1,24 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: apprank
3
- version: !ruby/object:Gem::Version
4
- hash: 29
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 0
9
- - 1
10
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - hc5duke
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2010-12-25 00:00:00 -08:00
19
- default_executable:
11
+ date: 2016-01-25 00:00:00.000000000 Z
20
12
  dependencies: []
21
-
22
13
  description: Apprank parses iOS app rank data from Apple.
23
14
  email: hc5duke@gmail.com
24
15
  executables: []
25
-
26
16
  extensions: []
27
-
28
17
  extra_rdoc_files: []
29
-
30
- files:
18
+ files:
31
19
  - Gemfile
32
20
  - LICENSE
33
- - README
21
+ - README.md
34
22
  - lib/apprank.rb
35
23
  - lib/apprank/app.rb
36
24
  - lib/apprank/rank.rb
@@ -39,39 +27,27 @@ files:
39
27
  - spec/rcov.opts
40
28
  - spec/spec.opts
41
29
  - spec/spec_helper.rb
42
- has_rdoc: true
43
30
  homepage: https://www.github.com/hc5duke/apprank
44
31
  licenses: []
45
-
32
+ metadata: {}
46
33
  post_install_message:
47
34
  rdoc_options: []
48
-
49
- require_paths:
35
+ require_paths:
50
36
  - lib
51
- required_ruby_version: !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
54
39
  - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
60
- required_rubygems_version: !ruby/object:Gem::Requirement
61
- none: false
62
- requirements:
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
63
44
  - - ">="
64
- - !ruby/object:Gem::Version
65
- hash: 3
66
- segments:
67
- - 0
68
- version: "0"
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
69
47
  requirements: []
70
-
71
48
  rubyforge_project:
72
- rubygems_version: 1.3.7
49
+ rubygems_version: 2.5.1
73
50
  signing_key:
74
- specification_version: 3
75
- summary: Take app rank data from Apple and rubyfy it
51
+ specification_version: 4
52
+ summary: Parse iTunes app store data
76
53
  test_files: []
77
-
data/README DELETED
File without changes