rack-in-app-purchase 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +3 -1
- data/Gemfile.lock +36 -18
- data/LICENSE +1 -1
- data/README.md +51 -27
- data/Rakefile +7 -5
- data/lib/rack/in-app-purchase.rb +13 -9
- data/lib/rack/in-app-purchase/migrations/001_base_schema.rb +4 -2
- data/lib/rack/in-app-purchase/migrations/002_add_full_text_search.rb +12 -10
- data/lib/rack/in-app-purchase/models/product.rb +7 -5
- data/lib/rack/in-app-purchase/models/receipt.rb +7 -5
- data/lib/rack/in-app-purchase/version.rb +7 -0
- data/rack-in-app-purchase.gemspec +21 -18
- metadata +52 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 800d24126270b0069b1a8af9280d7a9c1d5df5e3
|
4
|
+
data.tar.gz: 065c78299480e99d254d67703f32a98072e027be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96d5b1aa9ed64067fa71f0b3c9c0a7c247cad4e3f22583b19d48f313c4dc59db443de311717d4b81ee406827908c1b57736e82c59b7f26ac841ca286b6d0189c
|
7
|
+
data.tar.gz: c62e51f9de889e86bb0cdb9e577b062833e532edb8ca35f5412e702c0ff18225f52051177ac8af62c15a1a8a0066e91ebca53b225d98a18208a44a042c2c6047
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rack-in-app-purchase (0.
|
5
|
-
rack (~> 1.4)
|
4
|
+
rack-in-app-purchase (0.2.0)
|
5
|
+
rack (~> 1.4, < 2.0.0)
|
6
6
|
sequel (~> 3.37)
|
7
7
|
sinatra (~> 1.3)
|
8
8
|
venice
|
@@ -10,23 +10,38 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
commander (4.
|
14
|
-
highline (~>
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
rack
|
13
|
+
commander (4.4.7)
|
14
|
+
highline (~> 2.0.0)
|
15
|
+
diff-lcs (1.3)
|
16
|
+
highline (2.0.2)
|
17
|
+
json (2.2.0)
|
18
|
+
rack (1.6.11)
|
19
|
+
rack-protection (1.5.5)
|
19
20
|
rack
|
20
|
-
rake (
|
21
|
-
rspec (
|
21
|
+
rake (12.3.2)
|
22
|
+
rspec (3.8.0)
|
23
|
+
rspec-core (~> 3.8.0)
|
24
|
+
rspec-expectations (~> 3.8.0)
|
25
|
+
rspec-mocks (~> 3.8.0)
|
26
|
+
rspec-core (3.8.2)
|
27
|
+
rspec-support (~> 3.8.0)
|
28
|
+
rspec-expectations (3.8.4)
|
29
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
30
|
+
rspec-support (~> 3.8.0)
|
31
|
+
rspec-mocks (3.8.1)
|
32
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
33
|
+
rspec-support (~> 3.8.0)
|
34
|
+
rspec-support (3.8.2)
|
22
35
|
sequel (3.48.0)
|
23
|
-
sinatra (1.4.
|
24
|
-
rack (~> 1.
|
36
|
+
sinatra (1.4.8)
|
37
|
+
rack (~> 1.5)
|
25
38
|
rack-protection (~> 1.4)
|
26
|
-
tilt (
|
27
|
-
terminal-table (1.
|
28
|
-
|
29
|
-
|
39
|
+
tilt (>= 1.3, < 3)
|
40
|
+
terminal-table (1.8.0)
|
41
|
+
unicode-display_width (~> 1.1, >= 1.1.1)
|
42
|
+
tilt (2.0.9)
|
43
|
+
unicode-display_width (1.6.0)
|
44
|
+
venice (0.5.0)
|
30
45
|
commander (~> 4.1)
|
31
46
|
json
|
32
47
|
terminal-table (~> 1.4)
|
@@ -36,5 +51,8 @@ PLATFORMS
|
|
36
51
|
|
37
52
|
DEPENDENCIES
|
38
53
|
rack-in-app-purchase!
|
39
|
-
rake
|
40
|
-
rspec
|
54
|
+
rake
|
55
|
+
rspec
|
56
|
+
|
57
|
+
BUNDLED WITH
|
58
|
+
2.0.1
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,24 +1,38 @@
|
|
1
1
|
# Rack::InAppPurchase
|
2
2
|
|
3
|
-
Rack::InAppPurchase is Rack middleware that
|
3
|
+
Rack::InAppPurchase is Rack middleware that
|
4
|
+
manages products for in-app-purchases and verifies receipts.
|
5
|
+
Verifying receipts on the server guards against unauthorized use of paid content,
|
6
|
+
as well as providing real-time metrics on purchase history and usage.
|
4
7
|
|
5
8
|
Rack::InAppPurchase provides the following endpoints:
|
6
9
|
|
7
|
-
- `GET /products/identifiers`:
|
8
|
-
|
10
|
+
- `GET /products/identifiers`:
|
11
|
+
Returns a JSON array of product identifiers from the database
|
12
|
+
- `POST /receipts/verify`:
|
13
|
+
Verifies a receipt using Apple's receipt verification web service,
|
14
|
+
registers the receipt in the database,
|
15
|
+
and returns the receipt.
|
9
16
|
|
10
17
|
## Installation
|
11
18
|
|
12
|
-
|
19
|
+
### Gemfile
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
gem 'rack-in-app-purchase', require: 'rack/in-app-purchase'
|
23
|
+
```
|
13
24
|
|
14
25
|
## Requirements
|
15
26
|
|
16
|
-
- Ruby 1.9
|
17
|
-
- PostgreSQL 9.1
|
27
|
+
- Ruby 1.9 or higher
|
28
|
+
- PostgreSQL 9.1 or higher
|
18
29
|
|
19
|
-
##
|
30
|
+
## Usage
|
20
31
|
|
21
|
-
Rack::InAppPurchase can be run as Rack middleware or as a single web application.
|
32
|
+
Rack::InAppPurchase can be run as Rack middleware or as a single web application.
|
33
|
+
All that's required is a connection to a Postgres database.
|
34
|
+
|
35
|
+
An example application can be found in the `/example` directory of this repository.
|
22
36
|
|
23
37
|
### config.ru
|
24
38
|
|
@@ -46,7 +60,7 @@ NSData *httpBody = [params dataUsingEncoding:NSUTF8StringEncoding];
|
|
46
60
|
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
|
47
61
|
if (httpResponse.statusCode == 200) {
|
48
62
|
id receipt = [NSJSONSerialization JSONObjectWithData:data
|
49
|
-
options:0
|
63
|
+
options:0
|
50
64
|
error:nil];
|
51
65
|
NSLog(@"Received receipt: %@", receipt);
|
52
66
|
} else {
|
@@ -58,29 +72,39 @@ NSData *httpBody = [params dataUsingEncoding:NSUTF8StringEncoding];
|
|
58
72
|
|
59
73
|
### `curl`
|
60
74
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
75
|
+
```terminal
|
76
|
+
$ curl -X POST -i -d "receipt-data=(Base64-Encoded String)" https://your-webservice-url.com/verifyReceipt
|
77
|
+
|
78
|
+
HTTP/1.1 203 Non-Authoritative Information
|
79
|
+
Content-Type: application/json;charset=utf-8
|
80
|
+
Content-Length: 365
|
81
|
+
Connection: keep-alive
|
82
|
+
Server: thin 1.5.0 codename Knife
|
83
|
+
|
84
|
+
{
|
85
|
+
"status": 0,
|
86
|
+
"receipt": {
|
87
|
+
"quantity": 1,
|
88
|
+
"product_id": "com.example.download",
|
89
|
+
"transaction_id": "1000000000000001",
|
90
|
+
"purchase_date": "Mon, 01 Jan 2013 12:00:00 GMT",
|
91
|
+
"original_transaction_id": "1000000000000001",
|
92
|
+
"original_purchase_date": "Mon, 01 Jan 2013 12:00:00 GMT",
|
93
|
+
"app_item_id": null,
|
94
|
+
"version_external_identifier": null,
|
95
|
+
"bid": "com.example.app",
|
96
|
+
"bvrs": "123456789"
|
97
|
+
}
|
98
|
+
}
|
99
|
+
```
|
73
100
|
|
74
101
|
---
|
75
102
|
|
76
103
|
## Contact
|
77
104
|
|
78
|
-
Mattt
|
79
|
-
|
80
|
-
- http://github.com/mattt
|
81
|
-
- http://twitter.com/mattt
|
82
|
-
- m@mattt.me
|
105
|
+
[Mattt](https://twitter.com/mattt)
|
83
106
|
|
84
107
|
## License
|
85
108
|
|
86
|
-
Rack::InAppPurchase is available under the MIT license.
|
109
|
+
Rack::InAppPurchase is available under the MIT license.
|
110
|
+
See the LICENSE file for more info.
|
data/Rakefile
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler'
|
2
4
|
Bundler.setup
|
3
5
|
|
4
|
-
gemspec = eval(File.read(
|
6
|
+
gemspec = eval(File.read('rack-in-app-purchase.gemspec'))
|
5
7
|
|
6
|
-
task :
|
8
|
+
task build: 'rack-in-app-purchase.gem'
|
7
9
|
|
8
|
-
file
|
9
|
-
system
|
10
|
+
file 'rack-in-app-purchase.gem' => gemspec.files + ['rack-in-app-purchase.gemspec'] do
|
11
|
+
system 'gem build rack-in-app-purchase.gemspec'
|
10
12
|
end
|
data/lib/rack/in-app-purchase.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rack'
|
2
4
|
require 'rack/contrib'
|
3
5
|
|
4
6
|
require 'sinatra/base'
|
5
7
|
require 'sinatra/param'
|
6
|
-
require 'rack'
|
7
8
|
|
8
9
|
require 'sequel'
|
9
|
-
|
10
10
|
require 'venice'
|
11
11
|
|
12
12
|
module Rack
|
@@ -24,7 +24,7 @@ module Rack
|
|
24
24
|
|
25
25
|
if ENV['DATABASE_URL']
|
26
26
|
DB = Sequel.connect(ENV['DATABASE_URL'])
|
27
|
-
Sequel::Migrator.run(DB, ::File.join(::File.dirname(__FILE__),
|
27
|
+
Sequel::Migrator.run(DB, ::File.join(::File.dirname(__FILE__), 'in-app-purchase/migrations'), table: 'in_app_purchase_schema_info')
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -44,20 +44,24 @@ module Rack
|
|
44
44
|
begin
|
45
45
|
receipt = Venice::Receipt.verify!(params[:'receipt-data'])
|
46
46
|
|
47
|
-
Receipt.create({ip_address: request.ip}.merge(receipt.to_h))
|
47
|
+
Receipt.create({ ip_address: request.ip }.merge(receipt.to_h))
|
48
48
|
|
49
|
-
content =
|
49
|
+
content = begin
|
50
|
+
settings.content_callback.call(receipt)
|
51
|
+
rescue StandardError
|
52
|
+
nil
|
53
|
+
end
|
50
54
|
|
51
55
|
{
|
52
56
|
status: 0,
|
53
57
|
receipt: receipt.to_h,
|
54
58
|
content: content
|
55
|
-
}.select{|
|
56
|
-
rescue Venice::Receipt::VerificationError =>
|
59
|
+
}.select { |_k, v| v }.to_json
|
60
|
+
rescue Venice::Receipt::VerificationError => e
|
57
61
|
{
|
58
|
-
status:
|
62
|
+
status: e.message
|
59
63
|
}.to_json
|
60
|
-
rescue
|
64
|
+
rescue StandardError
|
61
65
|
halt 500
|
62
66
|
end
|
63
67
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
Sequel.migration do
|
2
4
|
up do
|
3
5
|
create_table :in_app_purchase_products do
|
@@ -9,7 +11,7 @@ Sequel.migration do
|
|
9
11
|
column :description, :varchar
|
10
12
|
column :price, :float8
|
11
13
|
column :price_locale, :varchar
|
12
|
-
column :is_enabled, :boolean,
|
14
|
+
column :is_enabled, :boolean, default: true
|
13
15
|
|
14
16
|
index :product_identifier
|
15
17
|
index :type
|
@@ -36,7 +38,7 @@ Sequel.migration do
|
|
36
38
|
index :app_item_id
|
37
39
|
end
|
38
40
|
end
|
39
|
-
|
41
|
+
|
40
42
|
down do
|
41
43
|
drop_table :in_app_purchase_products
|
42
44
|
drop_table :in_app_purchase_receipts
|
@@ -1,18 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
Sequel.migration do
|
2
4
|
up do
|
3
5
|
add_column :in_app_purchase_products, :tsv, 'TSVector'
|
4
|
-
add_index :in_app_purchase_products, :tsv, type:
|
5
|
-
create_trigger :in_app_purchase_products, :tsv, :tsvector_update_trigger,
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
add_index :in_app_purchase_products, :tsv, type: 'GIN'
|
7
|
+
create_trigger :in_app_purchase_products, :tsv, :tsvector_update_trigger,
|
8
|
+
args: %i[tsv pg_catalog.english product_identifier type title description],
|
9
|
+
events: %i[insert update],
|
10
|
+
each_row: true
|
9
11
|
|
10
12
|
add_column :in_app_purchase_receipts, :tsv, 'TSVector'
|
11
|
-
add_index :in_app_purchase_receipts, :tsv, type:
|
12
|
-
create_trigger :in_app_purchase_receipts, :tsv, :tsvector_update_trigger,
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
add_index :in_app_purchase_receipts, :tsv, type: 'GIN'
|
14
|
+
create_trigger :in_app_purchase_receipts, :tsv, :tsvector_update_trigger,
|
15
|
+
args: %i[tsv pg_catalog.english product_id transaction_id app_item_id],
|
16
|
+
events: %i[insert update],
|
17
|
+
each_row: true
|
16
18
|
end
|
17
19
|
|
18
20
|
down do
|
@@ -1,20 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Rack
|
2
4
|
class InAppPurchase
|
3
5
|
class Product < Sequel::Model
|
4
|
-
TYPES = [
|
6
|
+
TYPES = ['Consumable', 'Non-Consumable', 'Free Subscription', 'Auto-Renewable Subscription', 'Non-Renewable Subscription'].freeze
|
5
7
|
|
6
|
-
plugin :json_serializer, naked: true, except: :id
|
8
|
+
plugin :json_serializer, naked: true, except: :id
|
7
9
|
plugin :validation_helpers
|
8
10
|
plugin :timestamps, force: true, update_on_create: true
|
9
|
-
|
11
|
+
|
10
12
|
self.dataset = :in_app_purchase_products
|
11
13
|
self.strict_param_setting = false
|
12
14
|
self.raise_on_save_failure = false
|
13
15
|
|
14
16
|
def validate
|
15
17
|
super
|
16
|
-
|
17
|
-
validates_presence [
|
18
|
+
|
19
|
+
validates_presence %i[product_identifier title description price price_locale]
|
18
20
|
validates_numeric :price
|
19
21
|
validates_includes TYPES, :type
|
20
22
|
end
|
@@ -1,18 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Rack
|
2
|
-
class InAppPurchase
|
4
|
+
class InAppPurchase
|
3
5
|
class Receipt < Sequel::Model
|
4
|
-
plugin :json_serializer, naked: true, except: :id
|
6
|
+
plugin :json_serializer, naked: true, except: :id
|
5
7
|
plugin :validation_helpers
|
6
8
|
plugin :timestamps, force: true
|
7
|
-
|
9
|
+
|
8
10
|
self.dataset = :in_app_purchase_receipts
|
9
11
|
self.strict_param_setting = false
|
10
12
|
self.raise_on_save_failure = false
|
11
13
|
|
12
14
|
def validate
|
13
15
|
super
|
14
|
-
|
15
|
-
validates_presence [
|
16
|
+
|
17
|
+
validates_presence %i[product_id transaction_id purchase_date]
|
16
18
|
validates_unique :transaction_id
|
17
19
|
end
|
18
20
|
end
|
@@ -1,26 +1,29 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
4
|
+
require 'rack/in-app-purchase/version'
|
3
5
|
|
4
6
|
Gem::Specification.new do |s|
|
5
|
-
s.name =
|
6
|
-
s.authors = [
|
7
|
-
s.email =
|
8
|
-
s.
|
9
|
-
s.
|
7
|
+
s.name = 'rack-in-app-purchase'
|
8
|
+
s.authors = ['Mattt']
|
9
|
+
s.email = 'mattt@me.com'
|
10
|
+
s.license = 'MIT'
|
11
|
+
s.homepage = 'https://mat.tt'
|
12
|
+
s.version = Rack::InAppPurchase::VERSION
|
10
13
|
s.platform = Gem::Platform::RUBY
|
11
|
-
s.summary =
|
12
|
-
s.description =
|
14
|
+
s.summary = 'Rack::InAppPurchase'
|
15
|
+
s.description = 'Rack middleware for in-app purchase receipt verification and product listing.'
|
13
16
|
|
14
|
-
s.add_development_dependency
|
15
|
-
s.add_development_dependency
|
17
|
+
s.add_development_dependency 'rake'
|
18
|
+
s.add_development_dependency 'rspec'
|
16
19
|
|
17
|
-
s.add_dependency
|
18
|
-
s.add_dependency
|
19
|
-
s.add_dependency
|
20
|
-
s.add_dependency
|
20
|
+
s.add_dependency 'rack', '~> 1.4', '< 2.0.0'
|
21
|
+
s.add_dependency 'sequel', '~> 3.37'
|
22
|
+
s.add_dependency 'sinatra', '~> 1.3'
|
23
|
+
s.add_dependency 'venice'
|
21
24
|
|
22
|
-
s.files = Dir[
|
25
|
+
s.files = Dir['./**/*'].reject { |file| file =~ %r{\./(bin|example|log|pkg|script|spec|test|vendor)} }
|
23
26
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
25
|
-
s.require_paths = [
|
27
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
28
|
+
s.require_paths = ['lib']
|
26
29
|
end
|
metadata
CHANGED
@@ -1,119 +1,127 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-in-app-purchase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Mattt
|
7
|
+
- Mattt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rack
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '1.4'
|
48
|
+
- - "<"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 2.0.0
|
48
51
|
type: :runtime
|
49
52
|
prerelease: false
|
50
53
|
version_requirements: !ruby/object:Gem::Requirement
|
51
54
|
requirements:
|
52
|
-
- - ~>
|
55
|
+
- - "~>"
|
53
56
|
- !ruby/object:Gem::Version
|
54
57
|
version: '1.4'
|
58
|
+
- - "<"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 2.0.0
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
62
|
+
name: sequel
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
58
64
|
requirements:
|
59
|
-
- - ~>
|
65
|
+
- - "~>"
|
60
66
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
67
|
+
version: '3.37'
|
62
68
|
type: :runtime
|
63
69
|
prerelease: false
|
64
70
|
version_requirements: !ruby/object:Gem::Requirement
|
65
71
|
requirements:
|
66
|
-
- - ~>
|
72
|
+
- - "~>"
|
67
73
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
74
|
+
version: '3.37'
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
76
|
+
name: sinatra
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
72
78
|
requirements:
|
73
|
-
- - ~>
|
79
|
+
- - "~>"
|
74
80
|
- !ruby/object:Gem::Version
|
75
|
-
version: '3
|
81
|
+
version: '1.3'
|
76
82
|
type: :runtime
|
77
83
|
prerelease: false
|
78
84
|
version_requirements: !ruby/object:Gem::Requirement
|
79
85
|
requirements:
|
80
|
-
- - ~>
|
86
|
+
- - "~>"
|
81
87
|
- !ruby/object:Gem::Version
|
82
|
-
version: '3
|
88
|
+
version: '1.3'
|
83
89
|
- !ruby/object:Gem::Dependency
|
84
90
|
name: venice
|
85
91
|
requirement: !ruby/object:Gem::Requirement
|
86
92
|
requirements:
|
87
|
-
- -
|
93
|
+
- - ">="
|
88
94
|
- !ruby/object:Gem::Version
|
89
95
|
version: '0'
|
90
96
|
type: :runtime
|
91
97
|
prerelease: false
|
92
98
|
version_requirements: !ruby/object:Gem::Requirement
|
93
99
|
requirements:
|
94
|
-
- -
|
100
|
+
- - ">="
|
95
101
|
- !ruby/object:Gem::Version
|
96
102
|
version: '0'
|
97
103
|
description: Rack middleware for in-app purchase receipt verification and product
|
98
104
|
listing.
|
99
|
-
email:
|
105
|
+
email: mattt@me.com
|
100
106
|
executables: []
|
101
107
|
extensions: []
|
102
108
|
extra_rdoc_files: []
|
103
109
|
files:
|
104
|
-
- ./Gemfile
|
105
|
-
- ./Gemfile.lock
|
106
|
-
- ./
|
107
|
-
- ./
|
108
|
-
- ./
|
109
|
-
- ./lib/rack/in-app-purchase
|
110
|
-
- ./lib/rack/in-app-purchase.rb
|
111
|
-
- ./
|
112
|
-
- ./rack
|
113
|
-
- ./
|
114
|
-
- ./
|
115
|
-
|
116
|
-
|
110
|
+
- "./Gemfile"
|
111
|
+
- "./Gemfile.lock"
|
112
|
+
- "./LICENSE"
|
113
|
+
- "./README.md"
|
114
|
+
- "./Rakefile"
|
115
|
+
- "./lib/rack/in-app-purchase.rb"
|
116
|
+
- "./lib/rack/in-app-purchase/migrations/001_base_schema.rb"
|
117
|
+
- "./lib/rack/in-app-purchase/migrations/002_add_full_text_search.rb"
|
118
|
+
- "./lib/rack/in-app-purchase/models/product.rb"
|
119
|
+
- "./lib/rack/in-app-purchase/models/receipt.rb"
|
120
|
+
- "./lib/rack/in-app-purchase/version.rb"
|
121
|
+
- "./rack-in-app-purchase.gemspec"
|
122
|
+
homepage: https://mat.tt
|
123
|
+
licenses:
|
124
|
+
- MIT
|
117
125
|
metadata: {}
|
118
126
|
post_install_message:
|
119
127
|
rdoc_options: []
|
@@ -121,17 +129,17 @@ require_paths:
|
|
121
129
|
- lib
|
122
130
|
required_ruby_version: !ruby/object:Gem::Requirement
|
123
131
|
requirements:
|
124
|
-
- -
|
132
|
+
- - ">="
|
125
133
|
- !ruby/object:Gem::Version
|
126
134
|
version: '0'
|
127
135
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
136
|
requirements:
|
129
|
-
- -
|
137
|
+
- - ">="
|
130
138
|
- !ruby/object:Gem::Version
|
131
139
|
version: '0'
|
132
140
|
requirements: []
|
133
141
|
rubyforge_project:
|
134
|
-
rubygems_version: 2.
|
142
|
+
rubygems_version: 2.6.14
|
135
143
|
signing_key:
|
136
144
|
specification_version: 4
|
137
145
|
summary: Rack::InAppPurchase
|