RbYAML 0.0.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.
Files changed (66) hide show
  1. data/LICENSE +19 -0
  2. data/README +31 -0
  3. data/lib/rbyaml.rb +378 -0
  4. data/lib/rbyaml/composer.rb +189 -0
  5. data/lib/rbyaml/constructor.rb +374 -0
  6. data/lib/rbyaml/detector.rb +44 -0
  7. data/lib/rbyaml/dumper.rb +40 -0
  8. data/lib/rbyaml/emitter.rb +1116 -0
  9. data/lib/rbyaml/error.rb +81 -0
  10. data/lib/rbyaml/events.rb +92 -0
  11. data/lib/rbyaml/loader.rb +49 -0
  12. data/lib/rbyaml/nodes.rb +69 -0
  13. data/lib/rbyaml/parser.rb +488 -0
  14. data/lib/rbyaml/reader.rb +127 -0
  15. data/lib/rbyaml/representer.rb +183 -0
  16. data/lib/rbyaml/scanner.rb +1258 -0
  17. data/lib/rbyaml/serializer.rb +120 -0
  18. data/lib/rbyaml/test.rb +56 -0
  19. data/lib/rbyaml/tokens.rb +163 -0
  20. data/lib/rbyaml/yaml.rb +143 -0
  21. data/test/test_rbyaml.rb +18 -0
  22. data/test/yaml/gems.yml +130951 -0
  23. data/test/yaml/gems2.yml +113 -0
  24. data/test/yaml/test1.yml +3 -0
  25. data/test/yaml/test10.yml +8 -0
  26. data/test/yaml/test12.yml +8 -0
  27. data/test/yaml/test13.yml +4 -0
  28. data/test/yaml/test14.yml +4 -0
  29. data/test/yaml/test15.yml +8 -0
  30. data/test/yaml/test16.yml +7 -0
  31. data/test/yaml/test18.yml +6 -0
  32. data/test/yaml/test19.yml +5 -0
  33. data/test/yaml/test2.yml +3 -0
  34. data/test/yaml/test20.yml +6 -0
  35. data/test/yaml/test21.yml +4 -0
  36. data/test/yaml/test22.yml +4 -0
  37. data/test/yaml/test23.yml +13 -0
  38. data/test/yaml/test24.yml +14 -0
  39. data/test/yaml/test25.yml +7 -0
  40. data/test/yaml/test26.yml +7 -0
  41. data/test/yaml/test27.yml +29 -0
  42. data/test/yaml/test28.yml +26 -0
  43. data/test/yaml/test29.yml +13 -0
  44. data/test/yaml/test3.yml +8 -0
  45. data/test/yaml/test30.yml +7 -0
  46. data/test/yaml/test31.yml +2 -0
  47. data/test/yaml/test32.yml +13 -0
  48. data/test/yaml/test33.yml +2 -0
  49. data/test/yaml/test34.yml +8 -0
  50. data/test/yaml/test35.yml +4 -0
  51. data/test/yaml/test36.yml +8 -0
  52. data/test/yaml/test37.yml +2 -0
  53. data/test/yaml/test38.yml +8 -0
  54. data/test/yaml/test39.yml +2 -0
  55. data/test/yaml/test4.yml +8 -0
  56. data/test/yaml/test40.yml +3 -0
  57. data/test/yaml/test41.yml +5 -0
  58. data/test/yaml/test42.yml +12 -0
  59. data/test/yaml/test43.yml +15 -0
  60. data/test/yaml/test44.yml +23 -0
  61. data/test/yaml/test5.yml +3 -0
  62. data/test/yaml/test6.yml +5 -0
  63. data/test/yaml/test7.yml +10 -0
  64. data/test/yaml/test8.yml +10 -0
  65. data/test/yaml/test9.yml +8 -0
  66. metadata +111 -0
@@ -0,0 +1,120 @@
1
+ require 'rbyaml/error'
2
+ require 'rbyaml/events'
3
+ require 'rbyaml/nodes'
4
+
5
+ module RbYAML
6
+ class SerializerError < YAMLError
7
+ end
8
+
9
+ module Serializer
10
+ ANCHOR_TEMPLATE = "id%03d"
11
+
12
+ def initialize_serializer(explicit_start=nil, explicit_end=nil, version=nil, tags=nil)
13
+ @use_explicit_start = explicit_start
14
+ @use_explicit_end = explicit_end
15
+ @use_version = version
16
+ @use_tags = tags
17
+ @serialized_nodes = {}
18
+ @anchors = {}
19
+ @last_anchor_id = 0
20
+ @closed = nil
21
+ end
22
+
23
+ def open
24
+ if @closed.nil?
25
+ emit(StreamStartEvent.new)
26
+ @closed = false
27
+ elsif @closed
28
+ raise SerializerError.new("serializer is closed")
29
+ else
30
+ raise SerializerError.new("serializer is already opened")
31
+ end
32
+ end
33
+
34
+ def close
35
+ if @closed.nil?
36
+ raise SerializerError.new("serializer is not opened")
37
+ elsif !@closed
38
+ emit(StreamEndEvent.new)
39
+ @closed = true
40
+ end
41
+ end
42
+
43
+ def serialize(node)
44
+ if @closed.nil?
45
+ raise SerializerError.new("serializer is not opened")
46
+ elsif @closed
47
+ raise SerializerError.new("serializer is closed")
48
+ end
49
+ emit(DocumentStartEvent.new(@use_explicit_start,@use_version,@use_tags))
50
+ anchor_node(node)
51
+ serialize_node(node)
52
+ emit(DocumentEndEvent.new(@use_explicit_end))
53
+ @serialized_nodes = {}
54
+ @anchors = {}
55
+ @last_alias_id = 0
56
+ end
57
+
58
+ def anchor_node(node)
59
+ if @anchors.include?(node)
60
+ @anchors[node] ||= generate_anchor(node)
61
+ else
62
+ @anchors[node] = nil
63
+ if SequenceNode === node
64
+ for item in node.value
65
+ anchor_node(item)
66
+ end
67
+ elsif MappingNode === node
68
+ for key in node.value.keys
69
+ anchor_node(key)
70
+ anchor_node(node.value[key])
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ def generate_anchor(node)
77
+ @last_anchor_id += 1
78
+ ANCHOR_TEMPLATE % @last_anchor_id
79
+ end
80
+
81
+ def serialize_node(node)
82
+ talias = @anchors[node]
83
+ if @serialized_nodes.include?(node)
84
+ emit(AliasEvent.new(talias))
85
+ else
86
+ @serialized_nodes[node] = true
87
+ if ScalarNode === node
88
+ detected_tag = detect(node.value)
89
+ implicit = node.tag == detect(node.value) || (node.tag == DEFAULT_SCALAR_TAG && detected_tag.nil?)
90
+ emit(ScalarEvent.new(talias, node.tag, implicit, node.value,nil,nil,node.style))
91
+ elsif SequenceNode === node
92
+ tag = node.tag
93
+ tag = nil if tag == DEFAULT_SEQUENCE_TAG && !@canonical
94
+ emit(SequenceStartEvent.new(talias, tag,nil,nil,node.flow_style))
95
+ for item in node.value
96
+ serialize_node(item)
97
+ end
98
+ emit(SequenceEndEvent.new)
99
+ elsif MappingNode === node
100
+ tag = node.tag
101
+ tag = nil if tag == DEFAULT_MAPPING_TAG && !@canonical
102
+ emit(MappingStartEvent.new(talias, tag,nil,nil,node.flow_style))
103
+ if node.value.respond_to?(:keys)
104
+ for key in node.value.keys
105
+ serialize_node(key)
106
+ serialize_node(node.value[key])
107
+ end
108
+ else
109
+ for key, value in node.value
110
+ serialize_node(key)
111
+ serialize_node(value)
112
+ end
113
+ end
114
+ emit(MappingEndEvent.new)
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+
@@ -0,0 +1,56 @@
1
+ require 'rbyaml/error'
2
+ require 'rbyaml/reader'
3
+ require 'rbyaml/scanner'
4
+ require 'rbyaml/parser'
5
+ require 'rbyaml/composer'
6
+ require 'rbyaml/constructor'
7
+ require 'rbyaml/detector'
8
+
9
+ class RbYAMLTester
10
+ include RbYAML::Reader, RbYAML::Scanner, RbYAML::Parser
11
+
12
+ def initialize(stream)
13
+ initialize_reader(stream)
14
+ initialize_scanner
15
+ initialize_parser
16
+ end
17
+ end
18
+
19
+ class RbYAMLTester2
20
+ include RbYAML::Reader, RbYAML::Scanner, RbYAML::Parser, RbYAML::Composer
21
+
22
+ def initialize(stream)
23
+ initialize_reader(stream)
24
+ initialize_scanner
25
+ initialize_parser
26
+ initialize_composer
27
+ end
28
+ end
29
+
30
+ class RbYAMLTester3
31
+ include RbYAML::Reader, RbYAML::Scanner, RbYAML::Parser, RbYAML::Composer, RbYAML::Constructor, RbYAML::Detector
32
+
33
+ def initialize(stream)
34
+ initialize_reader(stream)
35
+ initialize_scanner
36
+ initialize_parser
37
+ initialize_composer
38
+ initialize_constructor
39
+ end
40
+ end
41
+
42
+ i=0
43
+ begin
44
+ File.open(ARGV.shift) {|f|
45
+ tester = RbYAMLTester3.new(f)
46
+ tester.each_document {|doc|
47
+ puts "#{doc.inspect}"
48
+ # i += 1
49
+ # if (i%10000) == 0
50
+ # puts "token ##{i}"
51
+ # end
52
+ }
53
+ }
54
+ rescue RbYAML::MarkedYAMLError => err
55
+ puts "MarkedYAMLError: #{err}"
56
+ end
@@ -0,0 +1,163 @@
1
+
2
+ module RbYAML
3
+ class Token
4
+ attr_reader :start_mark, :end_mark
5
+ def initialize(start_mark, end_mark)
6
+ @start_mark = start_mark
7
+ @end_mark = end_mark
8
+ end
9
+ end
10
+
11
+ class DirectiveToken < Token
12
+ def tid
13
+ "<directive>"
14
+ end
15
+ attr_reader :name, :value
16
+ def initialize(name, value, start_mark, end_mark)
17
+ super(start_mark,end_mark)
18
+ @name = name
19
+ @value = value
20
+ end
21
+ end
22
+
23
+ class DocumentStartToken < Token
24
+ def tid
25
+ "<document start>"
26
+ end
27
+ end
28
+
29
+ class DocumentEndToken < Token
30
+ def tid
31
+ "<document end>"
32
+ end
33
+ end
34
+
35
+ class StreamStartToken < Token
36
+ def tid
37
+ "<stream start>"
38
+ end
39
+ attr_reader :encoding
40
+ def initialize(start_mark=nil, end_mark=nil, encoding=nil)
41
+ super(start_mark,end_mark)
42
+ @encoding = encoding
43
+ end
44
+ end
45
+
46
+ class StreamEndToken < Token
47
+ def tid
48
+ "<stream end>"
49
+ end
50
+ end
51
+
52
+ class BlockSequenceStartToken < Token
53
+ def tid
54
+ "<block sequence start>"
55
+ end
56
+ end
57
+
58
+ class BlockMappingStartToken < Token
59
+ def tid
60
+ "<block mapping start>"
61
+ end
62
+ end
63
+
64
+ class BlockEndToken < Token
65
+ def tid
66
+ "<block end>"
67
+ end
68
+ end
69
+
70
+ class FlowSequenceStartToken < Token
71
+ def tid
72
+ "["
73
+ end
74
+ end
75
+
76
+ class FlowMappingStartToken < Token
77
+ def tid
78
+ "{"
79
+ end
80
+ end
81
+
82
+ class FlowSequenceEndToken < Token
83
+ def tid
84
+ "]"
85
+ end
86
+ end
87
+
88
+ class FlowMappingEndToken < Token
89
+ def tid
90
+ "}"
91
+ end
92
+ end
93
+
94
+ class KeyToken < Token
95
+ def tid
96
+ "?"
97
+ end
98
+ end
99
+
100
+ class ValueToken < Token
101
+ def tid
102
+ ":"
103
+ end
104
+ end
105
+
106
+ class BlockEntryToken < Token
107
+ def tid
108
+ "-"
109
+ end
110
+ end
111
+
112
+ class FlowEntryToken < Token
113
+ def tid
114
+ ","
115
+ end
116
+ end
117
+
118
+ class AliasToken < Token
119
+ def tid
120
+ "<alias>"
121
+ end
122
+ attr_reader :value
123
+ def initialize(value, start_mark, end_mark)
124
+ super(start_mark,end_mark)
125
+ @value = value
126
+ end
127
+ end
128
+
129
+ class AnchorToken < Token
130
+ def tid
131
+ "<anchor>"
132
+ end
133
+ attr_reader :value
134
+ def initialize(value, start_mark, end_mark)
135
+ super(start_mark,end_mark)
136
+ @value = value
137
+ end
138
+ end
139
+
140
+ class TagToken < Token
141
+ def tid
142
+ "<tag>"
143
+ end
144
+ attr_reader :value
145
+ def initialize(value, start_mark, end_mark)
146
+ super(start_mark,end_mark)
147
+ @value = value
148
+ end
149
+ end
150
+
151
+ class ScalarToken < Token
152
+ def tid
153
+ "<scalar>"
154
+ end
155
+ attr_reader :value, :implicit, :style
156
+ def initialize(value, implicit, start_mark, end_mark, style=nil)
157
+ super(start_mark, end_mark)
158
+ @value = value
159
+ @implicit = implicit
160
+ @style = style
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,143 @@
1
+ require 'stringio'
2
+
3
+ require 'rbyaml/error'
4
+
5
+ require 'rbyaml/reader'
6
+ require 'rbyaml/scanner'
7
+ require 'rbyaml/parser'
8
+ require 'rbyaml/composer'
9
+ require 'rbyaml/constructor'
10
+
11
+ require 'rbyaml/emitter'
12
+ require 'rbyaml/serializer'
13
+ require 'rbyaml/representer'
14
+
15
+ require 'rbyaml/detector'
16
+
17
+ require 'rbyaml/tokens'
18
+ require 'rbyaml/events'
19
+ require 'rbyaml/nodes'
20
+
21
+ require 'rbyaml/loader'
22
+ require 'rbyaml/dumper'
23
+
24
+ module RbYAML
25
+ def self._scan(stream, loader=Loader)
26
+ l = loader.new(stream)
27
+ yield l.get_token while l.check_token
28
+ end
29
+
30
+ def self._parse(stream, loader=Loader)
31
+ l = loader.new(stream)
32
+ yield l.get_event while l.check_event
33
+ end
34
+
35
+ def self._compose(stream, loader=Loader)
36
+ l = loader.new(stream)
37
+ l.get_node if l.check_node
38
+ end
39
+
40
+ def self._compose_all(stream, loader=Loader)
41
+ l = loader.new(stream)
42
+ yield l.get_node while l.check_node
43
+ end
44
+
45
+ def self._load_all(stream, loader=Loader)
46
+ l = loader.new(stream)
47
+ yield l.get_data while l.check_data
48
+ end
49
+
50
+ def self._load(stream, loader=Loader)
51
+ l = loader.new(stream)
52
+ l.get_data if l.check_data
53
+ end
54
+
55
+ def self._safe_load_all(stream)
56
+ _load_all(stream, SafeLoader)
57
+ end
58
+
59
+ def self._safe_load(stream)
60
+ _load(stream, SafeLoader)
61
+ end
62
+
63
+ def self._emit(events, stream=nil, dumper=Dumper,canonical=nil, indent=nil, width=nil,line_break=nil)
64
+ if stream.nil?
65
+ require 'stringio'
66
+ stream = StringIO.new
67
+ end
68
+ dumper = dumper.new(stream,canonical,indent,width,line_break)
69
+ for event in events
70
+ dumper.emit(event)
71
+ end
72
+ stream.string if StringIO === stream
73
+ end
74
+
75
+ def self._serialize_all(nodes,stream=nil,dumper=Dumper,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
76
+ if stream.nil?
77
+ require 'stringio'
78
+ stream = StringIO.new
79
+ end
80
+ dumper = dumper.new(stream,canonical,indent,width,line_break,version,tags,explicit_start,explicit_end)
81
+ dumper.open
82
+ for node in nodes
83
+ dumper.serialize(node)
84
+ end
85
+ dumper.close
86
+ stream.string if StringIO === stream
87
+ end
88
+
89
+ def self._serialize(node, stream=nil, dumper=Dumper, *kwds)
90
+ _serialize_all([node], stream, dumper, *kwds)
91
+ end
92
+
93
+ def self._dump_all(documents,stream=nil,dumper=Dumper,canonical=nil,indent=nil,width=nil,line_break=nil,explicit_start=nil,explicit_end=nil,version=nil,tags=nil)
94
+ if stream.nil?
95
+ require 'stringio'
96
+ stream = StringIO.new
97
+ end
98
+ dumper = dumper.new(stream,canonical,indent,width,line_break,version,tags,explicit_start,explicit_end)
99
+ dumper.open
100
+ for data in documents
101
+ dumper.represent(data)
102
+ end
103
+ dumper.close
104
+ stream.string if StringIO === stream
105
+ end
106
+
107
+ def self._dump(data, stream=nil, dumper=Dumper, *kwds)
108
+ _dump_all([data], stream, dumper, *kwds)
109
+ end
110
+
111
+ def self._safe_dump_all(documents, stream=nil, *kwds)
112
+ _dump_all(documents, stream, SafeDumper, *kwds)
113
+ end
114
+
115
+ def self._safe_dump(data, stream=nil, *kwds)
116
+ _dump_all([data], stream, SafeDumper, *kwds)
117
+ end
118
+
119
+ def self._add_detector(tag, regexp, first=nil, loader=Loader, dumper=Dumper)
120
+ loader.add_detector(tag, regexp, first)
121
+ dumper.add_detector(tag, regexp, first)
122
+ end
123
+
124
+ def self._add_resolver(tag, path, loader=Loader)
125
+ loader.add_resolver(tag, path)
126
+ end
127
+
128
+ def self._add_constructor(tag, constructor, loader=Loader)
129
+ loader.add_constructor(tag, constructor)
130
+ end
131
+
132
+ def self._add_multi_constructor(tag_prefix, multi_constructor, loader=Loader)
133
+ loader.add_multi_constructor(tag_prefix, multi_constructor)
134
+ end
135
+
136
+ def self._dump_ruby_object(data, dumper=Dumper)
137
+ _dump(data,nil,dumper)
138
+ end
139
+
140
+ class SimpleDetector
141
+ include Detector
142
+ end
143
+ end