class Mswallet::Pass
Constants
- TYPES
Attributes
files[RW]
locales[RW]
pass[RW]
Public Class Methods
init()
click to toggle source
# File lib/mswallet/pass.rb, line 52 def self.init doc = XML::Document.new doc.encoding = XML::Encoding::UTF_8 root = XML::Node.new 'WalletItem' doc.root = root version_el = XML::Node.new('Version') version_el.content = WALLET_VERSION root << version_el return doc end
new(pass = nil) { |self| ... }
click to toggle source
# File lib/mswallet/pass.rb, line 10 def initialize(pass = nil) @pass = pass || self.class.init @locales = {} @files = [] yield(self) if block_given? end
Public Instance Methods
[](key)
click to toggle source
# File lib/mswallet/pass.rb, line 26 def [](key) @pass.root.find(key).first end
[]=(key, val)
click to toggle source
# File lib/mswallet/pass.rb, line 17 def []=(key, val) result = convert_to_xml(key, val) if result.is_a? Array result.each { |item| @pass.root << item } else @pass.root << result end end
add_file(file)
click to toggle source
# File lib/mswallet/pass.rb, line 30 def add_file(file) @files << file end
add_locale(lang, file)
click to toggle source
# File lib/mswallet/pass.rb, line 34 def add_locale(lang, file) @locales[lang] = file end
file(options = {})
click to toggle source
Return a Tempfile containing our ZipStream
# File lib/mswallet/pass.rb, line 39 def file(options = {}) options[:file_name] ||= 'pass.mswallet' temp_file = Tempfile.new(options[:file_name]) temp_file.write self.stream.string temp_file.close temp_file end
stream()
click to toggle source
Return a ZipOutputStream
# File lib/mswallet/pass.rb, line 47 def stream check_pass output_zip end
valid?()
click to toggle source
# File lib/mswallet/pass.rb, line 65 def valid? check_pass true rescue false end
Private Instance Methods
check_pass()
click to toggle source
# File lib/mswallet/pass.rb, line 105 def check_pass # Check for default images [99, 159, 336].each do |size| raise "Logo#{size}x#{size} missing" unless @files.detect {|f| f[:name] == "Logo#{size}x#{size}.png" } end # Check for developer field in XML fail 'Pass must be XML::Document object' unless @pass.is_a? XML::Document root = @pass.find('WalletItem') fail 'WalletItem node missing' unless root { 'Version' => ['Format Version missing', Mswallet::WALLET_VERSION ], 'Kind' => ['Pass Kind Identifier missing', TYPES ], 'Id' => ['Id missing'], 'DisplayName' => ['Display Name missing' ], 'IssuerDisplayName' => ['Issuer Display Name missing'], 'HeaderColor' => ['Header Color missing', /^#(?:[\da-fA-F]{2}){3}$/], 'BodyColor' => ['Body Name missing', /#(?:[\d\w]){3}/] }.each do |tag, params| msg, value = params el = @pass.find(tag).first fail msg unless el case value when Array fail "#{tag} not in #{value.join(',')}" unless value.include?(el.content) unless value.empty? when Regexp fail "#{tag} not match #{value.to_s}" unless el.content.match value when nil nil else fail "#{tag} must be #{value}" unless value == el.content end end end
convert_to_xml(key, val)
click to toggle source
# File lib/mswallet/pass.rb, line 74 def convert_to_xml(key, val) case val when Hash el = XML::Node.new(key) val.each do |k,v| res = convert_to_xml(k, v) if res.is_a? Array res.each {|item| el << item } else el << res end end when Array el = [] val.each do |v| el << convert_to_xml(key, v) end else el = XML::Node.new(key) if val el.content = val.to_s else text_node = XML::Node.new_text(' ') text_node.output_escaping = false el << text_node end end el end
output_zip()
click to toggle source
# File lib/mswallet/pass.rb, line 147 def output_zip buffer = Zip::OutputStream.write_buffer do |zip| zip.put_next_entry 'WalletItem.xml' zip.write @pass.to_s @files.each do |file| if file.class == Hash zip.put_next_entry file[:name] zip.print file[:content] else zip.put_next_entry File.basename(file) zip.print IO.read(file) end end @locales.each do |lang, file| zip.put_next_entry "#{lang}/strings.txt" data = '' case file when String data = file when File data = file.read when Hash file.each do |k, v| data += "#{k}=#{v}\n" end else fail 'wrong locale object' end zip.print data end end buffer end