candy_check 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +1 -0
- data/.rubocop.yml +10 -0
- data/.ruby-version +1 -1
- data/Gemfile +1 -1
- data/Guardfile +5 -3
- data/Rakefile +5 -5
- data/candy_check.gemspec +10 -10
- data/lib/candy_check/app_store/client.rb +7 -7
- data/lib/candy_check/app_store/config.rb +7 -9
- data/lib/candy_check/app_store/receipt.rb +16 -16
- data/lib/candy_check/app_store/receipt_collection.rb +2 -2
- data/lib/candy_check/app_store/subscription_verification.rb +5 -5
- data/lib/candy_check/app_store/verification.rb +3 -3
- data/lib/candy_check/app_store/verification_failure.rb +25 -21
- data/lib/candy_check/app_store/verifier.rb +4 -5
- data/lib/candy_check/app_store.rb +8 -8
- data/lib/candy_check/cli/app.rb +1 -1
- data/lib/candy_check/cli/commands/app_store.rb +1 -1
- data/lib/candy_check/cli/commands.rb +4 -4
- data/lib/candy_check/cli/out.rb +1 -3
- data/lib/candy_check/cli.rb +3 -3
- data/lib/candy_check/play_store/product_acknowledgements/acknowledgement.rb +2 -1
- data/lib/candy_check/play_store/product_purchases/product_purchase.rb +3 -3
- data/lib/candy_check/play_store/product_purchases/product_verification.rb +1 -1
- data/lib/candy_check/play_store/subscription_purchases/subscription_purchase.rb +2 -1
- data/lib/candy_check/play_store/subscription_purchases/subscription_verification.rb +1 -0
- data/lib/candy_check/play_store/verification_failure.rb +2 -2
- data/lib/candy_check/utils/attribute_reader.rb +3 -2
- data/lib/candy_check/utils/config.rb +2 -0
- data/lib/candy_check/utils.rb +2 -2
- data/lib/candy_check/version.rb +1 -1
- data/lib/candy_check.rb +4 -4
- data/spec/app_store/client_spec.rb +18 -18
- data/spec/app_store/config_spec.rb +9 -9
- data/spec/app_store/receipt_collection_spec.rb +38 -40
- data/spec/app_store/receipt_spec.rb +47 -47
- data/spec/app_store/subscription_verification_spec.rb +35 -32
- data/spec/app_store/verifcation_failure_spec.rb +7 -7
- data/spec/app_store/verification_spec.rb +23 -11
- data/spec/app_store/verifier_spec.rb +40 -48
- data/spec/cli/app_spec.rb +11 -13
- data/spec/cli/commands/app_store_spec.rb +22 -23
- data/spec/cli/commands/play_store_spec.rb +3 -1
- data/spec/cli/commands/version_spec.rb +2 -2
- data/spec/cli/out_spec.rb +9 -9
- data/spec/play_store/acknowledger_spec.rb +4 -0
- data/spec/play_store/product_acknowledgements/acknowledgement_spec.rb +4 -0
- data/spec/play_store/product_acknowledgements/response_spec.rb +16 -15
- data/spec/play_store/product_purchases/product_purchase_spec.rb +6 -27
- data/spec/play_store/subscription_purchases/subscription_purchase_spec.rb +22 -46
- data/spec/play_store/verification_failure_spec.rb +6 -4
- data/spec/play_store/verifier_spec.rb +4 -2
- data/spec/spec_helper.rb +5 -7
- metadata +76 -76
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a0364f397bae2516f6fcb5c051bcffed96864f588a731d82679a41ee1149722
|
4
|
+
data.tar.gz: ef8356c0946eddebd063ae602be5a6eed3a6f42499b4adf582aa3f17c7f39b27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aead43177558961e62bbfddefbec2f6486715060ad4d304b464e8742a5ff57835a0162d9510e76b0ec8be7478b78eacf6e1ae921dd8a2cac9b942380f1aec073
|
7
|
+
data.tar.gz: ef8e0dc05dcd0c22d8ff65c51deabe536d69a4d33e00ac60aa1cb0d6424bc5ecfeb9afe1c3d8f85b01de656635a548a2b82170823811b3fd02648fed2f2e7382
|
data/.github/workflows/build.yml
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
AllCops:
|
2
|
+
TargetRubyVersion: 2.6
|
2
3
|
Exclude:
|
3
4
|
- 'spec/support/*'
|
4
5
|
- 'bin/**/*'
|
@@ -7,6 +8,8 @@ Style/Documentation:
|
|
7
8
|
Enabled: false
|
8
9
|
Style/FrozenStringLiteralComment:
|
9
10
|
Enabled: false
|
11
|
+
Style/StringLiterals:
|
12
|
+
EnforcedStyle: double_quotes
|
10
13
|
Style/NumericPredicate:
|
11
14
|
Enabled: false
|
12
15
|
Lint/UnifiedInteger:
|
@@ -19,6 +22,7 @@ Style/PercentLiteralDelimiters:
|
|
19
22
|
Metrics/BlockLength:
|
20
23
|
Exclude:
|
21
24
|
- 'spec/**/*'
|
25
|
+
- '*.gemspec'
|
22
26
|
Security/MarshalLoad:
|
23
27
|
Exclude:
|
24
28
|
- 'lib/candy_check/play_store/discovery_repository.rb'
|
@@ -28,3 +32,9 @@ Style/Encoding:
|
|
28
32
|
Enabled: false
|
29
33
|
Style/ExpandPathArguments:
|
30
34
|
Enabled: false
|
35
|
+
Style/TrailingCommaInArrayLiteral:
|
36
|
+
EnforcedStyleForMultiline: comma
|
37
|
+
Style/TrailingCommaInArguments:
|
38
|
+
EnforcedStyleForMultiline: comma
|
39
|
+
Style/TrailingCommaInHashLiteral:
|
40
|
+
EnforcedStyleForMultiline: comma
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1
|
1
|
+
3.2.1
|
data/Gemfile
CHANGED
data/Guardfile
CHANGED
@@ -2,8 +2,10 @@
|
|
2
2
|
# More info at https://github.com/guard/guard#readme
|
3
3
|
|
4
4
|
## Uncomment and set this to only include directories you want to watch
|
5
|
-
directories
|
6
|
-
|
5
|
+
directories(
|
6
|
+
%w(lib spec) \
|
7
|
+
.select { |d| Dir.exist?(d) ? d : UI.warning("Directory #{d} does not exist") },
|
8
|
+
)
|
7
9
|
|
8
10
|
## Note: if you are using the `directories` clause above and you are not
|
9
11
|
## watching the project directory ('.'), then you will want to move
|
@@ -24,7 +26,7 @@ guard :minitest do
|
|
24
26
|
# with Minitest::Spec
|
25
27
|
watch(%r{^spec/(.*)_spec\.rb$})
|
26
28
|
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
27
|
-
watch(%r{^spec/spec_helper\.rb$}) {
|
29
|
+
watch(%r{^spec/spec_helper\.rb$}) { "spec" }
|
28
30
|
|
29
31
|
# Rails 4
|
30
32
|
# watch(%r{^app/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
|
data/Rakefile
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require "rake/testtask"
|
5
|
+
require "rubocop/rake_task"
|
6
6
|
|
7
7
|
Rake::TestTask.new(:spec) do |test|
|
8
|
-
test.test_files = FileList[
|
9
|
-
test.libs <<
|
8
|
+
test.test_files = FileList["spec/**/*_spec.rb"]
|
9
|
+
test.libs << "spec"
|
10
10
|
test.verbose = true
|
11
11
|
end
|
12
12
|
|
data/candy_check.gemspec
CHANGED
@@ -20,25 +20,25 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.6")
|
22
22
|
|
23
|
-
spec.add_dependency "google-apis-androidpublisher_v3", "~> 0.
|
24
|
-
spec.add_dependency "googleauth", "~> 1.
|
23
|
+
spec.add_dependency "google-apis-androidpublisher_v3", "~> 0.34.0"
|
24
|
+
spec.add_dependency "googleauth", "~> 1.3.0"
|
25
25
|
spec.add_dependency "multi_json", "~> 1.15"
|
26
26
|
spec.add_dependency "thor", "< 2.0"
|
27
27
|
|
28
|
+
spec.add_development_dependency "awesome_print"
|
28
29
|
spec.add_development_dependency "bundler", "~> 2.0"
|
30
|
+
spec.add_development_dependency "guard"
|
31
|
+
spec.add_development_dependency "guard-minitest"
|
29
32
|
spec.add_development_dependency "inch", "~> 0.7"
|
30
33
|
spec.add_development_dependency "minitest", "~> 5.10"
|
31
34
|
spec.add_development_dependency "minitest-around", "~> 0.4"
|
32
35
|
spec.add_development_dependency "minitest-focus"
|
33
|
-
spec.add_development_dependency "rake", "~> 12.0"
|
34
|
-
spec.add_development_dependency "rubocop", "~> 0.48"
|
35
|
-
spec.add_development_dependency "timecop", "~> 0.8"
|
36
|
-
spec.add_development_dependency "webmock", "~> 3.0"
|
37
|
-
spec.add_development_dependency "vcr"
|
38
36
|
spec.add_development_dependency "pry"
|
39
|
-
spec.add_development_dependency "
|
40
|
-
spec.add_development_dependency "
|
41
|
-
spec.add_development_dependency "guard-minitest"
|
37
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
38
|
+
spec.add_development_dependency "rubocop", "~> 1.46"
|
42
39
|
spec.add_development_dependency "simplecov", "~> 0.18.0"
|
43
40
|
spec.add_development_dependency "simplecov-lcov", "~> 0.8.0"
|
41
|
+
spec.add_development_dependency "timecop", "~> 0.9"
|
42
|
+
spec.add_development_dependency "vcr", "~> 6.1"
|
43
|
+
spec.add_development_dependency "webmock", "~> 3.0"
|
44
44
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "multi_json"
|
2
|
+
require "net/http"
|
3
3
|
|
4
4
|
module CandyCheck
|
5
5
|
module AppStore
|
@@ -7,7 +7,7 @@ module CandyCheck
|
|
7
7
|
# servers (either sandbox or production).
|
8
8
|
class Client
|
9
9
|
# Mimetype for JSON objects
|
10
|
-
JSON_MIME_TYPE =
|
10
|
+
JSON_MIME_TYPE = "application/json".freeze
|
11
11
|
|
12
12
|
# Initialize a new client bound to an endpoint
|
13
13
|
# @param endpoint_url [String]
|
@@ -40,17 +40,17 @@ module CandyCheck
|
|
40
40
|
|
41
41
|
def build_request(parameters)
|
42
42
|
Net::HTTP::Post.new(@uri.request_uri).tap do |post|
|
43
|
-
post[
|
44
|
-
post[
|
43
|
+
post["Accept"] = JSON_MIME_TYPE
|
44
|
+
post["Content-Type"] = JSON_MIME_TYPE
|
45
45
|
post.body = MultiJson.dump(parameters)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
49
|
def build_request_parameters(receipt_data, secret)
|
50
50
|
{
|
51
|
-
|
51
|
+
"receipt-data" => receipt_data,
|
52
52
|
}.tap do |h|
|
53
|
-
h[
|
53
|
+
h["password"] = secret if secret
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -5,15 +5,13 @@ module CandyCheck
|
|
5
5
|
# @return [Symbol] the used environment
|
6
6
|
attr_reader :environment
|
7
7
|
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
|
15
|
-
super
|
16
|
-
end
|
8
|
+
# @!method initialize(attributes)
|
9
|
+
# Initializes a new configuration from a hash
|
10
|
+
# @param attributes [Hash]
|
11
|
+
# @example
|
12
|
+
# Config.new(
|
13
|
+
# environment: :production # or :sandbox
|
14
|
+
# )
|
17
15
|
|
18
16
|
# @return [Boolean] if it is production environment
|
19
17
|
def production?
|
@@ -18,63 +18,63 @@ module CandyCheck
|
|
18
18
|
# transaction was canceled.
|
19
19
|
# @return [Boolean]
|
20
20
|
def valid?
|
21
|
-
!has?(
|
21
|
+
!has?("cancellation_date")
|
22
22
|
end
|
23
23
|
|
24
24
|
# The receipt's transaction id
|
25
25
|
# @return [String]
|
26
26
|
def transaction_id
|
27
|
-
read(
|
27
|
+
read("transaction_id")
|
28
28
|
end
|
29
29
|
|
30
30
|
# The receipt's original transaction id which might differ from
|
31
31
|
# the transaction id for restored products
|
32
32
|
# @return [String]
|
33
33
|
def original_transaction_id
|
34
|
-
read(
|
34
|
+
read("original_transaction_id")
|
35
35
|
end
|
36
36
|
|
37
37
|
# The version number for the app
|
38
38
|
# @return [String]
|
39
39
|
def app_version
|
40
|
-
read(
|
40
|
+
read("bvrs")
|
41
41
|
end
|
42
42
|
|
43
43
|
# The app's bundle identifier
|
44
44
|
# @return [String]
|
45
45
|
def bundle_identifier
|
46
|
-
read(
|
46
|
+
read("bid")
|
47
47
|
end
|
48
48
|
|
49
49
|
# The app's identifier of the product (SKU)
|
50
50
|
# @return [String]
|
51
51
|
def product_id
|
52
|
-
read(
|
52
|
+
read("product_id")
|
53
53
|
end
|
54
54
|
|
55
55
|
# The app's item id of the product
|
56
56
|
# @return [String]
|
57
57
|
def item_id
|
58
|
-
read(
|
58
|
+
read("item_id")
|
59
59
|
end
|
60
60
|
|
61
61
|
# The quantity of the product
|
62
|
-
# @return [
|
62
|
+
# @return [Integer]
|
63
63
|
def quantity
|
64
|
-
read_integer(
|
64
|
+
read_integer("quantity")
|
65
65
|
end
|
66
66
|
|
67
67
|
# The purchase date
|
68
68
|
# @return [DateTime]
|
69
69
|
def purchase_date
|
70
|
-
read_datetime_from_string(
|
70
|
+
read_datetime_from_string("purchase_date")
|
71
71
|
end
|
72
72
|
|
73
73
|
# The original purchase date which might differ from the
|
74
74
|
# actual purchase date for restored products
|
75
75
|
# @return [DateTime]
|
76
76
|
def original_purchase_date
|
77
|
-
read_datetime_from_string(
|
77
|
+
read_datetime_from_string("original_purchase_date")
|
78
78
|
end
|
79
79
|
|
80
80
|
# The date of when Apple has canceled this transaction.
|
@@ -82,19 +82,19 @@ module CandyCheck
|
|
82
82
|
# the same as if no purchase had ever been made."
|
83
83
|
# @return [DateTime]
|
84
84
|
def cancellation_date
|
85
|
-
read_datetime_from_string(
|
85
|
+
read_datetime_from_string("cancellation_date")
|
86
86
|
end
|
87
87
|
|
88
88
|
# The date of a subscription's expiration
|
89
89
|
# @return [DateTime]
|
90
90
|
def expires_date
|
91
|
-
read_datetime_from_string(
|
91
|
+
read_datetime_from_string("expires_date")
|
92
92
|
end
|
93
93
|
|
94
|
-
# rubocop:disable PredicateName
|
94
|
+
# rubocop:disable Naming/PredicateName
|
95
95
|
def is_trial_period
|
96
|
-
# rubocop:enable PredicateName
|
97
|
-
read_bool(
|
96
|
+
# rubocop:enable Naming/PredicateName
|
97
|
+
read_bool("is_trial_period")
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
@@ -10,9 +10,9 @@ module CandyCheck
|
|
10
10
|
# from Apple's verification server
|
11
11
|
# @param attributes [Array<Hash>] raw data from Apple's server
|
12
12
|
def initialize(attributes)
|
13
|
-
@receipts = attributes.map {|r| Receipt.new(r) }.sort
|
13
|
+
@receipts = attributes.map { |r| Receipt.new(r) }.sort do |a, b|
|
14
14
|
a.purchase_date - b.purchase_date
|
15
|
-
|
15
|
+
end
|
16
16
|
end
|
17
17
|
|
18
18
|
# Check if the latest expiration date is passed
|
@@ -24,9 +24,9 @@ module CandyCheck
|
|
24
24
|
def call!
|
25
25
|
verify!
|
26
26
|
if valid?
|
27
|
-
build_collection(@response[
|
27
|
+
build_collection(@response["latest_receipt_info"])
|
28
28
|
else
|
29
|
-
VerificationFailure.fetch(@response[
|
29
|
+
VerificationFailure.fetch(@response["status"])
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -35,15 +35,15 @@ module CandyCheck
|
|
35
35
|
def build_collection(latest_receipt_info)
|
36
36
|
unless @product_ids.nil?
|
37
37
|
latest_receipt_info = latest_receipt_info.select do |info|
|
38
|
-
@product_ids.include?(info[
|
38
|
+
@product_ids.include?(info["product_id"])
|
39
39
|
end
|
40
40
|
end
|
41
41
|
ReceiptCollection.new(latest_receipt_info)
|
42
42
|
end
|
43
43
|
|
44
44
|
def valid?
|
45
|
-
status_is_ok = @response[
|
46
|
-
@response && status_is_ok && @response[
|
45
|
+
status_is_ok = @response["status"] == STATUS_OK
|
46
|
+
@response && status_is_ok && @response["latest_receipt_info"]
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -29,16 +29,16 @@ module CandyCheck
|
|
29
29
|
def call!
|
30
30
|
verify!
|
31
31
|
if valid?
|
32
|
-
Receipt.new(@response[
|
32
|
+
Receipt.new(@response["receipt"])
|
33
33
|
else
|
34
|
-
VerificationFailure.fetch(@response[
|
34
|
+
VerificationFailure.fetch(@response["status"])
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
private
|
39
39
|
|
40
40
|
def valid?
|
41
|
-
@response && @response[
|
41
|
+
@response && @response["status"] == STATUS_OK && @response["receipt"]
|
42
42
|
end
|
43
43
|
|
44
44
|
def verify!
|
@@ -2,7 +2,7 @@ module CandyCheck
|
|
2
2
|
module AppStore
|
3
3
|
# Represents a failing call against the verification server
|
4
4
|
class VerificationFailure
|
5
|
-
# @return [
|
5
|
+
# @return [Integer] the code of the failure
|
6
6
|
attr_reader :code
|
7
7
|
|
8
8
|
# @return [String] the message of the failure
|
@@ -10,7 +10,7 @@ module CandyCheck
|
|
10
10
|
|
11
11
|
# Initializes a new instance which bases on a JSON result
|
12
12
|
# from Apple servers
|
13
|
-
# @param code [
|
13
|
+
# @param code [Integer]
|
14
14
|
# @param message [String]
|
15
15
|
def initialize(code, message)
|
16
16
|
@code = code
|
@@ -20,7 +20,7 @@ module CandyCheck
|
|
20
20
|
class << self
|
21
21
|
# Gets a known failure or build an unknown failure
|
22
22
|
# without description
|
23
|
-
# @param code [
|
23
|
+
# @param code [Integer]
|
24
24
|
# @return [VerificationFailure]
|
25
25
|
def fetch(code)
|
26
26
|
known.fetch(code) do
|
@@ -31,7 +31,7 @@ module CandyCheck
|
|
31
31
|
private
|
32
32
|
|
33
33
|
def fallback(code)
|
34
|
-
new(code || -1,
|
34
|
+
new(code || -1, "Unknown error")
|
35
35
|
end
|
36
36
|
|
37
37
|
def known
|
@@ -47,23 +47,27 @@ module CandyCheck
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
add 21_000,
|
51
|
-
|
52
|
-
|
53
|
-
add
|
54
|
-
|
55
|
-
|
56
|
-
add
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
50
|
+
add 21_000, "The request to the App Store was not made using" \
|
51
|
+
" the HTTP POST request method."
|
52
|
+
add 21_001, "This status code is no longer sent by the App Store."
|
53
|
+
add 21_002, "The data in the receipt-data property was malformed" \
|
54
|
+
" or the service experienced a temporary issue. Try again."
|
55
|
+
add 21_003, "The receipt could not be authenticated."
|
56
|
+
add 21_004, "The shared secret you provided does not match the shared" \
|
57
|
+
" secret on file for your account."
|
58
|
+
add 21_005, "The receipt server was temporarily unable to provide" \
|
59
|
+
" the receipt. Try again."
|
60
|
+
add 21_006, "This receipt is valid but the subscription has expired." \
|
61
|
+
" When this status code is returned to your server, the" \
|
62
|
+
" receipt data is also decoded and returned as part of" \
|
63
|
+
" the response. Only returned for iOS 6-style transaction" \
|
64
|
+
" receipts for auto-renewable subscriptions."
|
65
|
+
add 21_007, "This receipt is from the test environment, but it was" \
|
66
|
+
" sent to the production environment for verification."
|
67
|
+
add 21_008, "This receipt is from the production environment, but it" \
|
68
|
+
" was sent to the test environment for verification."
|
69
|
+
add 21_009, "Internal data access error. Try again later."
|
70
|
+
add 21_010, "The user account cannot be found or has been deleted."
|
67
71
|
freeze!
|
68
72
|
end
|
69
73
|
end
|
@@ -4,9 +4,9 @@ module CandyCheck
|
|
4
4
|
# The call return either an {Receipt} or a {VerificationFailure}
|
5
5
|
class Verifier
|
6
6
|
# HTTPS endpoint for production receipts
|
7
|
-
PRODUCTION_ENDPOINT =
|
7
|
+
PRODUCTION_ENDPOINT = "https://buy.itunes.apple.com/verifyReceipt".freeze
|
8
8
|
# HTTPS endpoint for sandbox receipts
|
9
|
-
SANDBOX_ENDPOINT =
|
9
|
+
SANDBOX_ENDPOINT = "https://sandbox.itunes.apple.com/verifyReceipt".freeze
|
10
10
|
# Status code from production endpoint when receiving a sandbox
|
11
11
|
# receipt which occurs during the app's review process
|
12
12
|
REDIRECT_TO_SANDBOX_CODE = 21_007
|
@@ -49,9 +49,8 @@ module CandyCheck
|
|
49
49
|
def fetch_receipt_information(verifier_class, args)
|
50
50
|
default_endpoint, opposite_endpoint = endpoints
|
51
51
|
result = call_for(verifier_class, args.dup.unshift(default_endpoint))
|
52
|
-
if should_retry?(result)
|
53
|
-
|
54
|
-
end
|
52
|
+
return call_for(verifier_class, args.dup.unshift(opposite_endpoint)) if should_retry?(result)
|
53
|
+
|
55
54
|
result
|
56
55
|
end
|
57
56
|
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
1
|
+
require "candy_check/app_store/client"
|
2
|
+
require "candy_check/app_store/config"
|
3
|
+
require "candy_check/app_store/receipt"
|
4
|
+
require "candy_check/app_store/receipt_collection"
|
5
|
+
require "candy_check/app_store/verification"
|
6
|
+
require "candy_check/app_store/subscription_verification"
|
7
|
+
require "candy_check/app_store/verification_failure"
|
8
|
+
require "candy_check/app_store/verifier"
|
9
9
|
|
10
10
|
module CandyCheck
|
11
11
|
# Module to request and verify a AppStore receipt
|
data/lib/candy_check/cli/app.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "candy_check/cli/commands/base"
|
2
|
+
require "candy_check/cli/commands/app_store"
|
3
|
+
require "candy_check/cli/commands/play_store"
|
4
|
+
require "candy_check/cli/commands/version"
|
5
5
|
|
6
6
|
module CandyCheck
|
7
7
|
module CLI
|
data/lib/candy_check/cli/out.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'pp'
|
2
|
-
|
3
1
|
module CandyCheck
|
4
2
|
module CLI
|
5
3
|
# A wrapper to output text information to any kind of buffer
|
@@ -18,7 +16,7 @@ module CandyCheck
|
|
18
16
|
|
19
17
|
# Prints to +out+
|
20
18
|
# @param text [String]
|
21
|
-
def print(text =
|
19
|
+
def print(text = "")
|
22
20
|
out.puts text
|
23
21
|
end
|
24
22
|
|
data/lib/candy_check/cli.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "candy_check/cli/app"
|
2
|
+
require "candy_check/cli/commands"
|
3
|
+
require "candy_check/cli/out"
|
4
4
|
|
5
5
|
module CandyCheck
|
6
6
|
# Namespace holding the implementation of the CLI to
|
@@ -26,7 +26,8 @@ module CandyCheck
|
|
26
26
|
acknowledge!
|
27
27
|
|
28
28
|
CandyCheck::PlayStore::ProductAcknowledgements::Response.new(
|
29
|
-
result: @response[:result], error_data: @response[:error_data]
|
29
|
+
result: @response[:result], error_data: @response[:error_data],
|
30
|
+
)
|
30
31
|
end
|
31
32
|
|
32
33
|
private
|
@@ -26,7 +26,7 @@ module CandyCheck
|
|
26
26
|
# The purchase state of the order. Possible values are:
|
27
27
|
# * 0: Purchased
|
28
28
|
# * 1: Cancelled
|
29
|
-
# @return [
|
29
|
+
# @return [Integer]
|
30
30
|
def purchase_state
|
31
31
|
@product_purchase.purchase_state
|
32
32
|
end
|
@@ -34,7 +34,7 @@ module CandyCheck
|
|
34
34
|
# The consumption state of the inapp product. Possible values are:
|
35
35
|
# * 0: Yet to be consumed
|
36
36
|
# * 1: Consumed
|
37
|
-
# @return [
|
37
|
+
# @return [Integer]
|
38
38
|
def consumption_state
|
39
39
|
@product_purchase.consumption_state
|
40
40
|
end
|
@@ -60,7 +60,7 @@ module CandyCheck
|
|
60
60
|
|
61
61
|
# The time the product was purchased, in milliseconds since the
|
62
62
|
# epoch (Jan 1, 1970)
|
63
|
-
# @return [
|
63
|
+
# @return [Integer]
|
64
64
|
def purchase_time_millis
|
65
65
|
@product_purchase.purchase_time_millis
|
66
66
|
end
|
@@ -5,7 +5,8 @@ module CandyCheck
|
|
5
5
|
class SubscriptionPurchase
|
6
6
|
include Utils::AttributeReader
|
7
7
|
|
8
|
-
# @return [Google::Apis::AndroidpublisherV3::SubscriptionPurchase] the raw subscription purchase
|
8
|
+
# @return [Google::Apis::AndroidpublisherV3::SubscriptionPurchase] the raw subscription purchase
|
9
|
+
# from google-api-client
|
9
10
|
attr_reader :subscription_purchase
|
10
11
|
|
11
12
|
# The payment of the subscription is pending (paymentState)
|