power-passbook 0.0.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 56a647ed28b15ef2aa1d17912347f569760c4f08
4
+ data.tar.gz: 7f9b1d96fd075d70f334ce543028e237897f94e0
5
+ SHA512:
6
+ metadata.gz: 09d55639d69ac5d073a1122803df3a978572e0064ceb292fa75260e034bb49aec81557f9be141b750ca40b86aba1ad7176f2c0b668cf158757cfb26a1edf282a
7
+ data.tar.gz: 4ab347f309dbc0bb3cf2fac18cbc3aaef328ae0bfeb829333fd13a5de2e340ff2ed06d02e3ce0744cead6e51717b4cad94a50b88d2af20034964a1b6aab75db7
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ example/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in passbook.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Max Power
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # Passbook
2
+
3
+ This is inspired by [Passifier](https://github.com/paperlesspost/passifier) which i couldn't get to run with p12 signing. So here is my take on iOS Passbook passes. It's used here: https://chefcards.herokuapp.com
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'power-passbook', github: 'max-power/passbook'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ ## Usage
16
+
17
+ First setup Signing:
18
+
19
+ signer = Passbook::Authority.new(File.read("/path/to/certificate.p12"), "secret-password")
20
+
21
+ The basic usage is:
22
+
23
+ pass = Passbook::PKPass.new(pass_specifications, pass_assets, signer)
24
+ pass.to_file("my/path/to/the/pass.pkpass")
25
+ pass.to_s
26
+ pass.content_type # "application/vnd.apple.pkpass"
27
+
28
+ Pass specifications is a hash that should match the [Apple Passbook Format Reference](https://developer.apple.com/library/ios/documentation/UserExperience/Reference/PassKit_Bundle/Chapters/TopLevel.html).
29
+
30
+ pass_specifications = {
31
+ "formatVersion" => 1,
32
+ "passTypeIdentifier" => "pass.com.flycheap.boardingpass",
33
+ "teamIdentifier" => "XXXXXXXX",
34
+ "organizationName" => "XXXXXXXX",
35
+ "labelColor" => "#ffffff",
36
+ "backgroundColor" => "#618d04",
37
+ "foregroundColor" => "#ffffff",
38
+ "serialNumber" => "123",
39
+ "logoText" => "Hi",
40
+ ...
41
+ }
42
+
43
+ The assets parameter is a hash with filenames as keys and local or remote paths to the file as value.
44
+ See the [Apple Pass Design and Creation guidelines](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/PassKit_PG/Chapters/Creating.html#//apple_ref/doc/uid/TP40012195-CH4-SW45)
45
+ to see which files are used for the different pass types.
46
+
47
+ pass_assets = {
48
+ "background.png" => "assets/background.png",
49
+ "background@2x.png" => "assets/background@2x.png",
50
+ "icon.png" => "assets/icon.png",
51
+ "icon@2x.png" => "assets/icon@2x.png",
52
+ "logo.png" => "http://i.imgur.com/WLUf6.png",
53
+ "logo@2x.png" => "http://i.imgur.com/mOpQo.png",
54
+ "thumbnail.png" => "assets/thumbnail.png",
55
+ "thumbnail@2x.png" => "assets/thumbnail@2x.png"
56
+ }
57
+
58
+ ## See Also
59
+
60
+ There is also a very tiny (60 LOC) version available here: https://gist.github.com/max-power/9262053
61
+
62
+ ## Contributing
63
+
64
+ 1. Fork it ( http://github.com/max-power/passbook/fork )
65
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
66
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
67
+ 4. Push to the branch (`git push origin my-new-feature`)
68
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = 'spec/**/*_spec.rb'
6
+ t.libs << 'spec'
7
+ end
8
+
9
+ desc "Run tests"
10
+ task :default => :test
11
+
12
+ desc "Run console"
13
+ task :console do
14
+ require 'irb'
15
+ require 'irb/completion'
16
+ require 'passbook'
17
+ ARGV.clear
18
+ IRB.start
19
+ end
data/lib/passbook.rb ADDED
@@ -0,0 +1,47 @@
1
+ require "passbook/version"
2
+ require "passbook/pk_pass"
3
+ require "openssl"
4
+
5
+ module Passbook
6
+ class Authority
7
+ def initialize(certificate, password)
8
+ @pk12 = OpenSSL::PKCS12.new(certificate, password)
9
+ @flag = OpenSSL::PKCS7::BINARY | OpenSSL::PKCS7::DETACHED
10
+ @wwdr = OpenSSL::X509::Certificate.new(wwdr_certificate)
11
+ end
12
+
13
+ def sign(content)
14
+ OpenSSL::PKCS7.sign(@pk12.certificate, @pk12.key, content, [@wwdr], @flag).to_der
15
+ end
16
+
17
+ def wwdr_certificate
18
+ <<-EOF.gsub /^\s+/, ""
19
+ -----BEGIN CERTIFICATE-----
20
+ MIIEIzCCAwugAwIBAgIBGTANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzET
21
+ MBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlv
22
+ biBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDgwMjE0MTg1
23
+ NjM1WhcNMTYwMjE0MTg1NjM1WjCBljELMAkGA1UEBhMCVVMxEzARBgNVBAoMCkFw
24
+ cGxlIEluYy4xLDAqBgNVBAsMI0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVs
25
+ YXRpb25zMUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0
26
+ aW9ucyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQAD
27
+ ggEPADCCAQoCggEBAMo4VKbLVqrIJDlI6Yzu7F+4fyaRvDRTes58Y4Bhd2RepQcj
28
+ tjn+UC0VVlhwLX7EbsFKhT4v8N6EGqFXya97GP9q+hUSSRUIGayq2yoy7ZZjaFIV
29
+ PYyK7L9rGJXgA6wBfZcFZ84OhZU3au0Jtq5nzVFkn8Zc0bxXbmc1gHY2pIeBbjiP
30
+ 2CsVTnsl2Fq/ToPBjdKT1RpxtWCcnTNOVfkSWAyGuBYNweV3RY1QSLorLeSUheHo
31
+ xJ3GaKWwo/xnfnC6AllLd0KRObn1zeFM78A7SIym5SFd/Wpqu6cWNWDS5q3zRinJ
32
+ 6MOL6XnAamFnFbLw/eVovGJfbs+Z3e8bY/6SZasCAwEAAaOBrjCBqzAOBgNVHQ8B
33
+ Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUiCcXCam2GGCL7Ou6
34
+ 9kdZxVJUo7cwHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/CF4wNgYDVR0f
35
+ BC8wLTAroCmgJ4YlaHR0cDovL3d3dy5hcHBsZS5jb20vYXBwbGVjYS9yb290LmNy
36
+ bDAQBgoqhkiG92NkBgIBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEA2jIAlsVUlNM7
37
+ gjdmfS5o1cPGuMsmjEiQzxMkakaOY9Tw0BMG3djEwTcV8jMTOSYtzi5VQOMLA6/6
38
+ EsLnDSG41YDPrCgvzi2zTq+GGQTG6VDdTClHECP8bLsbmGtIieFbnd5G2zWFNe8+
39
+ 0OJYSzj07XVaH1xwHVY5EuXhDRHkiSUGvdW0FY5e0FmXkOlLgeLfGK9EdB4ZoDpH
40
+ zJEdOusjWv6lLZf3e7vWh0ZChetSPSayY6i0scqP9Mzis8hH4L+aWYP62phTKoL1
41
+ fGUuldkzXfXtZcwxN8VaBOhr4eeIA0p1npsoy0pAiGVDdd3LOiUjxZ5X+C7O0qmS
42
+ XnMuLyV1FQ==
43
+ -----END CERTIFICATE-----
44
+ EOF
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ require "zip"
2
+
3
+ module Passbook
4
+ module Archive
5
+ module_function
6
+
7
+ def zip(*files)
8
+ Zip::OutputStream.write_buffer do |zip|
9
+ files.flatten.compact.each do |file|
10
+ zip.put_next_entry(file.filename) && zip.write(file.content)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ require "passbook/static_file"
2
+ require "passbook/remote_file"
3
+
4
+ module Passbook
5
+ class Assets < Array
6
+ def initialize(dict)
7
+ super dict.map { |n,p| (p =~ %r[^https?://\S+] ? RemoteFile : StaticFile).new(n,p) }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,24 @@
1
+ require "digest/sha1"
2
+ require "json"
3
+
4
+ module Passbook
5
+ class Manifest
6
+ def initialize(*files)
7
+ @files = files.flatten.compact
8
+ end
9
+
10
+ def filename
11
+ "manifest.json"
12
+ end
13
+
14
+ def content
15
+ @content ||= dictionary.to_json
16
+ end
17
+
18
+ def dictionary
19
+ @files.each_with_object({}) do |file, dict|
20
+ dict[file.filename] = Digest::SHA1.hexdigest(file.content)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ require "json"
2
+
3
+ module Passbook
4
+ class Pass
5
+ def initialize(specs)
6
+ @specs = specs
7
+ end
8
+
9
+ def filename
10
+ "pass.json"
11
+ end
12
+
13
+ def content
14
+ @content ||= @specs.to_json
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ require "passbook/pass"
2
+ require "passbook/assets"
3
+ require "passbook/manifest"
4
+ require "passbook/signature"
5
+ require "passbook/archive"
6
+
7
+ module Passbook
8
+ class PKPass
9
+ def initialize(specs, assets, authority)
10
+ @pass = Pass.new(specs)
11
+ @assets = Assets.new(assets)
12
+ @manifest = Manifest.new(@pass, @assets)
13
+ @signature = Signature.new(@manifest, authority)
14
+ end
15
+
16
+ def content_type
17
+ "application/vnd.apple.pkpass"
18
+ end
19
+
20
+ def to_s
21
+ Archive.zip(@pass, @assets, @manifest, @signature).string
22
+ end
23
+
24
+ def to_file(path)
25
+ File.write(path, to_s)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ require "net/http"
2
+
3
+ module Passbook
4
+ class RemoteFile
5
+ attr_reader :filename
6
+
7
+ def initialize(name, uri)
8
+ @filename, @uri = name, URI(uri)
9
+ end
10
+
11
+ def content
12
+ @content ||= Net::HTTP.get(@uri)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Passbook
2
+ class Signature
3
+ def initialize(manifest, authority)
4
+ @manifest, @authority = manifest, authority
5
+ end
6
+
7
+ def filename
8
+ "signature"
9
+ end
10
+
11
+ def content
12
+ @content ||= @authority.sign(@manifest.content)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require "pathname"
2
+
3
+ module Passbook
4
+ class StaticFile
5
+ attr_reader :filename
6
+
7
+ def initialize(name, path)
8
+ @filename, @path = name, Pathname(path)
9
+ end
10
+
11
+ def content
12
+ @content ||= @path.read
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module Passbook
2
+ VERSION = "0.0.2"
3
+ end
data/passbook.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'passbook/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "power-passbook"
8
+ spec.version = Passbook::VERSION
9
+ spec.authors = ["Max Power"]
10
+ spec.email = ["kevin.melchert@gmail.com"]
11
+ spec.summary = %q{Passbook pass generator.}
12
+ spec.description = %q{Passbook pass generator.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "rubyzip", "~> 1.1"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.5"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "minitest"
26
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Passbook::Assets do
4
+ before do
5
+ data = {
6
+ "background.png" => "assets/background.png",
7
+ "background@2x.png" => "assets/background@2x.png",
8
+ "icon.png" => "assets/icon.png",
9
+ "icon@2x.png" => "assets/icon@2x.png",
10
+ "logo.png" => "http://i.imgur.com/WLUf6.png",
11
+ "logo@2x.png" => "http://i.imgur.com/mOpQo.png",
12
+ "thumbnail.png" => "assets/thumbnail.png",
13
+ "thumbnail@2x.png" => "assets/thumbnail@2x.png"
14
+ }
15
+ @assets = Passbook::Assets.new(data)
16
+ end
17
+
18
+ it "should only contain remote or static files" do
19
+ @assets.all? { |a| ['Passbook::StaticFile', 'Passbook::RemoteFile'].include?(a.class.name) }.must_equal true
20
+ end
21
+
22
+ it "should have 1 member" do
23
+ @assets.length.must_equal 8
24
+ end
25
+ end
@@ -0,0 +1 @@
1
+ TEST-1-2-3
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Passbook::Manifest do
4
+ before do
5
+ @manifest = Passbook::Manifest.new({}, {})
6
+ end
7
+
8
+ it "should have a filename" do
9
+ @manifest.filename.must_equal "manifest.json"
10
+ end
11
+
12
+ it "should sign a string" do
13
+ @manifest.sign('x').must_equal "11f6ad8ec52a2984abaafd7c3b516503785c2072"
14
+ end
15
+
16
+ # it "should have content" do
17
+ # @file.content.must_equal 'TEST-1-2-3'
18
+ # end
19
+ end
data/spec/pass_spec.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Passbook::Pass do
4
+ before do
5
+ @pass = Passbook::Pass.new({ a: '123' }, { serialNumber: 'xtc1001' })
6
+ end
7
+
8
+ it "should have a filename" do
9
+ @pass.filename.must_equal 'pass.json'
10
+ end
11
+
12
+ it "should have content" do
13
+ @pass.content.must_equal %Q[{"a":"123","serialNumber":"xtc1001"}]
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Passbook::PKPass do
4
+ before do
5
+ @pass = Passbook::PKPass.new({},{})
6
+ end
7
+
8
+ it "should have the 'vnd.apple.pkpass' content_type" do
9
+ @pass.content_type.must_equal 'application/vnd.apple.pkpass'
10
+ end
11
+
12
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Passbook::RemoteFile do
4
+ before do
5
+ @file = Passbook::RemoteFile.new('test.txt', 'http://www.last.fm/robots.txt')
6
+ end
7
+
8
+ it "should have a filename" do
9
+ @file.filename.must_equal 'test.txt'
10
+ end
11
+
12
+ it "should have content" do
13
+ @file.content.must_equal 'User-Agent: *
14
+ Disallow: /music?
15
+ Disallow: /widgets/radio?
16
+
17
+ Disallow: /affiliate/
18
+ Disallow: /affiliate_redirect.php
19
+ Disallow: /affiliate_sendto.php
20
+ Disallow: /affiliatelink.php
21
+ Disallow: /campaignlink.php
22
+ Disallow: /delivery.php
23
+
24
+ Disallow: /music/+noredirect/
25
+ Disallow: /user/*/library/music/
26
+ Disallow: /*/+news/*/visit
27
+ Disallow: /*/+wiki/diff
28
+
29
+ # AJAX content
30
+ Disallow: /search/autocomplete
31
+ Disallow: /template
32
+ Disallow: /ajax
33
+ Disallow: /user/*/tasteomatic
34
+
35
+ # Ads metastructure
36
+ Disallow: /8264
37
+
38
+ Disallow: /harming/humans
39
+ Disallow: /ignoring/human/orders
40
+ Disallow: /harm/to/self
41
+
42
+ Allow: /
43
+
44
+ Sitemap: http://www.last.fm/sitemap-index.xml
45
+ '
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Passbook::Signature do
4
+ before do
5
+ @sig = Passbook::Signature.new({})
6
+ end
7
+
8
+ it "should have a filename" do
9
+ @sig.filename.must_equal 'signature'
10
+ end
11
+
12
+ it "should have content" do
13
+ # @sig.content.must_equal 'TEST-1-2-3'
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+
5
+ require 'minitest/autorun'
6
+ require 'minitest/spec'
7
+
8
+ require 'passbook'
9
+
10
+ Dummy = Struct.new(:filename, :content)
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Passbook::StaticFile do
4
+ before do
5
+ @file = Passbook::StaticFile.new('icon.png', Pathname.new(__FILE__).dirname + 'files/test.txt')
6
+ end
7
+
8
+ it "should have a filename" do
9
+ @file.filename.must_equal 'icon.png'
10
+ end
11
+
12
+ it "should have content" do
13
+ @file.content.must_equal 'TEST-1-2-3'
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: power-passbook
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Max Power
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rubyzip
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Passbook pass generator.
70
+ email:
71
+ - kevin.melchert@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - lib/passbook.rb
82
+ - lib/passbook/archive.rb
83
+ - lib/passbook/assets.rb
84
+ - lib/passbook/manifest.rb
85
+ - lib/passbook/pass.rb
86
+ - lib/passbook/pk_pass.rb
87
+ - lib/passbook/remote_file.rb
88
+ - lib/passbook/signature.rb
89
+ - lib/passbook/static_file.rb
90
+ - lib/passbook/version.rb
91
+ - passbook.gemspec
92
+ - spec/assets_spec.rb
93
+ - spec/files/test.txt
94
+ - spec/manifest_spec.rb
95
+ - spec/pass_spec.rb
96
+ - spec/pk_pass_spec.rb
97
+ - spec/remote_file_spec.rb
98
+ - spec/signature_spec.rb
99
+ - spec/spec_helper.rb
100
+ - spec/static_file_spec.rb
101
+ homepage: ''
102
+ licenses:
103
+ - MIT
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 2.2.2
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: Passbook pass generator.
125
+ test_files:
126
+ - spec/assets_spec.rb
127
+ - spec/files/test.txt
128
+ - spec/manifest_spec.rb
129
+ - spec/pass_spec.rb
130
+ - spec/pk_pass_spec.rb
131
+ - spec/remote_file_spec.rb
132
+ - spec/signature_spec.rb
133
+ - spec/spec_helper.rb
134
+ - spec/static_file_spec.rb