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 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