plist_lite 1.2.0 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 185e2c46df646f8d59b7053b9085dea54e80e9120d4a8fa2ac5e7b8ca502aaa3
4
- data.tar.gz: 574a799dcc799b5652d505a6f2b4c8dd16befd1b40ab6d95a5d92c7257126a7c
3
+ metadata.gz: ebd3ee17ab3a2994503dc7006a9d273a3218ffef9c6e7c7fb8feb2e74d317cb0
4
+ data.tar.gz: b79e8ac3ac2db16863ca3bc5c82fd57328688cfdf03342b448ba9abfdc4630e9
5
5
  SHA512:
6
- metadata.gz: d8bed30ded79309cc7283a946e434e7b6628afbfa82697b0cd24a342de6d28aceb26f4e7a96b0f8b59d3ea46916e2d9da9d20e95d128b8ae4a16630872c27811
7
- data.tar.gz: a53e5624eb7523095d2b00d08a550e4fd6d20913f69a9fc229bd74fbba9342d994649c41fca3f502c25d846e2bd3778b7b8f084f3952053b201c36943faa8ed1
6
+ metadata.gz: d05eeaef2926f048c1726afedbcc1b230f1414115279afc33de5fd73d0f68f59ae8f89778670d76e24e180887dbc9b10f3286e53a89b4bd8241124a4f4acaa26
7
+ data.tar.gz: 7ef6591566645875a94dc592bbb553ed854924d54e050b8fb802e7da30bb95afcb739b129c518c165288d3db24683115b3f1334a61c60f2b8b249163c680c74e
Binary file
Binary file
@@ -0,0 +1 @@
1
+ <?xml version="1.0"?><!DOCTYPE plist SYSTEM "plist.dtd"><_/>
@@ -0,0 +1,19 @@
1
+ <!ENTITY % plistObject "(array | data | date | dict | real | integer | string | true | false )" >
2
+ <!ELEMENT plist %plistObject;>
3
+ <!ATTLIST plist version CDATA "1.0" >
4
+
5
+ <!-- Collections -->
6
+ <!ELEMENT array (%plistObject;)*>
7
+ <!ELEMENT dict (key, %plistObject;)*>
8
+ <!ELEMENT key (#PCDATA)>
9
+
10
+ <!--- Primitive types -->
11
+ <!ELEMENT string (#PCDATA)>
12
+ <!ELEMENT data (#PCDATA)> <!-- Contents interpreted as Base-64 encoded -->
13
+ <!ELEMENT date (#PCDATA)> <!-- Contents should conform to a subset of ISO 8601 (in particular, YYYY '-' MM '-' DD 'T' HH ':' MM ':' SS 'Z'. Smaller units may be omitted with a loss of precision) -->
14
+
15
+ <!-- Numerical primitives -->
16
+ <!ELEMENT true EMPTY> <!-- Boolean constant true -->
17
+ <!ELEMENT false EMPTY> <!-- Boolean constant false -->
18
+ <!ELEMENT real (#PCDATA)> <!-- Contents should represent a floating point number matching ("+" | "-")? d+ ("."d*)? ("E" ("+" | "-") d+)? where d is a digit 0-9. -->
19
+ <!ELEMENT integer (#PCDATA)> <!-- Contents should represent a (possibly signed) integer number in base 10 -->
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+ require 'time'
5
+ module PlistLite
6
+ DTD = Dir.chdir(__dir__) do
7
+ Nokogiri::XML::Document.parse(
8
+ IO.read("#{__dir__}/minimal.plist"), nil, nil,
9
+ Nokogiri::XML::ParseOptions.new(Nokogiri::XML::ParseOptions::DTDLOAD)
10
+ )
11
+ end.external_subset
12
+
13
+ # Defined in a module so that the C extension can override PlistLite.dump
14
+ # with a singleton method without triggering a method redefinition warning.
15
+ module PureRuby
16
+ def load(source)
17
+ doc = Nokogiri::XML::Document.parse(
18
+ source, nil, nil,
19
+ Nokogiri::XML::ParseOptions.new(Nokogiri::XML::ParseOptions::STRICT)
20
+ )
21
+ raise doc.errors.first unless doc.errors.empty?
22
+
23
+ errors = DTD.validate(doc)
24
+ raise errors.first unless errors.empty?
25
+
26
+ load_node(doc.root.elements.first)
27
+ end
28
+
29
+ def dump(obj)
30
+ output = +'<?xml version="1.0" encoding="UTF-8"?>' \
31
+ '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' \
32
+ '<plist version="1.0">'
33
+ dump_node(obj, output)
34
+ output << '</plist>'
35
+ end
36
+
37
+ private
38
+
39
+ def load_node(node)
40
+ case node.name
41
+ when 'dict'
42
+ hash = {}
43
+ node.elements.each_slice(2) do |key_node, value_node|
44
+ hash[key_node.text] = load_node(value_node)
45
+ end
46
+ hash
47
+ when 'array'
48
+ array = []
49
+ node.elements.each { |element| array << load_node(element) }
50
+ array
51
+ when 'integer' then node.text.to_i
52
+ when 'real' then node.text.to_f
53
+ when 'date' then Time.iso8601(node.text)
54
+ when 'string' then node.text
55
+ when 'data' then node.text.unpack1('m')
56
+ when 'true' then true
57
+ when 'false' then false
58
+ end
59
+ end
60
+
61
+ def dump_node(obj, output)
62
+ case obj
63
+ when Hash
64
+ output << '<dict>'
65
+ obj.each do |key, value|
66
+ case key
67
+ when String then output << "<key>#{key.encode(xml: :text)}</key>"
68
+ when Symbol then output << "<key>#{key}</key>"
69
+ else output << "<key>#{key}</key>"
70
+ end
71
+ dump_node(value, output)
72
+ end
73
+ output << '</dict>'
74
+ when Array
75
+ output << '<array>'
76
+ obj.each { |i| dump_node(i, output) }
77
+ output << '</array>'
78
+ when Symbol then output << "<string>#{obj}</string>"
79
+ when String
80
+ output <<
81
+ case obj.encoding
82
+ when Encoding::ASCII_8BIT then "<data>#{[obj].pack('m')}</data>"
83
+ when Encoding::UTF_8 then "<string>#{obj.encode(xml: :text)}</string>"
84
+ else "<string>#{obj.encode(Encoding::UTF_8, xml: :text)}</string>"
85
+ end
86
+ when Integer then output << "<integer>#{obj}</integer>"
87
+ when Float then output << "<real>#{obj}</real>"
88
+ when true then output << '<true/>'
89
+ when false then output << '<false/>'
90
+ when Time then output << "<date>#{Time.at(obj).utc.iso8601}</date>"
91
+ when DateTime then output << "<date>#{obj.to_time.utc.iso8601}</date>"
92
+ when Date
93
+ warn 'Consider not using Date object because it does not contain time zone information'
94
+ output << "<date>#{obj.iso8601}T00:00:00Z</date>"
95
+ else raise ArgumentError, "unknown type: #{obj.class}"
96
+ end
97
+ end
98
+ end
99
+
100
+ extend PureRuby
101
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plist_lite
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Weihang Jian
@@ -13,72 +13,72 @@ dependencies:
13
13
  name: nokogiri
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - "~>"
16
+ - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '1.0'
18
+ version: '0'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
- - - "~>"
23
+ - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '1.0'
25
+ version: '0'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: bundler
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
- - - "~>"
30
+ - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: '2.0'
32
+ version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '2.0'
39
+ version: '0'
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: minitest
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - "~>"
44
+ - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: '5.0'
46
+ version: '0'
47
47
  type: :development
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: '5.0'
53
+ version: '0'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: rake
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - "~>"
58
+ - - ">="
59
59
  - !ruby/object:Gem::Version
60
- version: '13.0'
60
+ version: '0'
61
61
  type: :development
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - "~>"
65
+ - - ">="
66
66
  - !ruby/object:Gem::Version
67
- version: '13.0'
67
+ version: '0'
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: rake-compiler
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - "~>"
72
+ - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: '1.0'
74
+ version: '0'
75
75
  type: :development
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - "~>"
79
+ - - ">="
80
80
  - !ruby/object:Gem::Version
81
- version: '1.0'
81
+ version: '0'
82
82
  description: plist_lite is the fastest plist processor for Ruby written in C.It can
83
83
  convert Ruby object to XML plist (a.k.a. property list), vice versa.
84
84
  email: tonytonyjan@gmail.com
@@ -90,6 +90,11 @@ files:
90
90
  - ext/plist_lite/ext/ext.c
91
91
  - ext/plist_lite/ext/extconf.rb
92
92
  - lib/plist_lite.rb
93
+ - lib/plist_lite/ext.bundle
94
+ - lib/plist_lite/ext.so
95
+ - lib/plist_lite/minimal.plist
96
+ - lib/plist_lite/plist.dtd
97
+ - lib/plist_lite/pure_ruby.rb
93
98
  homepage: https://github.com/tonytonyjan/plist_lite
94
99
  licenses:
95
100
  - MIT
@@ -108,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
113
  - !ruby/object:Gem::Version
109
114
  version: '0'
110
115
  requirements: []
111
- rubygems_version: 3.6.9
116
+ rubygems_version: 4.0.21
112
117
  specification_version: 4
113
118
  summary: plist_lite is the fastest plist processor for Ruby written in C.
114
119
  test_files: []