opera-mobile-store-sdk 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/opera-mobile-store-sdk.rb +9 -1
- data/lib/opera-mobile-store-sdk/version.rb +1 -1
- data/lib/opera/mobile_store/build.rb +94 -32
- data/lib/opera/mobile_store/compatibility.rb +108 -0
- data/lib/opera/mobile_store/developer.rb +16 -0
- data/lib/opera/mobile_store/device_model.rb +39 -0
- data/lib/opera/mobile_store/device_platform.rb +95 -0
- data/lib/opera/mobile_store/device_platform_family.rb +39 -0
- data/lib/opera/mobile_store/payment_info.rb +21 -3
- data/lib/opera/mobile_store/product.rb +1 -1
- data/lib/opera/mobile_store_sdk/api_object_list.rb +4 -0
- data/lib/opera/mobile_store_sdk/faraday_middleware/response_parser.rb +26 -2
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea561cac052e9ae2e85a5b497683918571d0bb38
|
4
|
+
data.tar.gz: 428415aef7a5e9bdd17fd67678ac0c813bdfa33e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d1bf6eb12b9869995f71a43ff69f93a0ba1796c9e5345620d7066a97f1add2d804201c51613ac307a8f324109cceeb056640f5c51b0ced775a25b57843be611
|
7
|
+
data.tar.gz: c490eca79640c9cac48c58141980fe03d2c28b8f82b4fd4445506dfcfc0f06ef1938c61eb1b321cb19eddd4bb33be443eeadaa923c9d0effdae796a036cced14
|
@@ -9,9 +9,17 @@ module Opera
|
|
9
9
|
autoload :ProductLocalization
|
10
10
|
autoload :ProductImage
|
11
11
|
autoload :Category
|
12
|
+
|
13
|
+
autoload :Compatibility
|
14
|
+
|
12
15
|
autoload :Build
|
13
16
|
autoload :BuildFile
|
14
17
|
autoload :Developer
|
18
|
+
|
19
|
+
autoload :DeviceModel
|
20
|
+
autoload :DevicePlatformFamily
|
21
|
+
autoload :DevicePlatform
|
22
|
+
|
15
23
|
autoload :PaymentInfo
|
16
24
|
|
17
25
|
autoload :InspectableAttributes
|
@@ -44,7 +52,7 @@ module Opera
|
|
44
52
|
def self.connection
|
45
53
|
@connection ||= Faraday.new(url: Opera::MobileStoreSDK.config.api_host) do |faraday|
|
46
54
|
|
47
|
-
|
55
|
+
faraday.response :logger # log requests to STDOUT
|
48
56
|
|
49
57
|
faraday.use MobileStoreSDK::FaradayMiddleware::RequiredResponseFormat
|
50
58
|
|
@@ -8,6 +8,8 @@ module Opera::MobileStore
|
|
8
8
|
|
9
9
|
include Opera::MobileStore::InspectableAttributes
|
10
10
|
|
11
|
+
include Opera::MobileStoreSDK::IdentityMapable
|
12
|
+
|
11
13
|
# All attributes are Read-Only...
|
12
14
|
attr_accessor :id,
|
13
15
|
:name,
|
@@ -20,7 +22,11 @@ module Opera::MobileStore
|
|
20
22
|
:build_update_date,
|
21
23
|
:files,
|
22
24
|
:billing,
|
23
|
-
:languages
|
25
|
+
:languages,
|
26
|
+
:uses_sdk,
|
27
|
+
:supported_screens,
|
28
|
+
:used_permissions,
|
29
|
+
:locales
|
24
30
|
|
25
31
|
def files
|
26
32
|
@files ||= []
|
@@ -34,11 +40,32 @@ module Opera::MobileStore
|
|
34
40
|
@billing ||= false
|
35
41
|
end
|
36
42
|
|
43
|
+
def compatibility
|
44
|
+
@compatibility ||= begin
|
45
|
+
compat_query = Opera::MobileStore::Compatibility.where(build_id: id)
|
46
|
+
compat = compat_query.first
|
47
|
+
if uses_sdk.present?
|
48
|
+
compat.min_sdk_version = uses_sdk.min
|
49
|
+
compat.max_sdk_version = uses_sdk.max
|
50
|
+
compat.target_sdk_version = uses_sdk.target
|
51
|
+
end
|
52
|
+
compat
|
53
|
+
end if id.present?
|
54
|
+
end
|
55
|
+
|
56
|
+
def min_sdk_version
|
57
|
+
@min_sdk_version ||= if uses_sdk.present?
|
58
|
+
uses_sdk.min
|
59
|
+
else
|
60
|
+
compatibility.min_sdk_version
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
37
64
|
def attributes
|
38
65
|
[
|
39
66
|
:id, :name, :platform, :type, :installer_type, :package_name,
|
40
67
|
:version_name, :version_code, :build_update_date, :files, :billing,
|
41
|
-
:languages
|
68
|
+
:languages, :uses_sdk, :supported_screens, :used_permissions, :locales
|
42
69
|
].inject({}) do |hash, field_name|
|
43
70
|
field_value = self.public_send field_name
|
44
71
|
hash[field_name.to_s] = field_value if field_value.present?
|
@@ -53,7 +80,10 @@ module Opera::MobileStore
|
|
53
80
|
attributes.inject({}) do |shsh, keyval|
|
54
81
|
field_name, field_value = keyval
|
55
82
|
|
56
|
-
|
83
|
+
case field_name
|
84
|
+
when 'uses_sdk'
|
85
|
+
field_value = field_value.serializable_hash
|
86
|
+
when 'files' # Array of special objects
|
57
87
|
field_value = field_value.map(&:serializable_hash)
|
58
88
|
end
|
59
89
|
|
@@ -62,6 +92,24 @@ module Opera::MobileStore
|
|
62
92
|
end
|
63
93
|
end
|
64
94
|
|
95
|
+
def self.deserialize(serializable_hash)
|
96
|
+
attributes_hash = serializable_hash.inject({}) do |hsh, keyval|
|
97
|
+
field_name, field_value = keyval
|
98
|
+
|
99
|
+
case field_name
|
100
|
+
when 'files'
|
101
|
+
field_value = field_value.map do |item_serializable_hash|
|
102
|
+
BuildFile.deserialize item_serializable_hash
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
hsh[field_name] = field_value
|
107
|
+
hsh
|
108
|
+
end
|
109
|
+
|
110
|
+
self.new attributes_hash
|
111
|
+
end
|
112
|
+
|
65
113
|
def self.build_from_nokogiri_node(node)
|
66
114
|
|
67
115
|
version_code = node.xpath("string(version_code)")
|
@@ -76,49 +124,63 @@ module Opera::MobileStore
|
|
76
124
|
version_name: node.xpath("string(version_name)").strip,
|
77
125
|
version_code: version_code.present? ? version_code.to_i : nil,
|
78
126
|
build_update_date: Time.parse(node.xpath "string(build_update_date)"),
|
79
|
-
}.select { |key, val| val.present? }
|
80
127
|
|
81
|
-
|
82
|
-
|
83
|
-
|
128
|
+
files: node.xpath("files/file").map do |f|
|
129
|
+
BuildFile.build_from_nokogiri_node f
|
130
|
+
end,
|
131
|
+
|
132
|
+
languages: node.xpath("languages/language").map do |language|
|
133
|
+
language.attributes["code"].to_s.strip
|
134
|
+
end,
|
135
|
+
|
136
|
+
supported_screens: node.xpath("supports_screens/screen").map do |scr|
|
137
|
+
scr.text.strip
|
138
|
+
end,
|
139
|
+
|
140
|
+
used_permissions: node.xpath("uses_permissions/permission").map do |per|
|
141
|
+
per.text.strip
|
142
|
+
end,
|
143
|
+
|
144
|
+
locales: node.xpath("locales/locale").map do |locale_node|
|
145
|
+
locale_node.text.strip
|
146
|
+
end
|
147
|
+
}.select { |key, val| val.present? }
|
84
148
|
|
85
149
|
data[:billing] = node.xpath("string(billing)").to_i > 0
|
86
150
|
|
87
|
-
|
88
|
-
|
151
|
+
uses_sdk_node = node.xpath("uses_sdk").first
|
152
|
+
if uses_sdk_node.present?
|
153
|
+
uses_sdk_attributes = {
|
154
|
+
min: uses_sdk_node.xpath("string(@min)").strip,
|
155
|
+
target: uses_sdk_node.xpath("string(@target)").strip,
|
156
|
+
max: uses_sdk_node.xpath("string(@max)").strip
|
157
|
+
}.select { |k,v| v.present? }.inject({}) do |hsh, keyval|
|
158
|
+
key, val = keyval
|
159
|
+
hsh[key] = val.to_i
|
160
|
+
hsh
|
161
|
+
end
|
162
|
+
data[:uses_sdk] = UsesSDK.new uses_sdk_attributes
|
89
163
|
end
|
90
164
|
|
91
165
|
self.new data
|
92
166
|
end
|
93
167
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
:version_name, :version_code, :build_update_date, :files, :billing,
|
98
|
-
:languages
|
99
|
-
].inject({}) do |hash, field_name|
|
100
|
-
field_value = self.public_send field_name
|
101
|
-
hash[field_name.to_s] = field_value if field_value.present?
|
102
|
-
hash
|
103
|
-
end
|
104
|
-
end
|
168
|
+
class UsesSDK
|
169
|
+
include ActiveModel::Model
|
170
|
+
include ActiveModel::Serialization
|
105
171
|
|
106
|
-
|
107
|
-
attributes_hash = serializable_hash.inject({}) do |hsh, keyval|
|
108
|
-
field_name, field_value = keyval
|
172
|
+
include Opera::MobileStore::InspectableAttributes
|
109
173
|
|
110
|
-
|
111
|
-
when 'files'
|
112
|
-
field_value = field_value.map do |item_serializable_hash|
|
113
|
-
BuildFile.deserialize item_serializable_hash
|
114
|
-
end
|
115
|
-
end
|
174
|
+
attr_accessor :min, :target, :max
|
116
175
|
|
117
|
-
|
118
|
-
|
176
|
+
def attributes
|
177
|
+
[:min, :target, :max].inject({}) do |hash, field_name|
|
178
|
+
field_value = self.public_send field_name
|
179
|
+
hash[field_name.to_s] = field_value if field_value.present?
|
180
|
+
hash
|
181
|
+
end
|
119
182
|
end
|
120
183
|
|
121
|
-
self.new attributes_hash
|
122
184
|
end
|
123
185
|
|
124
186
|
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require "active_model"
|
2
|
+
|
3
|
+
module Opera::MobileStore
|
4
|
+
class Compatibility
|
5
|
+
|
6
|
+
include ActiveModel::Model
|
7
|
+
include ActiveModel::Serialization
|
8
|
+
|
9
|
+
include Opera::MobileStore::InspectableAttributes
|
10
|
+
|
11
|
+
include Opera::MobileStoreSDK::APIAccessible
|
12
|
+
|
13
|
+
# All attributes are Read-Only...
|
14
|
+
attr_accessor :model_ids, :platform_ids, :platform_family_ids, :product_id,
|
15
|
+
:build_id,
|
16
|
+
:min_sdk_version, :target_sdk_version, :max_sdk_version
|
17
|
+
|
18
|
+
def attributes
|
19
|
+
[
|
20
|
+
:model_ids, :platform_ids, :platform_family_ids, :product_id, :build_id,
|
21
|
+
:min_sdk_version, :target_sdk_version, :max_sdk_version
|
22
|
+
].inject({}) do |hash, field_name|
|
23
|
+
field_value = self.public_send field_name
|
24
|
+
hash[field_name.to_s] = field_value unless field_value.nil?
|
25
|
+
hash
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def min_sdk_version
|
30
|
+
@min_sdk_version ||= platforms.map(&:android_sdk_level).compact.min
|
31
|
+
end
|
32
|
+
|
33
|
+
def models
|
34
|
+
model_ids.map { |model_id| DeviceModel.find model_id }
|
35
|
+
end
|
36
|
+
|
37
|
+
def platforms
|
38
|
+
platform_ids.map { |platform_id| DevicePlatform.find platform_id }
|
39
|
+
end
|
40
|
+
|
41
|
+
def platform_families
|
42
|
+
platform_family_ids.map do |platform_family_id|
|
43
|
+
DevicePlatform.find platform_family_id
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def build
|
48
|
+
Build.find build_id if build_id.present?
|
49
|
+
end
|
50
|
+
|
51
|
+
self.singleton_class.send :alias_method, :deserialize, :new
|
52
|
+
|
53
|
+
# TODO: Move this implementation to the SDK namespace
|
54
|
+
def self.build_from_nokogiri_node(node)
|
55
|
+
|
56
|
+
t_node = node.xpath("build").first || node.xpath("product").first
|
57
|
+
|
58
|
+
ref_key = case t_node.node_name
|
59
|
+
when 'build' then :build_id
|
60
|
+
when 'product' then :product_id
|
61
|
+
else raise "No recognizable compatibility parent"
|
62
|
+
end
|
63
|
+
|
64
|
+
# parse the rest of the data:
|
65
|
+
data = {
|
66
|
+
ref_key => t_node.xpath("number(@id)").to_i,
|
67
|
+
model_ids: t_node.xpath("models/model").map do |model_node|
|
68
|
+
device_model_id = model_node.xpath("number(@id)").to_i
|
69
|
+
|
70
|
+
DeviceModel.new(
|
71
|
+
id: device_model_id,
|
72
|
+
code: model_node.xpath("string(@code)").strip,
|
73
|
+
name: model_node.text.strip
|
74
|
+
) unless DeviceModel.identity_mapped? device_model_id
|
75
|
+
|
76
|
+
device_model_id
|
77
|
+
end,
|
78
|
+
|
79
|
+
platform_ids: t_node.xpath("platforms/platform").map do |platform_node|
|
80
|
+
device_platform_id = platform_node.xpath("number(@id)").to_i
|
81
|
+
|
82
|
+
DevicePlatform.new(
|
83
|
+
id: device_platform_id,
|
84
|
+
code: platform_node.xpath("string(@code)").strip,
|
85
|
+
name: platform_node.text.strip
|
86
|
+
) unless DevicePlatform.identity_mapped? device_platform_id
|
87
|
+
|
88
|
+
device_platform_id
|
89
|
+
end,
|
90
|
+
|
91
|
+
platform_family_ids: t_node.xpath("platform_families/platform_family").map do |platform_family_node|
|
92
|
+
platform_family_id = platform_family_node.xpath("number(@id)").to_i
|
93
|
+
|
94
|
+
DevicePlatformFamily.new(
|
95
|
+
id: platform_family_id,
|
96
|
+
code: platform_family_node.xpath("string(@code)").strip,
|
97
|
+
name: platform_family_node.text.strip
|
98
|
+
) unless DevicePlatformFamily.identity_mapped? platform_family_id
|
99
|
+
|
100
|
+
platform_family_id
|
101
|
+
end
|
102
|
+
}
|
103
|
+
|
104
|
+
self.new data
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
@@ -68,5 +68,21 @@ module Opera::MobileStore
|
|
68
68
|
self.new data
|
69
69
|
end
|
70
70
|
|
71
|
+
def self.deserialize(serializable_hash)
|
72
|
+
attributes_hash = serializable_hash.inject({}) do |hsh, keyval|
|
73
|
+
field_name, field_value = keyval
|
74
|
+
|
75
|
+
case field_name
|
76
|
+
when 'payment_info'
|
77
|
+
field_value = PaymentInfo.deserialize field_value
|
78
|
+
end
|
79
|
+
|
80
|
+
hsh[field_name] = field_value
|
81
|
+
hsh
|
82
|
+
end
|
83
|
+
|
84
|
+
self.new attributes_hash
|
85
|
+
end
|
86
|
+
|
71
87
|
end
|
72
88
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "active_model"
|
2
|
+
|
3
|
+
module Opera::MobileStore
|
4
|
+
class DeviceModel
|
5
|
+
|
6
|
+
include ActiveModel::Model
|
7
|
+
include ActiveModel::Serialization
|
8
|
+
|
9
|
+
include Opera::MobileStore::InspectableAttributes
|
10
|
+
|
11
|
+
include Opera::MobileStoreSDK::IdentityMapable
|
12
|
+
|
13
|
+
include Opera::MobileStoreSDK::APIAccessible
|
14
|
+
|
15
|
+
# All attributes are Read-Only...
|
16
|
+
attr_accessor :id, :code, :name
|
17
|
+
|
18
|
+
def attributes
|
19
|
+
[:id, :code, :name].inject({}) do |hash, field_name|
|
20
|
+
field_value = self.public_send field_name
|
21
|
+
hash[field_name.to_s] = field_value unless field_value.nil?
|
22
|
+
hash
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
self.singleton_class.send :alias_method, :deserialize, :new
|
27
|
+
|
28
|
+
def self.build_from_nokogiri_node(node)
|
29
|
+
data = {
|
30
|
+
id: node.xpath("number(@id)").to_i,
|
31
|
+
code: node.xpath("string(@code)").strip,
|
32
|
+
name: node.text.strip
|
33
|
+
}.select { |key, val| val.present? }
|
34
|
+
|
35
|
+
self.new data
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require "active_model"
|
2
|
+
|
3
|
+
module Opera::MobileStore
|
4
|
+
class DevicePlatform
|
5
|
+
|
6
|
+
include ActiveModel::Model
|
7
|
+
include ActiveModel::Serialization
|
8
|
+
|
9
|
+
include Opera::MobileStore::InspectableAttributes
|
10
|
+
|
11
|
+
include Opera::MobileStoreSDK::IdentityMapable
|
12
|
+
|
13
|
+
include Opera::MobileStoreSDK::APIAccessible
|
14
|
+
|
15
|
+
OPERA_PLATFORM_TO_ANDROID_SDK_MAPPINGS = {
|
16
|
+
'platform-android-1-0' => 1,
|
17
|
+
'platform-android-1-1' => 2,
|
18
|
+
'platform-android-1-5' => 3,
|
19
|
+
'platform-android-1-6' => 4,
|
20
|
+
'platform-android-2-0' => 5,
|
21
|
+
'platform-android-2-0-1' => 6,
|
22
|
+
'platform-android-2-1' => 7,
|
23
|
+
'platform-android-2-2' => 8,
|
24
|
+
'platform-android-2-3' => 9,
|
25
|
+
'platform-android-2-3-3-plus' => 10,
|
26
|
+
'platform-android-3-0' => 11,
|
27
|
+
'platform-android-3-1' => 12,
|
28
|
+
'platform-android-3-2' => 13,
|
29
|
+
'platform-android-4-0' => 14,
|
30
|
+
'platform-android-4-0-3-plus' => 15,
|
31
|
+
'platform-android-4-1-plus' => 16,
|
32
|
+
'platform-android-4-2-plus' => 17,
|
33
|
+
'platform-android-4-3' => 18,
|
34
|
+
'platform-android-4-4' => 19,
|
35
|
+
'platform-android-4-4-plus' => 20
|
36
|
+
}.freeze
|
37
|
+
|
38
|
+
ANDROID_SDK_LEVEL_VERSION_CODES = {
|
39
|
+
22 => 'LOLLIPOP_MR1',
|
40
|
+
21 => 'LOLLIPOP',
|
41
|
+
20 => 'KITKAT_WATCH',
|
42
|
+
19 => 'KITKAT',
|
43
|
+
18 => 'JELLY_BEAN_MR2',
|
44
|
+
17 => 'JELLY_BEAN_MR1',
|
45
|
+
16 => 'JELLY_BEAN',
|
46
|
+
15 => 'ICE_CREAM_SANDWICH_MR1',
|
47
|
+
14 => 'ICE_CREAM_SANDWICH',
|
48
|
+
13 => 'HONEYCOMB_MR2',
|
49
|
+
12 => 'HONEYCOMB_MR1',
|
50
|
+
11 => 'HONEYCOMB',
|
51
|
+
10 => 'GINGERBREAD_MR1',
|
52
|
+
9 => 'GINGERBREAD',
|
53
|
+
8 => 'FROYO',
|
54
|
+
7 => 'ECLAIR',
|
55
|
+
6 => 'ECLAIR_0_1',
|
56
|
+
5 => 'ECLAIR',
|
57
|
+
4 => 'DONUT',
|
58
|
+
3 => 'CUPCAKE',
|
59
|
+
2 => 'BASE_1_1',
|
60
|
+
1 => 'BASE'
|
61
|
+
}.freeze
|
62
|
+
|
63
|
+
# All attributes are Read-Only...
|
64
|
+
attr_accessor :id, :code, :name
|
65
|
+
|
66
|
+
def attributes
|
67
|
+
[:id, :code, :name].inject({}) do |hash, field_name|
|
68
|
+
field_value = self.public_send field_name
|
69
|
+
hash[field_name.to_s] = field_value unless field_value.nil?
|
70
|
+
hash
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def android_sdk_level
|
75
|
+
OPERA_PLATFORM_TO_ANDROID_SDK_MAPPINGS[code] if code['platform-android'].present?
|
76
|
+
end
|
77
|
+
|
78
|
+
def android_version_code
|
79
|
+
ANDROID_SDK_LEVEL_VERSION_CODES[android_sdk_level]
|
80
|
+
end
|
81
|
+
|
82
|
+
self.singleton_class.send :alias_method, :deserialize, :new
|
83
|
+
|
84
|
+
def self.build_from_nokogiri_node(node)
|
85
|
+
data = {
|
86
|
+
id: node.xpath("number(@id)").to_i,
|
87
|
+
code: node.xpath("string(@code)").strip,
|
88
|
+
name: node.text.strip
|
89
|
+
}.select { |key, val| val.present? }
|
90
|
+
|
91
|
+
self.new data
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "active_model"
|
2
|
+
|
3
|
+
module Opera::MobileStore
|
4
|
+
class DevicePlatformFamily
|
5
|
+
|
6
|
+
include ActiveModel::Model
|
7
|
+
include ActiveModel::Serialization
|
8
|
+
|
9
|
+
include Opera::MobileStore::InspectableAttributes
|
10
|
+
|
11
|
+
include Opera::MobileStoreSDK::IdentityMapable
|
12
|
+
|
13
|
+
include Opera::MobileStoreSDK::APIAccessible
|
14
|
+
|
15
|
+
# All attributes are Read-Only...
|
16
|
+
attr_accessor :id, :code, :name
|
17
|
+
|
18
|
+
def attributes
|
19
|
+
[:id, :code, :name].inject({}) do |hash, field_name|
|
20
|
+
field_value = self.public_send field_name
|
21
|
+
hash[field_name.to_s] = field_value unless field_value.nil?
|
22
|
+
hash
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
self.singleton_class.send :alias_method, :deserialize, :new
|
27
|
+
|
28
|
+
def self.build_from_nokogiri_node(node)
|
29
|
+
data = {
|
30
|
+
id: node.xpath("number(@id)").to_i,
|
31
|
+
code: node.xpath("string(@code)").strip,
|
32
|
+
name: node.text.strip
|
33
|
+
}.select { |key, val| val.present? }
|
34
|
+
|
35
|
+
self.new data
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -9,7 +9,8 @@ module Opera::MobileStore
|
|
9
9
|
include Opera::MobileStore::InspectableAttributes
|
10
10
|
|
11
11
|
def type
|
12
|
-
self.class.name.demodulize.downcase
|
12
|
+
ref_type = self.class.name.demodulize.downcase
|
13
|
+
ref_type == 'pay_pal' ? 'paypal' : ref_type
|
13
14
|
end
|
14
15
|
|
15
16
|
def self.build_from_nokogiri_node(node)
|
@@ -26,6 +27,22 @@ module Opera::MobileStore
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
30
|
+
def self.deserialize(serializable_hash)
|
31
|
+
attributes_hash = serializable_hash.inject({}) do |hsh, keyval|
|
32
|
+
field_name, field_value = keyval
|
33
|
+
|
34
|
+
case field_name
|
35
|
+
when 'payment_info'
|
36
|
+
field_value = PaymentInfo.deserialize field_value
|
37
|
+
end
|
38
|
+
|
39
|
+
hsh[field_name] = field_value
|
40
|
+
hsh
|
41
|
+
end
|
42
|
+
|
43
|
+
self.new attributes_hash
|
44
|
+
end
|
45
|
+
|
29
46
|
class Check < PaymentInfo
|
30
47
|
attr_accessor :name, :address
|
31
48
|
|
@@ -37,7 +54,7 @@ module Opera::MobileStore
|
|
37
54
|
end
|
38
55
|
|
39
56
|
def attributes
|
40
|
-
[:name, :address].inject({}) do |hash, method|
|
57
|
+
[:type, :name, :address].inject({}) do |hash, method|
|
41
58
|
value = self.public_send method
|
42
59
|
hash[method] = value unless value.nil?
|
43
60
|
hash
|
@@ -73,6 +90,7 @@ module Opera::MobileStore
|
|
73
90
|
|
74
91
|
def attributes
|
75
92
|
[
|
93
|
+
:type,
|
76
94
|
:bank_account, :bank_name, :bank_address, :bank_swiftbic, :bank_iban,
|
77
95
|
:bank_routing_number, :intermediary_bank_name, :intermediary_bank_address,
|
78
96
|
:intermediary_bank_swiftbic, :intermediary_bank_iban
|
@@ -91,7 +109,7 @@ module Opera::MobileStore
|
|
91
109
|
end
|
92
110
|
|
93
111
|
def attributes
|
94
|
-
{ account: account }
|
112
|
+
{ type: 'paypal', account: account }
|
95
113
|
end
|
96
114
|
end
|
97
115
|
|
@@ -102,7 +102,7 @@ module Opera::MobileStore
|
|
102
102
|
when 'category'
|
103
103
|
field_value = Category.deserialize field_value
|
104
104
|
when 'author'
|
105
|
-
field_value =
|
105
|
+
field_value = Developer.deserialize field_value
|
106
106
|
when 'i18n'
|
107
107
|
field_value = field_value.map do |item_serializable_hash|
|
108
108
|
ProductLocalization.deserialize item_serializable_hash
|
@@ -165,6 +165,10 @@ module Opera
|
|
165
165
|
def action_param
|
166
166
|
@_action_param ||= case @klass
|
167
167
|
when "Opera::MobileStore::Developer" then "full_developers"
|
168
|
+
when "Opera::MobileStore::Compatibility" then "compatibility"
|
169
|
+
when "Opera::MobileStore::DeviceModel" then "models"
|
170
|
+
when "Opera::MobileStore::DevicePlatform" then "platforms"
|
171
|
+
when "Opera::MobileStore::DevicePlatformFamily" then "platform_families"
|
168
172
|
else @klass.demodulize.underscore.pluralize
|
169
173
|
end
|
170
174
|
end
|
@@ -22,10 +22,34 @@ module Opera
|
|
22
22
|
|
23
23
|
real_root_name = xml_data.xpath("name(/xml/*)")
|
24
24
|
|
25
|
-
parser_class =
|
25
|
+
parser_class = case real_root_name
|
26
|
+
when "platforms"
|
27
|
+
Opera::MobileStore::DevicePlatform
|
28
|
+
when "platform_families"
|
29
|
+
Opera::MobileStore::DevicePlatformFamily
|
30
|
+
else
|
31
|
+
"Opera::MobileStore::#{real_root_name.classify}".safe_constantize
|
32
|
+
end
|
26
33
|
|
27
34
|
# Parse each node:
|
28
|
-
collection_path = "/xml/#{real_root_name}
|
35
|
+
collection_path = "/xml/#{real_root_name}"
|
36
|
+
collection_path += case real_root_name
|
37
|
+
when "compatibility"
|
38
|
+
# Add the product id to the compatibility child nodes if
|
39
|
+
# a product compatibility was queried instead of a build compat:
|
40
|
+
product_param = request_env.url.query[/product_id=(\d+)/i]
|
41
|
+
if product_param.present?
|
42
|
+
product_id = product_param.split('=').last.to_i
|
43
|
+
xml_data.xpath("#{collection_path}/product").each do |product_compat_node|
|
44
|
+
product_compat_node.set_attribute('id', product_id)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Return an empty string...
|
49
|
+
""
|
50
|
+
else
|
51
|
+
"/#{real_root_name.singularize}"
|
52
|
+
end
|
29
53
|
|
30
54
|
parsed_data = xml_data.xpath(collection_path).map do |item_node|
|
31
55
|
parser_class.build_from_nokogiri_node item_node
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opera-mobile-store-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roberto Quintanilla
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -130,7 +130,11 @@ files:
|
|
130
130
|
- lib/opera/mobile_store/build.rb
|
131
131
|
- lib/opera/mobile_store/build_file.rb
|
132
132
|
- lib/opera/mobile_store/category.rb
|
133
|
+
- lib/opera/mobile_store/compatibility.rb
|
133
134
|
- lib/opera/mobile_store/developer.rb
|
135
|
+
- lib/opera/mobile_store/device_model.rb
|
136
|
+
- lib/opera/mobile_store/device_platform.rb
|
137
|
+
- lib/opera/mobile_store/device_platform_family.rb
|
134
138
|
- lib/opera/mobile_store/inspectable_attributes.rb
|
135
139
|
- lib/opera/mobile_store/payment_info.rb
|
136
140
|
- lib/opera/mobile_store/product.rb
|