app_store_pricing_matrix 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +20 -2
- data/Rakefile +14 -52
- data/VERSION +1 -1
- data/app_store_pricing_matrix.gemspec +1 -1
- data/lib/app_store_pricing_matrix.rb +3 -3
- data/spec/app_store_pricing_matrix_spec.rb +36 -4
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
=
|
1
|
+
= App Store Pricing Matrix
|
2
2
|
|
3
3
|
A simple module that holds currencies and prices from the Apple's iOS App Store.
|
4
4
|
|
@@ -8,7 +8,13 @@ A simple module that holds currencies and prices from the Apple's iOS App Store.
|
|
8
8
|
|
9
9
|
== Usage
|
10
10
|
|
11
|
-
|
11
|
+
Suppose you find a device locale by NSLocale on an iOS device.
|
12
|
+
|
13
|
+
NSString* currency = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencyCode];
|
14
|
+
|
15
|
+
That will give you the currency string like "USD" or "EUR", and this library expects them as a key.
|
16
|
+
|
17
|
+
Some constants, useful for validation:
|
12
18
|
|
13
19
|
AppStorePricingMatrix::CUSTOMER_CURRENCIES
|
14
20
|
=> ["USD", "MXN", "CAD", "AUD", "NZD", "JPY", "EUR", "DKK", "NOK", "SEK", "CHF", "GBP"]
|
@@ -36,3 +42,15 @@ To retrieve a developer currency from a given customer currency:
|
|
36
42
|
|
37
43
|
AppStorePricingMatrix::REVERSE_CURRENCY_MAP['DKK']
|
38
44
|
=> "EUR"
|
45
|
+
|
46
|
+
== Updating the price table
|
47
|
+
|
48
|
+
The price table was generated by parsing the exhibit C part of the paid app contract PDF file. As of February 27, 2011, it was versioned as V6.
|
49
|
+
|
50
|
+
However Apple haven't changed it much so far, it's reasonable to expect changes in the future. When that happens, strip the PDF down to 2 pages only containing the price table, rename it to "input.pdf", put it in the project root, then run the following rake task.
|
51
|
+
|
52
|
+
rake aspm:generate
|
53
|
+
|
54
|
+
Then run the spec to verify the generated content:
|
55
|
+
|
56
|
+
rake
|
data/Rakefile
CHANGED
@@ -49,73 +49,35 @@ namespace :aspm do
|
|
49
49
|
desc "Parse PDF and generate files"
|
50
50
|
task :generate do
|
51
51
|
require 'pdf-reader'
|
52
|
-
|
53
|
-
require 'yaml'
|
54
|
-
|
52
|
+
|
55
53
|
receiver = PDF::Reader::RegisterReceiver.new
|
56
|
-
pdf = PDF::Reader.file("
|
57
|
-
|
54
|
+
pdf = PDF::Reader.file("input.pdf", receiver)
|
55
|
+
|
58
56
|
targets = receiver.callbacks.select{|callback| callback[:name] == :show_text }[17..-1].map{|i| i[:args].first }
|
59
57
|
split_at = 11*86-1
|
60
|
-
|
58
|
+
|
59
|
+
page1_headers = [ :tier, :usd, :mxn, :usd_pro, :cad, :cad_pro, :aud, :nzd, :aud_pro, :jpy, :jpy_pro ]
|
60
|
+
page2_headers = [ :tier, :eur, :dkk, :nok, :sek, :chf, :eur_pro, :gbp, :gbp_pro ]
|
61
|
+
|
62
|
+
# Page 1 of Exhibit C
|
61
63
|
page1 = Hash.new{|h,k| h[k] = Array.new }.tap do |hash|
|
62
64
|
targets.each_with_index do |v,i|
|
63
65
|
next if i > split_at
|
64
|
-
key =
|
65
|
-
when 0
|
66
|
-
:tier
|
67
|
-
when 1
|
68
|
-
:usd
|
69
|
-
when 2
|
70
|
-
:mxn
|
71
|
-
when 3
|
72
|
-
:usd_pro
|
73
|
-
when 4
|
74
|
-
:cad
|
75
|
-
when 5
|
76
|
-
:cad_pro
|
77
|
-
when 6
|
78
|
-
:aud
|
79
|
-
when 7
|
80
|
-
:nzd
|
81
|
-
when 8
|
82
|
-
:aud_pro
|
83
|
-
when 9
|
84
|
-
:jpy
|
85
|
-
when 10
|
86
|
-
:jpy_pro
|
87
|
-
end
|
66
|
+
key = page1_headers[i % 11]
|
88
67
|
hash[key.to_s] << v unless key == :tier
|
89
68
|
end
|
90
69
|
end
|
91
|
-
|
70
|
+
|
92
71
|
targets = targets[split_at+15..-1]
|
72
|
+
|
73
|
+
# Page 2 of Exhibit C
|
93
74
|
page2 = Hash.new{|h,k| h[k] = Array.new }.tap do |hash|
|
94
75
|
targets.each_with_index do |v,i|
|
95
|
-
key =
|
96
|
-
when 0
|
97
|
-
:tier
|
98
|
-
when 1
|
99
|
-
:eur
|
100
|
-
when 2
|
101
|
-
:dkk
|
102
|
-
when 3
|
103
|
-
:nok
|
104
|
-
when 4
|
105
|
-
:sek
|
106
|
-
when 5
|
107
|
-
:chf
|
108
|
-
when 6
|
109
|
-
:eur_pro
|
110
|
-
when 7
|
111
|
-
:gbp
|
112
|
-
when 8
|
113
|
-
:gbp_pro
|
114
|
-
end
|
76
|
+
key = page2_headers[i % 9]
|
115
77
|
hash[key.to_s] << v unless key == :tier
|
116
78
|
end
|
117
79
|
end
|
118
|
-
|
80
|
+
|
119
81
|
whole = page1.merge(page2)
|
120
82
|
whole.keys.each do |key|
|
121
83
|
File.open("lib/prices/#{key}", 'w') {|file| file.write whole[key].join("\n") }
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.1
|
@@ -9,7 +9,7 @@ module AppStorePricingMatrix
|
|
9
9
|
}
|
10
10
|
CUSTOMER_CURRENCIES = CURRENCY_MAP.values.flatten.map{|i| i.to_s.upcase }
|
11
11
|
DEVELOPER_CURRENCIES = CURRENCY_MAP.keys.map{|i| i.to_s.upcase }
|
12
|
-
|
12
|
+
|
13
13
|
REVERSE_CURRENCY_MAP = {}.tap do |hash|
|
14
14
|
CURRENCY_MAP.keys.each do |key|
|
15
15
|
CURRENCY_MAP[key].each do |customer_currency|
|
@@ -17,13 +17,13 @@ module AppStorePricingMatrix
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
CUSTOMER_PRICES = {}.tap do |hash|
|
22
22
|
CUSTOMER_CURRENCIES.map do |currency|
|
23
23
|
hash[currency] = File.read("#{File.dirname(__FILE__)}/prices/#{currency}").split("\n")
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
DEVELOPER_PROCEEDS = {}.tap do |hash|
|
28
28
|
DEVELOPER_CURRENCIES.each do |key|
|
29
29
|
hash[key] = File.read("#{File.dirname(__FILE__)}/prices/#{key}_pro").split("\n")
|
@@ -1,11 +1,43 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module ExampleMethods
|
4
|
+
def spec_meat(file, currency)
|
5
|
+
context "Currency: #{currency}" do
|
6
|
+
it "should have currency table" do
|
7
|
+
File.exists?(file).should == true
|
8
|
+
end
|
9
|
+
|
6
10
|
File.open(file) do |text|
|
7
|
-
text.readlines
|
11
|
+
lines = text.readlines
|
12
|
+
|
13
|
+
it "should have 0 to 85 tiers" do
|
14
|
+
lines.size.should be(86)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should verify format of table content" do
|
18
|
+
lines.each_with_index do |line,i|
|
19
|
+
line.should match(/^\d+(?:\.\d\d)?\n?$/), "Error while reading \"#{File.basename(file)}\", line:#{i+1}"
|
20
|
+
end
|
21
|
+
end
|
8
22
|
end
|
9
23
|
end
|
10
24
|
end
|
11
25
|
end
|
26
|
+
include ExampleMethods
|
27
|
+
|
28
|
+
describe "AppStorePricingMatrix" do
|
29
|
+
|
30
|
+
context "Customer Currencies" do
|
31
|
+
AppStorePricingMatrix::CUSTOMER_CURRENCIES.each do |currency|
|
32
|
+
file = File.expand_path(File.dirname(__FILE__) + "/../lib/prices/#{currency.downcase}")
|
33
|
+
spec_meat(file, currency)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "Developer Proceeds" do
|
38
|
+
AppStorePricingMatrix::DEVELOPER_CURRENCIES.each do |currency|
|
39
|
+
file = File.expand_path(File.dirname(__FILE__) + "/../lib/prices/#{currency.downcase}_pro")
|
40
|
+
spec_meat(file, currency)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: app_store_pricing_matrix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.0.
|
5
|
+
version: 1.0.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kenn Ejima
|
@@ -111,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
111
|
requirements:
|
112
112
|
- - ">="
|
113
113
|
- !ruby/object:Gem::Version
|
114
|
-
hash: -
|
114
|
+
hash: -235884874267453491
|
115
115
|
segments:
|
116
116
|
- 0
|
117
117
|
version: "0"
|