rack-in-app-purchase 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2e1d58e9b3320639f35b74e05ed46b65e26d1077
4
- data.tar.gz: a4a92dcf91ec412890e0781b667c9b5214e28856
3
+ metadata.gz: 800d24126270b0069b1a8af9280d7a9c1d5df5e3
4
+ data.tar.gz: 065c78299480e99d254d67703f32a98072e027be
5
5
  SHA512:
6
- metadata.gz: ad3a45a96a2015cc7075e72d46502c23ac6c9ee18aa6f75d1d923403ca5df3f9c8b8bfaa3aaaac0ac939e0677c8435971e3c8dfe8cf9a0c228354f399d776c86
7
- data.tar.gz: 5d91be81da2c646f7f2c78285d99b75e16c78dce969d401b4fb37807f4e0fe7bf30024ffb33449a344c5d83bc9ec362ed48755b6d64664c47bf9fd775d7442f5
6
+ metadata.gz: 96d5b1aa9ed64067fa71f0b3c9c0a7c247cad4e3f22583b19d48f313c4dc59db443de311717d4b81ee406827908c1b57736e82c59b7f26ac841ca286b6d0189c
7
+ data.tar.gz: c62e51f9de889e86bb0cdb9e577b062833e532edb8ca35f5412e702c0ff18225f52051177ac8af62c15a1a8a0066e91ebca53b225d98a18208a44a042c2c6047
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  gemspec
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rack-in-app-purchase (0.1.1)
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.1.4)
14
- highline (~> 1.6.11)
15
- highline (1.6.19)
16
- json (1.8.0)
17
- rack (1.5.2)
18
- rack-protection (1.5.0)
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 (0.9.6)
21
- rspec (0.6.4)
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.3)
24
- rack (~> 1.4)
36
+ sinatra (1.4.8)
37
+ rack (~> 1.5)
25
38
  rack-protection (~> 1.4)
26
- tilt (~> 1.3, >= 1.3.4)
27
- terminal-table (1.4.5)
28
- tilt (1.4.1)
29
- venice (0.2.0)
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 (~> 0.9)
40
- rspec (~> 0.6)
54
+ rake
55
+ rspec
56
+
57
+ BUNDLED WITH
58
+ 2.0.1
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 Mattt Thompson (http://mattt.me/)
1
+ Copyright (c) 2013 – 2019 Mattt (https://mat.tt/)
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,24 +1,38 @@
1
1
  # Rack::InAppPurchase
2
2
 
3
- Rack::InAppPurchase is Rack middleware that manages products for in-app-purchases and verifies receipts. Verifying receipts on the server ensures guards against unauthorized use of paid content, as well as providing real-time metrics on purchase history and usage.
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`: Returns a JSON array of product identifiers from the database
8
- - `POST /receipts/verify`: Verifies a receipt using Apple's receipt verification webservice, registers the receipt in the database, and returns the receipt.
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
- $ gem install rack-in-app-purchase
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 running locally ([Postgres.app](http://postgresapp.com) is the easiest way to get a Postgres server running on your Mac)
27
+ - Ruby 1.9 or higher
28
+ - PostgreSQL 9.1 or higher
18
29
 
19
- ## Example Usage
30
+ ## Usage
20
31
 
21
- Rack::InAppPurchase can be run as Rack middleware or as a single web application. All that is required is a connection to a Postgres database.
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
- $ curl -X POST -i -d "receipt-data=(Base64-Encoded String)" https://your-webservice-url.com/verifyReceipt
62
-
63
- HTTP/1.1 203 Non-Authoritative Information
64
- Content-Type: application/json;charset=utf-8
65
- Content-Length: 365
66
- Connection: keep-alive
67
- Server: thin 1.5.0 codename Knife
68
-
69
- {"status":0,"receipt":{"quantity":1,"product_id":"com.example.download","transaction_id":"1000000000000001","purchase_date":"Mon, 01 Jan 2013 12:00:00 GMT","original_transaction_id":"1000000000000001","original_purchase_date":"Mon, 01 Jan 2013 12:00:00 GMT","app_item_id":null,"version_external_identifier":null,"bid":"com.example.app","bvrs":"123456789"}}
70
-
71
- An example application can be found in the `/example` directory of this repository.
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 Thompson
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. See the LICENSE file for more info.
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
- require "bundler"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler'
2
4
  Bundler.setup
3
5
 
4
- gemspec = eval(File.read("rack-in-app-purchase.gemspec"))
6
+ gemspec = eval(File.read('rack-in-app-purchase.gemspec'))
5
7
 
6
- task :build => "rack-in-app-purchase.gem"
8
+ task build: 'rack-in-app-purchase.gem'
7
9
 
8
- file "rack-in-app-purchase.gem" => gemspec.files + ["rack-in-app-purchase.gemspec"] do
9
- system "gem build rack-in-app-purchase.gemspec"
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
@@ -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__), "in-app-purchase/migrations"), table: 'in_app_purchase_schema_info')
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 = settings.content_callback.call(receipt) rescue nil
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{|k,v| v}.to_json
56
- rescue Venice::Receipt::VerificationError => error
59
+ }.select { |_k, v| v }.to_json
60
+ rescue Venice::Receipt::VerificationError => e
57
61
  {
58
- status: error.message
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, default: true
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: "GIN"
5
- create_trigger :in_app_purchase_products, :tsv, :tsvector_update_trigger,
6
- args: [:tsv, :'pg_catalog.english', :product_identifier, :type, :title, :description],
7
- events: [:insert, :update],
8
- each_row: true
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: "GIN"
12
- create_trigger :in_app_purchase_receipts, :tsv, :tsvector_update_trigger,
13
- args: [:tsv, :'pg_catalog.english', :product_id, :transaction_id, :app_item_id],
14
- events: [:insert, :update],
15
- each_row: true
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 = ["Consumable", "Non-Consumable", "Free Subscription", "Auto-Renewable Subscription", "Non-Renewable Subscription"]
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 [:product_identifier, :title, :description, :price, :price_locale]
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 [:product_id, :transaction_id, :purchase_date]
16
+
17
+ validates_presence %i[product_id transaction_id purchase_date]
16
18
  validates_unique :transaction_id
17
19
  end
18
20
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rack
4
+ class InAppPurchase
5
+ VERSION = '0.2.0'
6
+ end
7
+ end
@@ -1,26 +1,29 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
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 = "rack-in-app-purchase"
6
- s.authors = ["Mattt Thompson"]
7
- s.email = "m@mattt.me"
8
- s.homepage = "http://mattt.me"
9
- s.version = '0.1.1'
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 = "Rack::InAppPurchase"
12
- s.description = "Rack middleware for in-app purchase receipt verification and product listing."
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 "rspec", "~> 0.6"
15
- s.add_development_dependency "rake", "~> 0.9"
17
+ s.add_development_dependency 'rake'
18
+ s.add_development_dependency 'rspec'
16
19
 
17
- s.add_dependency "rack", "~> 1.4"
18
- s.add_dependency "sinatra", "~> 1.3"
19
- s.add_dependency "sequel", "~> 3.37"
20
- s.add_dependency "venice"
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["./**/*"].reject { |file| file =~ /\.\/(bin|example|log|pkg|script|spec|test|vendor)/ }
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 = ["lib"]
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.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
- - Mattt Thompson
7
+ - Mattt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-13 00:00:00.000000000 Z
11
+ date: 2019-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rspec
14
+ name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0.6'
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.6'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0.9'
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.9'
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: sinatra
62
+ name: sequel
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
- - - ~>
65
+ - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '1.3'
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: '1.3'
74
+ version: '3.37'
69
75
  - !ruby/object:Gem::Dependency
70
- name: sequel
76
+ name: sinatra
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
- - - ~>
79
+ - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: '3.37'
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.37'
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: m@mattt.me
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
- - ./lib/rack/in-app-purchase/migrations/001_base_schema.rb
107
- - ./lib/rack/in-app-purchase/migrations/002_add_full_text_search.rb
108
- - ./lib/rack/in-app-purchase/models/product.rb
109
- - ./lib/rack/in-app-purchase/models/receipt.rb
110
- - ./lib/rack/in-app-purchase.rb
111
- - ./LICENSE
112
- - ./rack-in-app-purchase.gemspec
113
- - ./Rakefile
114
- - ./README.md
115
- homepage: http://mattt.me
116
- licenses: []
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.0.3
142
+ rubygems_version: 2.6.14
135
143
  signing_key:
136
144
  specification_version: 4
137
145
  summary: Rack::InAppPurchase