CFPropertyList 2.0.17 → 2.1

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.
@@ -435,6 +435,8 @@ module CFPropertyList
435
435
 
436
436
  # Uniques and transforms a string value to binary format and adds it to the object table
437
437
  def string_to_binary(val)
438
+ val = val.to_s
439
+
438
440
  @unique_table[val] ||= begin
439
441
  if !Binary.ascii_string?(val)
440
442
  utf8_strlen = Binary.charset_strlen(val, "UTF-8")
@@ -554,33 +556,6 @@ module CFPropertyList
554
556
  @object_table[saved_object_count] = bdata
555
557
  return saved_object_count
556
558
  end
557
-
558
- =begin It is difficult to reap benefits from an Enumerator
559
- # like an array, but we don't know length ahead of time
560
- def enum_to_binary(val)
561
- saved_object_count = @written_object_count
562
- @written_object_count += 1
563
-
564
- size = 0
565
- # This destroys our low-memory stream.
566
- # However, testing shows that it is faster
567
- # Probably because packing this single Array (in pack_int_array_with_size)
568
- # is faster than packing each individual array member separately
569
- # i.e. to be faster it needs an Enumerator#pack
570
- binary = val.value.map do |v|
571
- size += 1;
572
- v.to_binary(self)
573
- end
574
- @object_refs += size
575
-
576
- bdata = Binary.type_bytes(0b1010, size) <<
577
- Binary.pack_int_array_with_size(object_ref_size(@object_refs), binary)
578
-
579
- @object_table[saved_object_count] = bdata
580
- saved_object_count
581
- end
582
- =end
583
-
584
559
  end
585
560
  end
586
561
 
@@ -1,6 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- require 'libxml'
4
3
  require 'kconv'
5
4
  require 'date'
6
5
  require 'time'
@@ -56,6 +55,17 @@ module CFPropertyList
56
55
  return true
57
56
  end
58
57
  end
58
+
59
+ class XMLParserInterface < ParserInterface
60
+ def new_node(name)
61
+ end
62
+
63
+ def new_text(val)
64
+ end
65
+
66
+ def append_node(parent, child)
67
+ end
68
+ end
59
69
  end
60
70
 
61
71
  class String
@@ -82,11 +92,35 @@ end
82
92
  dirname = File.dirname(__FILE__)
83
93
  require dirname + '/rbCFPlistError.rb'
84
94
  require dirname + '/rbCFTypes.rb'
85
- require dirname + '/rbXMLCFPropertyList.rb'
86
95
  require dirname + '/rbBinaryCFPropertyList.rb'
87
96
 
88
97
  require 'iconv' unless "".respond_to?("encode")
89
98
 
99
+ begin
100
+ Enumerable::Enumerator.new([])
101
+ rescue NameError => e
102
+ module Enumerable
103
+ class Enumerator
104
+ end
105
+ end
106
+ end
107
+
108
+ begin
109
+ require dirname + '/rbLibXMLParser.rb'
110
+ try_nokogiri = false
111
+ rescue LoadError => e
112
+ try_nokogiri = true
113
+ end
114
+
115
+ if try_nokogiri then
116
+ begin
117
+ require dirname + '/rbNokogiriParser.rb'
118
+ rescue LoadError => e
119
+ require dirname + '/rbREXMLParser.rb'
120
+ end
121
+ end
122
+
123
+
90
124
  module CFPropertyList
91
125
  # Create CFType hierarchy by guessing the correct CFType, e.g.
92
126
  #
@@ -99,7 +133,7 @@ module CFPropertyList
99
133
  # +convert_unknown_to_string+:: Convert unknown objects to string calling to_str()
100
134
  # +converter_method+:: Convert unknown objects to known objects calling +method_name+
101
135
  #
102
- # cftypes = CFPropertyList.guess(x,:convert_unknown_to_string => true,:converter_method => :to_hash)
136
+ # cftypes = CFPropertyList.guess(x,:convert_unknown_to_string => true,:converter_method => :to_hash, :converter_with_opts => true)
103
137
  def guess(object, options = {})
104
138
  case object
105
139
  when Fixnum, Integer then CFInteger.new(object)
@@ -111,7 +145,7 @@ module CFPropertyList
111
145
 
112
146
  when Time, DateTime, Date then CFDate.new(object)
113
147
 
114
- when Array, Enumerator
148
+ when Array, Enumerator, Enumerable::Enumerator
115
149
  ary = Array.new
116
150
  object.each do |o|
117
151
  ary.push CFPropertyList.guess(o, options)
@@ -125,18 +159,6 @@ module CFPropertyList
125
159
  hsh[k] = CFPropertyList.guess(v, options)
126
160
  end
127
161
  CFDictionary.new(hsh)
128
-
129
- =begin
130
- when Enumerator
131
- CFEnumerator.new(
132
- Enumerator.new do |yielder|
133
- object.each do |o|
134
- yielder << CFPropertyList.guess(o, options)
135
- end
136
- end
137
- )
138
- =end
139
-
140
162
  else
141
163
  case
142
164
  when Object.const_defined?('BigDecimal') && object.is_a?(BigDecimal)
@@ -144,7 +166,11 @@ module CFPropertyList
144
166
  when object.respond_to?(:read)
145
167
  CFData.new(object.read(), CFData::DATA_RAW)
146
168
  when options[:converter_method] && object.respond_to?(options[:converter_method])
147
- CFPropertyList.guess(object.send(options[:converter_method]),options)
169
+ if options[:converter_with_opts]
170
+ CFPropertyList.guess(object.send(options[:converter_method],options),options)
171
+ else
172
+ CFPropertyList.guess(object.send(options[:converter_method]),options)
173
+ end
148
174
  when options[:convert_unknown_to_string]
149
175
  CFString.new(object.to_s)
150
176
  else
@@ -20,7 +20,8 @@ module CFPropertyList
20
20
  @value = value
21
21
  end
22
22
 
23
- def to_xml; end
23
+ def to_xml(parser)
24
+ end
24
25
 
25
26
  def to_binary(bplist) end
26
27
  end
@@ -29,9 +30,9 @@ module CFPropertyList
29
30
  # It will convert the value to UTF-16BE if necessary (i.e. if non-ascii char contained)
30
31
  class CFString < CFType
31
32
  # convert to XML
32
- def to_xml
33
- n = LibXML::XML::Node.new('string')
34
- n << LibXML::XML::Node.new_text(@value) unless @value.nil?
33
+ def to_xml(parser)
34
+ n = parser.new_node('string')
35
+ n = parser.append_node(n, parser.new_text(@value)) unless @value.nil?
35
36
  n
36
37
  end
37
38
 
@@ -44,8 +45,10 @@ module CFPropertyList
44
45
  # This class holds integer/fixnum values
45
46
  class CFInteger < CFType
46
47
  # convert to XML
47
- def to_xml
48
- return LibXML::XML::Node.new('integer') << LibXML::XML::Node.new_text(@value.to_s)
48
+ def to_xml(parser)
49
+ n = parser.new_node('integer')
50
+ n = parser.append_node(n, parser.new_text(@value.to_s))
51
+ n
49
52
  end
50
53
 
51
54
  # convert to binary
@@ -57,8 +60,10 @@ module CFPropertyList
57
60
  # This class holds float values
58
61
  class CFReal < CFType
59
62
  # convert to XML
60
- def to_xml
61
- return LibXML::XML::Node.new('real') << LibXML::XML::Node.new_text(@value.to_s)
63
+ def to_xml(parser)
64
+ n = parser.new_node('real')
65
+ n = parser.append_node(n, parser.new_text(@value.to_s))
66
+ n
62
67
  end
63
68
 
64
69
  # convert to binary
@@ -122,8 +127,10 @@ module CFPropertyList
122
127
  end
123
128
 
124
129
  # convert to XML
125
- def to_xml
126
- LibXML::XML::Node.new('date') << LibXML::XML::Node.new_text(CFDate::date_string(@value))
130
+ def to_xml(parser)
131
+ n = parser.new_node('date')
132
+ n = parser.append_node(n, parser.new_text(CFDate::date_string(@value)))
133
+ n
127
134
  end
128
135
 
129
136
  # convert to binary
@@ -135,8 +142,8 @@ module CFPropertyList
135
142
  # This class contains a boolean value
136
143
  class CFBoolean < CFType
137
144
  # convert to XML
138
- def to_xml
139
- LibXML::XML::Node.new(@value ? 'true' : 'false')
145
+ def to_xml(parser)
146
+ parser.new_node(@value ? 'true' : 'false')
140
147
  end
141
148
 
142
149
  # convert to binary
@@ -175,8 +182,10 @@ module CFPropertyList
175
182
  end
176
183
 
177
184
  # convert to XML
178
- def to_xml
179
- LibXML::XML::Node.new('data') << LibXML::XML::Node.new_text(encoded_value())
185
+ def to_xml(parser)
186
+ n = parser.new_node('data')
187
+ n = parser.append_node(n, parser.new_text(encoded_value()))
188
+ n
180
189
  end
181
190
 
182
191
  # convert to binary
@@ -193,10 +202,10 @@ module CFPropertyList
193
202
  end
194
203
 
195
204
  # convert to XML
196
- def to_xml
197
- n = LibXML::XML::Node.new('array')
205
+ def to_xml(parser)
206
+ n = parser.new_node('array')
198
207
  @value.each do |v|
199
- n << v.to_xml
208
+ n = parser.append_node(n, v.to_xml(parser))
200
209
  end
201
210
  n
202
211
  end
@@ -207,14 +216,6 @@ module CFPropertyList
207
216
  end
208
217
  end
209
218
 
210
- =begin
211
- class CFEnumerator < CFArray
212
- def to_binary(bplist)
213
- bplist.enum_to_binary(self)
214
- end
215
- end
216
- =end
217
-
218
219
  # this class contains a hash of values
219
220
  class CFDictionary < CFType
220
221
  # Create new CFDictonary type.
@@ -223,12 +224,12 @@ module CFPropertyList
223
224
  end
224
225
 
225
226
  # convert to XML
226
- def to_xml
227
- n = LibXML::XML::Node.new('dict')
228
- @value.each_pair do |key,value|
229
- k = LibXML::XML::Node.new('key') << LibXML::XML::Node.new_text(key)
230
- n << k
231
- n << value.to_xml
227
+ def to_xml(parser)
228
+ n = parser.new_node('dict')
229
+ @value.each_pair do |key, value|
230
+ k = parser.append_node(parser.new_node('key'), parser.new_text(key.to_s))
231
+ n = parser.append_node(n, k)
232
+ n = parser.append_node(n, value.to_xml(parser))
232
233
  end
233
234
  n
234
235
  end
@@ -1,8 +1,10 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
+ require 'libxml'
4
+
3
5
  module CFPropertyList
4
6
  # XML parser
5
- class XML < ParserInterface
7
+ class XML < XMLParserInterface
6
8
  # read a XML file
7
9
  # opts::
8
10
  # * :file - The filename of the file to load
@@ -27,7 +29,7 @@ module CFPropertyList
27
29
  doc.encoding = LibXML::XML::Encoding::UTF_8
28
30
 
29
31
  doc.root['version'] = '1.0'
30
- doc.root << opts[:root].to_xml()
32
+ doc.root << opts[:root].to_xml(self)
31
33
 
32
34
  # ugly hack, but there's no other possibility I know
33
35
  str = doc.to_s(:indent => opts[:formatted])
@@ -46,6 +48,18 @@ module CFPropertyList
46
48
  return str1
47
49
  end
48
50
 
51
+ def new_node(name)
52
+ LibXML::XML::Node.new(name)
53
+ end
54
+
55
+ def new_text(val)
56
+ LibXML::XML::Node.new_text(val)
57
+ end
58
+
59
+ def append_node(parent, child)
60
+ parent << child
61
+ end
62
+
49
63
  protected
50
64
 
51
65
  # get the value of a DOM node
@@ -72,6 +86,7 @@ module CFPropertyList
72
86
  if node.children? then
73
87
  node.children.each do |n|
74
88
  next if n.text? # avoid a bug of libxml
89
+ next if n.comment?
75
90
 
76
91
  if n.name == "key" then
77
92
  key = get_value(n)
@@ -0,0 +1,140 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'nokogiri'
4
+
5
+ module CFPropertyList
6
+ # XML parser
7
+ class XML < ParserInterface
8
+ # read a XML file
9
+ # opts::
10
+ # * :file - The filename of the file to load
11
+ # * :data - The data to parse
12
+ def load(opts)
13
+ if(opts.has_key?(:file)) then
14
+ File.open(opts[:file], "rb") { |fd| doc = Nokogiri::XML::Document.parse(fd, nil, nil, Nokogiri::XML::ParseOptions::NOBLANKS|Nokogiri::XML::ParseOptions::NOENT) }
15
+ else
16
+ doc = Nokogiri::XML::Document.parse(opts[:data], nil, nil, Nokogiri::XML::ParseOptions::NOBLANKS|Nokogiri::XML::ParseOptions::NOENT)
17
+ end
18
+
19
+ root = doc.root.children.first
20
+ return import_xml(root)
21
+ end
22
+
23
+ # serialize CFPropertyList object to XML
24
+ # opts = {}:: Specify options: :formatted - Use indention and line breaks
25
+ def to_str(opts={})
26
+ doc = Nokogiri::XML::Document.new
27
+ @doc = doc
28
+
29
+ doc.root = doc.create_element 'plist', :version => '1.0'
30
+ doc.encoding = 'UTF-8'
31
+
32
+ doc.root << opts[:root].to_xml(self)
33
+
34
+ # ugly hack, but there's no other possibility I know
35
+ s_opts = Nokogiri::XML::Node::SaveOptions::AS_XML
36
+ s_opts |= Nokogiri::XML::Node::SaveOptions::FORMAT if opts[:formatted]
37
+
38
+ str = doc.serialize(:save_with => s_opts)
39
+ str1 = String.new
40
+ first = false
41
+ str.each_line do |line|
42
+ str1 << line
43
+ unless(first) then
44
+ str1 << "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" if line =~ /^\s*<\?xml/
45
+ end
46
+
47
+ first = true
48
+ end
49
+
50
+ str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding)
51
+ return str1
52
+ end
53
+
54
+ def new_node(name)
55
+ @doc.create_element name
56
+ end
57
+
58
+ def new_text(val)
59
+ @doc.create_text_node val
60
+ end
61
+
62
+ def append_node(parent, child)
63
+ parent << child
64
+ end
65
+
66
+ protected
67
+
68
+ # get the value of a DOM node
69
+ def get_value(n)
70
+ content = if n.children.empty?
71
+ n.content
72
+ else
73
+ n.children.first.content
74
+ end
75
+
76
+ content.force_encoding('UTF-8') if content.respond_to?(:force_encoding)
77
+ content
78
+ end
79
+
80
+ # import the XML values
81
+ def import_xml(node)
82
+ ret = nil
83
+
84
+ case node.name
85
+ when 'dict'
86
+ hsh = Hash.new
87
+ key = nil
88
+ children = node.children
89
+
90
+ unless children.empty? then
91
+ children.each do |n|
92
+ next if n.text? # avoid a bug of libxml
93
+ next if n.comment?
94
+
95
+ if n.name == "key" then
96
+ key = get_value(n)
97
+ else
98
+ raise CFFormatError.new("Format error!") if key.nil?
99
+ hsh[key] = import_xml(n)
100
+ key = nil
101
+ end
102
+ end
103
+ end
104
+
105
+ ret = CFDictionary.new(hsh)
106
+
107
+ when 'array'
108
+ ary = Array.new
109
+ children = node.children
110
+
111
+ unless children.empty? then
112
+ children.each do |n|
113
+ ary.push import_xml(n)
114
+ end
115
+ end
116
+
117
+ ret = CFArray.new(ary)
118
+
119
+ when 'true'
120
+ ret = CFBoolean.new(true)
121
+ when 'false'
122
+ ret = CFBoolean.new(false)
123
+ when 'real'
124
+ ret = CFReal.new(get_value(node).to_f)
125
+ when 'integer'
126
+ ret = CFInteger.new(get_value(node).to_i)
127
+ when 'string'
128
+ ret = CFString.new(get_value(node))
129
+ when 'data'
130
+ ret = CFData.new(get_value(node))
131
+ when 'date'
132
+ ret = CFDate.new(CFDate.parse_date(get_value(node)))
133
+ end
134
+
135
+ return ret
136
+ end
137
+ end
138
+ end
139
+
140
+ # eof
@@ -0,0 +1,136 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rexml/document'
4
+
5
+ module CFPropertyList
6
+ # XML parser
7
+ class XML < ParserInterface
8
+ # read a XML file
9
+ # opts::
10
+ # * :file - The filename of the file to load
11
+ # * :data - The data to parse
12
+ def load(opts)
13
+ if(opts.has_key?(:file)) then
14
+ File.open(opts[:file], "rb") { |fd| doc = REXML::Document.new(fd) }
15
+ else
16
+ doc = REXML::Document.new(opts[:data])
17
+ end
18
+
19
+ root = doc.root.elements[1]
20
+ return import_xml(root)
21
+ end
22
+
23
+ # serialize CFPropertyList object to XML
24
+ # opts = {}:: Specify options: :formatted - Use indention and line breaks
25
+ def to_str(opts={})
26
+ doc = REXML::Document.new
27
+ @doc = doc
28
+
29
+ doc.context[:attribute_quote] = :quote
30
+
31
+ doc.add_element 'plist', {'version' => '1.0'}
32
+ doc.root << opts[:root].to_xml(self)
33
+
34
+ formatter = if opts[:formatted] then
35
+ f = REXML::Formatters::Pretty.new(2)
36
+ f.compact = true
37
+ f
38
+ else
39
+ REXML::Formatters::Default.new
40
+ end
41
+
42
+ str = formatter.write(doc.root, "")
43
+ str1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" + str + "\n"
44
+ str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding)
45
+
46
+ return str1
47
+ end
48
+
49
+ def new_node(name)
50
+ #LibXML::XML::Node.new(name)
51
+ REXML::Element.new(name)
52
+ end
53
+
54
+ def new_text(val)
55
+ val
56
+ end
57
+
58
+ def append_node(parent, child)
59
+ if child.is_a?(String) then
60
+ parent.add_text child
61
+ else
62
+ parent.elements << child
63
+ end
64
+ parent
65
+ end
66
+
67
+ protected
68
+
69
+ # get the value of a DOM node
70
+ def get_value(n)
71
+ content = n.text
72
+
73
+ content.force_encoding('UTF-8') if content.respond_to?(:force_encoding)
74
+ content
75
+ end
76
+
77
+ # import the XML values
78
+ def import_xml(node)
79
+ ret = nil
80
+
81
+ case node.name
82
+ when 'dict'
83
+ hsh = Hash.new
84
+ key = nil
85
+
86
+ if node.has_elements? then
87
+ node.elements.each do |n|
88
+ #print n.name + "\n"
89
+ next if n.name == '#text' # avoid a bug of libxml
90
+ next if n.name == '#comment'
91
+
92
+ if n.name == "key" then
93
+ key = get_value(n)
94
+ else
95
+ raise CFFormatError.new("Format error!") if key.nil?
96
+ hsh[key] = import_xml(n)
97
+ key = nil
98
+ end
99
+ end
100
+ end
101
+
102
+ ret = CFDictionary.new(hsh)
103
+
104
+ when 'array'
105
+ ary = Array.new
106
+
107
+ if node.has_elements? then
108
+ node.elements.each do |n|
109
+ ary.push import_xml(n)
110
+ end
111
+ end
112
+
113
+ ret = CFArray.new(ary)
114
+
115
+ when 'true'
116
+ ret = CFBoolean.new(true)
117
+ when 'false'
118
+ ret = CFBoolean.new(false)
119
+ when 'real'
120
+ ret = CFReal.new(get_value(node).to_f)
121
+ when 'integer'
122
+ ret = CFInteger.new(get_value(node).to_i)
123
+ when 'string'
124
+ ret = CFString.new(get_value(node))
125
+ when 'data'
126
+ ret = CFData.new(get_value(node))
127
+ when 'date'
128
+ ret = CFDate.new(CFDate.parse_date(get_value(node)))
129
+ end
130
+
131
+ return ret
132
+ end
133
+ end
134
+ end
135
+
136
+ # eof
metadata CHANGED
@@ -1,99 +1,67 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: CFPropertyList
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 2
7
- - 0
8
- - 17
9
- version: 2.0.17
3
+ version: !ruby/object:Gem::Version
4
+ version: '2.1'
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Christian Kruse
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-07-02 00:00:00 +02:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: libxml-ruby
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 1
30
- - 1
31
- - 0
32
- version: 1.1.0
33
- type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
12
+ date: 2012-04-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
36
15
  name: rake
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
16
+ requirement: &7342600 !ruby/object:Gem::Requirement
39
17
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- segments:
44
- - 0
45
- - 7
46
- - 0
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
47
21
  version: 0.7.0
48
- type: :runtime
49
- version_requirements: *id002
50
- description: This is a module to read, write and manipulate both binary and XML property lists as defined by apple.
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *7342600
25
+ description: This is a module to read, write and manipulate both binary and XML property
26
+ lists as defined by apple.
51
27
  email: cjk@wwwtech.de
52
28
  executables: []
53
-
54
29
  extensions: []
55
-
56
- extra_rdoc_files:
30
+ extra_rdoc_files:
57
31
  - README
58
- files:
59
- - lib/cfpropertylist.rb
60
- - lib/rbCFTypes.rb
61
- - lib/rbXMLCFPropertyList.rb
32
+ files:
62
33
  - lib/rbBinaryCFPropertyList.rb
34
+ - lib/rbREXMLParser.rb
63
35
  - lib/rbCFPlistError.rb
36
+ - lib/rbLibXMLParser.rb
37
+ - lib/rbCFTypes.rb
38
+ - lib/rbNokogiriParser.rb
64
39
  - lib/rbCFPropertyList.rb
40
+ - lib/cfpropertylist.rb
65
41
  - README
66
- has_rdoc: true
67
42
  homepage: http://github.com/ckruse/CFPropertyList
68
43
  licenses: []
69
-
70
44
  post_install_message:
71
45
  rdoc_options: []
72
-
73
- require_paths:
46
+ require_paths:
74
47
  - lib
75
- required_ruby_version: !ruby/object:Gem::Requirement
48
+ required_ruby_version: !ruby/object:Gem::Requirement
76
49
  none: false
77
- requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- segments:
81
- - 0
82
- version: "0"
83
- required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
55
  none: false
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- segments:
89
- - 0
90
- version: "0"
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
91
60
  requirements: []
92
-
93
- rubyforge_project: cfpropertylist
94
- rubygems_version: 1.3.7
61
+ rubyforge_project:
62
+ rubygems_version: 1.8.15
95
63
  signing_key:
96
64
  specification_version: 3
97
- summary: Read, write and manipulate both binary and XML property lists as defined by apple
65
+ summary: Read, write and manipulate both binary and XML property lists as defined
66
+ by apple
98
67
  test_files: []
99
-