power-passbook 0.0.2

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