venice-bnet 0.3.1.paperlesspost

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: b6c6a561acb68229add7731b797fda6ba6316039
4
+ data.tar.gz: a373c317593c5c762fded139f3d9ab5e87b2d230
5
+ SHA512:
6
+ metadata.gz: 045a9a9a3d3d5a205ea95a3c623993f3d6c8ecc47691479a19478ee8d15ce1078d0684e3633a0177803c7d781e7eb14d481012abe9f46cf90e7bc506c9299376
7
+ data.tar.gz: 7ec72580a0a1742690d95ac8e84b25f76fae552a7dcfde967ddb689dcea40663b4293261862c754b7dcda917ee6da24f827885aa0edc764afb3d74ff2eafd61a
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,41 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ venice-bnet (0.3.1.paperlesspost)
5
+ commander (~> 4.1)
6
+ json
7
+ terminal-table (~> 1.4)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ commander (4.3.4)
13
+ highline (~> 1.7.2)
14
+ diff-lcs (1.2.5)
15
+ docile (1.1.5)
16
+ highline (1.7.2)
17
+ json (1.8.2)
18
+ rake (10.4.2)
19
+ rspec (2.99.0)
20
+ rspec-core (~> 2.99.0)
21
+ rspec-expectations (~> 2.99.0)
22
+ rspec-mocks (~> 2.99.0)
23
+ rspec-core (2.99.2)
24
+ rspec-expectations (2.99.2)
25
+ diff-lcs (>= 1.1.3, < 2.0)
26
+ rspec-mocks (2.99.3)
27
+ simplecov (0.10.0)
28
+ docile (~> 1.1.0)
29
+ json (~> 1.8)
30
+ simplecov-html (~> 0.10.0)
31
+ simplecov-html (0.10.0)
32
+ terminal-table (1.4.5)
33
+
34
+ PLATFORMS
35
+ ruby
36
+
37
+ DEPENDENCIES
38
+ rake
39
+ rspec (~> 2.99.0)
40
+ simplecov
41
+ venice-bnet!
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2013 Mattt Thompson (http://mattt.me/)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,72 @@
1
+ ![Venice](https://raw.github.com/nomad/nomad.github.io/assets/venice-banner.png)
2
+
3
+ Venice is a simple gem for verifying Apple In-App Purchase receipts, and retrieving the information associated with receipt data.
4
+
5
+ There are two reasons why you should verify in-app purchase receipts on the server: First, it allows you to keep your own records of past purchases, which is useful for up-to-the-minute metrics and historical analysis. Second, server-side verification over SSL is the most reliable way to determine the authenticity of purchasing records.
6
+
7
+ See Apple's [In-App Purchase Programming Guide](http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html) for additional information.
8
+
9
+ > Venice is named for [Venice, Italy](http://en.wikipedia.org/wiki/Venice,_Italy)—or more specifically, Shakespeare's [_The Merchant of Venice_](http://en.wikipedia.org/wiki/The_Merchant_of_Venice).
10
+ > It's part of a series of world-class command-line utilities for iOS development, which includes [Cupertino](https://github.com/mattt/cupertino) (Apple Dev Center management), [Shenzhen](https://github.com/mattt/shenzhen) (Building & Distribution), [Houston](https://github.com/mattt/houston) (Push Notifications), and [Dubai](https://github.com/mattt/dubai) (Passbook pass generation).
11
+
12
+ ## Installation
13
+
14
+ $ gem install venice
15
+
16
+ ## Usage
17
+
18
+ ```ruby
19
+ require 'venice'
20
+
21
+ data = "(Base64-Encoded Receipt Data)"
22
+ if receipt = Venice::Receipt.verify(data)
23
+ p receipt.to_h
24
+ end
25
+ ```
26
+
27
+ ## Command Line Interface
28
+
29
+ Venice also comes with the `iap` binary, which provides a convenient way to verify receipts from the command line.
30
+
31
+
32
+ $ iap verify /path/to/receipt
33
+
34
+ +--------------------------------+------------------------------------+
35
+ | Receipt |
36
+ +--------------------------------+------------------------------------+
37
+ | adam_id | 664753504 |
38
+ | application_version | 123 |
39
+ | bundle_id | com.example.product |
40
+ | download_id | 30000000000005 |
41
+ | expires_at | |
42
+ | latest_receipt | |
43
+ | original_application_version | 123 |
44
+ | original_purchase_date | Fri, 07 Mar 2014 20:59:24 GMT |
45
+ | receipt_type | Production |
46
+ | requested_at | Mon, 23 Jun 2014 17:59:38 GMT |
47
+ +--------------------------------+------------------------------------+
48
+ | in_app | 1 |
49
+ | - app_item_id | |
50
+ | - cancellation_at | |
51
+ | - expires_at | |
52
+ | - original_purchase_date | |
53
+ | - original_transaction_id | 1000000000000001 |
54
+ | - product_id | com.example.product |
55
+ | - purchase_date | |
56
+ | - quantity | 1 |
57
+ | - transaction_id | 1000000000000001 |
58
+ | - version_external_identifier | |
59
+ +--------------------------------+------------------------------------+
60
+
61
+
62
+ ## Contact
63
+
64
+ Mattt Thompson
65
+
66
+ - http://github.com/mattt
67
+ - http://twitter.com/mattt
68
+ - m@mattt.me
69
+
70
+ ## License
71
+
72
+ Venice is available under the MIT license. See the LICENSE file for more info.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler/setup'
2
+
3
+ gemspec = eval(File.read("venice.gemspec"))
4
+
5
+ task :build => "#{gemspec.full_name}.gem"
6
+
7
+ file "#{gemspec.full_name}.gem" => gemspec.files + ["venice.gemspec"] do
8
+ system "gem build venice.gemspec"
9
+ end
data/bin/iap ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'venice'
4
+
5
+
6
+ require 'commander/import'
7
+ require 'terminal-table'
8
+
9
+
10
+ HighLine.track_eof = false # Fix for built-in Ruby
11
+ Signal.trap("INT") {} # Suppress backtrace when exiting command
12
+
13
+ program :version, Venice::VERSION
14
+ program :description, 'A command-line interface for verifying Apple In-App Purchase receipts'
15
+
16
+ program :help, 'Author', 'Mattt Thompson <m@mattt.me>'
17
+ program :help, 'Website', 'https://github.com/mattt'
18
+ program :help_formatter, :compact
19
+
20
+ default_command :help
21
+
22
+ command :verify do |c|
23
+ c.syntax = 'iap verify RECEIPT'
24
+ c.summary = 'Verifies an In-App Purchase Receipt'
25
+ c.description = ''
26
+ c.option '-S', '--[no-]sandbox', 'Use sandbox verification webservice'
27
+ c.option '-p', '--secret SECRET', 'Use a shared secret for auto-renewable subscription receipts'
28
+
29
+ c.example 'description', 'iap verify /path/to/receipt [--secret shared_secret]'
30
+
31
+ c.action do |args, options|
32
+ say_error "Missing receipt argument" and abort unless file = args.first
33
+ say_error "Receipt file does not exist" unless File.exist?(file)
34
+
35
+ client = options.sandbox ? Venice::Client.development : Venice::Client.production
36
+ client.shared_secret = options.secret if options.secret
37
+
38
+ begin
39
+ receipt = client.verify!(File.read(file))
40
+
41
+ table = Terminal::Table.new :title => "Receipt" do |t|
42
+ hash = receipt.to_h
43
+ hash.keys.sort.each do |key|
44
+ next if key == :in_app
45
+ t << [key, hash[key]]
46
+ end
47
+
48
+ if hash[:in_app]
49
+ index = 0
50
+ hash[:in_app].each do |iap|
51
+ index += 1
52
+ t << :separator
53
+ t << [:in_app, index]
54
+ iap.keys.sort.each do |key|
55
+ t << [" - #{key}", iap[key]]
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ puts table
62
+
63
+ rescue => error
64
+ say_error error.message and abort
65
+ end
66
+ end
67
+ end
data/lib/venice.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'venice/version'
2
+ require 'venice/client'
3
+ require 'venice/in_app_receipt'
4
+ require 'venice/receipt'
@@ -0,0 +1,70 @@
1
+ require 'json'
2
+ require 'net/https'
3
+ require 'uri'
4
+
5
+ module Venice
6
+ ITUNES_PRODUCTION_RECEIPT_VERIFICATION_ENDPOINT = "https://buy.itunes.apple.com/verifyReceipt"
7
+ ITUNES_DEVELOPMENT_RECEIPT_VERIFICATION_ENDPOINT = "https://sandbox.itunes.apple.com/verifyReceipt"
8
+
9
+ class Client
10
+ attr_accessor :verification_url
11
+ attr_writer :shared_secret
12
+
13
+ class << self
14
+ def development
15
+ client = self.new
16
+ client.verification_url = ITUNES_DEVELOPMENT_RECEIPT_VERIFICATION_ENDPOINT
17
+ client
18
+ end
19
+
20
+ def production
21
+ client = self.new
22
+ client.verification_url = ITUNES_PRODUCTION_RECEIPT_VERIFICATION_ENDPOINT
23
+ client
24
+ end
25
+ end
26
+
27
+ def initialize
28
+ @verification_url = ENV['IAP_VERIFICATION_ENDPOINT']
29
+ end
30
+
31
+ def verify!(data, options = {})
32
+ @verification_url ||= ITUNES_DEVELOPMENT_RECEIPT_VERIFICATION_ENDPOINT
33
+ self.shared_secret = options.fetch(:shared_secret, nil)
34
+
35
+ json = json_response_from_verifying_data(data)
36
+ status, receipt_attributes = json['status'].to_i, json['receipt']
37
+
38
+ case status
39
+ when 0, 21006
40
+ return Receipt.new(json)
41
+ else
42
+ raise Receipt::VerificationError.new(status, receipt_attributes)
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def json_response_from_verifying_data(data)
49
+ parameters = {
50
+ 'receipt-data' => data
51
+ }
52
+
53
+ parameters['password'] = @shared_secret if @shared_secret
54
+
55
+ uri = URI(@verification_url)
56
+ http = Net::HTTP.new(uri.host, uri.port)
57
+ http.use_ssl = true
58
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
59
+
60
+ request = Net::HTTP::Post.new(uri.request_uri)
61
+ request['Accept'] = "application/json"
62
+ request['Content-Type'] = "application/json"
63
+ request.body = parameters.to_json
64
+
65
+ response = http.request(request)
66
+
67
+ JSON.parse(response.body)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,101 @@
1
+ require 'time'
2
+
3
+ module Venice
4
+ class InAppReceipt
5
+ # For detailed explanations on these keys/values, see
6
+ # https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW12
7
+
8
+ # The number of items purchased. This value corresponds to the quantity property of
9
+ # the SKPayment object stored in the transaction’s payment property.
10
+ attr_reader :quantity
11
+
12
+ # The product identifier of the item that was purchased. This value corresponds to
13
+ # the productIdentifier property of the SKPayment object stored in the transaction’s
14
+ # payment property.
15
+ attr_reader :product_id
16
+
17
+ # The transaction identifier of the item that was purchased. This value corresponds
18
+ # to the transaction’s transactionIdentifier property.
19
+ attr_reader :transaction_id
20
+
21
+ # The date and time this transaction occurred. This value corresponds to the
22
+ # transaction’s transactionDate property.
23
+ attr_reader :purchase_date
24
+
25
+ # A string that the App Store uses to uniquely identify the application that created
26
+ # the payment transaction. If your server supports multiple applications, you can use
27
+ # this value to differentiate between them. Applications that are executing in the
28
+ # sandbox do not yet have an app-item-id assigned to them, so this key is missing from
29
+ # receipts created by the sandbox.
30
+ attr_reader :app_item_id
31
+
32
+ # An arbitrary number that uniquely identifies a revision of your application. This key
33
+ # is missing in receipts created by the sandbox.
34
+ attr_reader :version_external_identifier
35
+
36
+ # For a transaction that restores a previous transaction, this is the original receipt
37
+ attr_accessor :original
38
+
39
+ # For auto-renewable subscriptions, returns the date the subscription will expire
40
+ attr_reader :expires_date
41
+
42
+ attr_reader :web_order_line_item_id
43
+
44
+ # For a transaction that was canceled by Apple customer support, the time and date of the cancellation.
45
+ attr_reader :cancellation_at
46
+
47
+
48
+ def initialize(attributes = {})
49
+ @quantity = Integer(attributes['quantity']) if attributes['quantity']
50
+ @product_id = attributes['product_id']
51
+ @transaction_id = attributes['transaction_id']
52
+ @purchase_date = DateTime.parse(
53
+ attributes['purchase_date']
54
+ ) if attributes['purchase_date']
55
+ @app_item_id = attributes['app_item_id']
56
+ @web_order_line_item_id = attributes['web_order_line_item_id']
57
+ @version_external_identifier = attributes['version_external_identifier']
58
+
59
+ # expires_date is in ms since the Epoch, Time.at expects seconds
60
+ @expires_date = DateTime.parse(attributes['expires_date']) if attributes['expires_date']
61
+ # cancellation_date is in ms since the Epoch, Time.at expects seconds
62
+ @cancellation_date = DateTime.parse(attributes['cancellation_date']) if attributes['cancellation_date']
63
+
64
+ if attributes['original_transaction_id'] || attributes['original_purchase_date']
65
+ original_attributes = {
66
+ 'transaction_id' => attributes['original_transaction_id'],
67
+ 'purchase_date' => attributes['original_purchase_date']
68
+ }
69
+
70
+ self.original = InAppReceipt.new(original_attributes)
71
+ end
72
+
73
+ end
74
+
75
+ def to_hash
76
+ {
77
+ :quantity => @quantity,
78
+ :product_id => @product_id,
79
+ :transaction_id => @transaction_id,
80
+ :purchase_date => (@purchase_date.httpdate rescue nil),
81
+ :original_transaction_id => (@original.transaction_id rescue nil),
82
+ :original_purchase_date => (@original.purchase_date.httpdate rescue nil),
83
+ :app_item_id => @app_item_id,
84
+ :web_order_line_item_id => @web_order_line_item_id,
85
+ :version_external_identifier => @version_external_identifier,
86
+ :expires_date => (@expires_date.httpdate rescue nil),
87
+ :cancellation_at => (@cancellation_at.httpdate rescue nil)
88
+ }
89
+ end
90
+ alias_method :to_h, :to_hash
91
+
92
+ def to_json
93
+ self.to_hash.to_json
94
+ end
95
+
96
+ def expired?
97
+ !!(expires_date && expires_date < DateTime.now)
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,171 @@
1
+ require 'time'
2
+
3
+ module Venice
4
+ class Receipt
5
+ # For detailed explanations on these keys/values, see
6
+ # https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1
7
+
8
+ # The app’s bundle identifier.
9
+ attr_reader :bundle_id
10
+
11
+ # The app’s version number.
12
+ attr_reader :application_version
13
+
14
+ # The receipt for an in-app purchase.
15
+ attr_reader :in_app
16
+
17
+ # The version of the app that was originally purchased.
18
+ attr_reader :original_application_version
19
+
20
+ # The original purchase date
21
+ attr_reader :original_purchase_date
22
+
23
+ # The date that the app receipt expires.
24
+ attr_reader :expires_date
25
+
26
+ # Non-Documented receipt keys/values
27
+ attr_reader :receipt_type
28
+ attr_reader :adam_id
29
+ attr_reader :download_id
30
+ attr_reader :requested_at
31
+
32
+ attr_reader :version_external_identifier
33
+ attr_reader :app_item_id
34
+
35
+
36
+ attr_reader :latest_receipt
37
+ attr_reader :latest_receipt_info
38
+
39
+ def initialize(json = {})
40
+ attributes = json['receipt']
41
+ @bundle_id = attributes['bundle_id']
42
+ @application_version = attributes['application_version']
43
+ @original_application_version = attributes['original_application_version']
44
+ if attributes['original_purchase_date']
45
+ @original_purchase_date = DateTime.parse(
46
+ attributes['original_purchase_date']
47
+ )
48
+ end
49
+ if attributes['expiration_date']
50
+ @expires_date = DateTime.parse(attributes['expiration_date'])
51
+ end
52
+ if attributes['request_date']
53
+ @requested_at = DateTime.parse(attributes['request_date'])
54
+ end
55
+
56
+ @receipt_type = attributes['receipt_type']
57
+ @adam_id = attributes['adam_id']
58
+ @download_id = attributes['download_id']
59
+ @version_external_identifier = attributes['version_external_identifier']
60
+ @app_item_id = attributes['app_item_id']
61
+
62
+ @in_app = if attributes['in_app']
63
+ attributes['in_app'].map{ |attr| InAppReceipt.new(attr) }
64
+ else
65
+ []
66
+ end
67
+
68
+ @latest_receipt_info = if json['latest_receipt_info']
69
+ json['latest_receipt_info'].map{ |lri| InAppReceipt.new(lri) }
70
+ else
71
+ []
72
+ end
73
+
74
+ @latest_receipt = json['latest_receipt']
75
+ end
76
+
77
+ def to_hash
78
+ {
79
+ bundle_id: @bundle_id,
80
+ application_version: @application_version,
81
+ original_application_version: @original_application_version,
82
+ original_purchase_date: (@original_purchase_date.httpdate rescue nil),
83
+ expires_date: (@expires_date.httpdate rescue nil),
84
+ receipt_type: @receipt_type,
85
+ adam_id: @adam_id,
86
+ download_id: @download_id,
87
+ requested_at: (@requested_at.httpdate rescue nil),
88
+ version_external_identifier: @version_external_identifier,
89
+ app_item_id: @app_item_id,
90
+ in_app: @in_app.map{|iap| iap.to_h },
91
+ latest_receipt: @latest_receipt,
92
+ latest_receipt_info: @latest_receipt_info.map{|lri| lri.to_h }
93
+ }
94
+ end
95
+ alias_method :to_h, :to_hash
96
+
97
+ def to_json
98
+ self.to_hash.to_json
99
+ end
100
+
101
+ def expired?
102
+ return false if expires_date && expires_date > DateTime.now
103
+ return false if expires_date.nil? && in_app.empty? && latest_receipt_info.empty?
104
+ return false if !in_app.empty? && in_app.any?{ |rec| !rec.expired? }
105
+ return false if !latest_receipt_info.empty? && latest_receipt_info.any?{ |rec| !rec.expired? }
106
+ true
107
+ end
108
+
109
+
110
+ class << self
111
+ def verify(data, options = {})
112
+ verify!(data, options) rescue false
113
+ end
114
+
115
+ def verify!(data, options = {})
116
+ client = Client.production
117
+
118
+ begin
119
+ client.verify!(data, options)
120
+ rescue VerificationError => error
121
+ case error.code
122
+ when 21007
123
+ client = Client.development
124
+ retry
125
+ when 21008
126
+ client = Client.production
127
+ retry
128
+ else
129
+ raise error
130
+ end
131
+ end
132
+ end
133
+
134
+ alias :validate :verify
135
+ alias :validate! :verify!
136
+ end
137
+
138
+ class VerificationError < StandardError
139
+ attr_accessor :code
140
+ attr_accessor :receipt
141
+
142
+ def initialize(code, receipt=nil)
143
+ @code = Integer(code)
144
+ @receipt = receipt if receipt
145
+ end
146
+
147
+ def message
148
+ case @code
149
+ when 21000
150
+ "The App Store could not read the JSON object you provided."
151
+ when 21002
152
+ "The data in the receipt-data property was malformed."
153
+ when 21003
154
+ "The receipt could not be authenticated."
155
+ when 21004
156
+ "The shared secret you provided does not match the shared secret on file for your account."
157
+ when 21005
158
+ "The receipt server is not currently available."
159
+ when 21006
160
+ "This receipt is valid but the subscription has expired. When this status code is returned to your server, the receipt data is also decoded and returned as part of the response."
161
+ when 21007
162
+ "This receipt is a sandbox receipt, but it was sent to the production service for verification."
163
+ when 21008
164
+ "This receipt is a production receipt, but it was sent to the sandbox service for verification."
165
+ else
166
+ "Unknown Error: #{@code}"
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,3 @@
1
+ module Venice
2
+ VERSION = "0.3.1.paperlesspost"
3
+ end
Binary file
data/venice.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "venice/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "venice-bnet"
7
+ s.authors = ["Mattt Thompson"]
8
+ s.email = "m@mattt.me"
9
+ s.license = "MIT"
10
+ s.homepage = "http://nomad-cli.com"
11
+ s.version = Venice::VERSION
12
+ s.platform = Gem::Platform::RUBY
13
+ s.summary = "iTunes In-App Purchase Receipt Verification"
14
+ s.description = ""
15
+
16
+ s.add_dependency "json"
17
+ s.add_dependency "commander", "~> 4.1"
18
+ s.add_dependency "terminal-table", "~> 1.4"
19
+
20
+ s.add_development_dependency "rspec", "~> 2.99.0"
21
+ s.add_development_dependency "rake"
22
+ s.add_development_dependency "simplecov"
23
+
24
+ s.files = Dir["./**/*"].reject { |file| file =~ /\.\/(bin|log|pkg|script|spec|test|vendor)/ }
25
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
26
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
27
+ s.require_paths = ["lib"]
28
+ end
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: venice-bnet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1.paperlesspost
5
+ platform: ruby
6
+ authors:
7
+ - Mattt Thompson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: commander
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: terminal-table
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.4'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 2.99.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 2.99.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: ''
98
+ email: m@mattt.me
99
+ executables:
100
+ - iap
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - "./Gemfile"
105
+ - "./Gemfile.lock"
106
+ - "./LICENSE"
107
+ - "./README.md"
108
+ - "./Rakefile"
109
+ - "./lib/venice.rb"
110
+ - "./lib/venice/client.rb"
111
+ - "./lib/venice/in_app_receipt.rb"
112
+ - "./lib/venice/receipt.rb"
113
+ - "./lib/venice/version.rb"
114
+ - "./venice-0.3.1.paperlesspost.gem"
115
+ - "./venice.gemspec"
116
+ - bin/iap
117
+ homepage: http://nomad-cli.com
118
+ licenses:
119
+ - MIT
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">"
133
+ - !ruby/object:Gem::Version
134
+ version: 1.3.1
135
+ requirements: []
136
+ rubyforge_project:
137
+ rubygems_version: 2.4.5
138
+ signing_key:
139
+ specification_version: 4
140
+ summary: iTunes In-App Purchase Receipt Verification
141
+ test_files: []