mkrf 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. data/CHANGELOG +2 -0
  2. data/MIT-LICENSE +7 -0
  3. data/README +54 -0
  4. data/Rakefile +107 -0
  5. data/lib/mkrf.rb +4 -0
  6. data/lib/mkrf/availability.rb +219 -0
  7. data/lib/mkrf/generator.rb +146 -0
  8. data/test/abstract_unit.rb +4 -0
  9. data/test/fixtures/down_a_directory/header_down_a_directory.h +1 -0
  10. data/test/fixtures/stdmkrf.h +1 -0
  11. data/test/sample_files/libtrivial/Rakefile +31 -0
  12. data/test/sample_files/libtrivial/extconf.rb +3 -0
  13. data/test/sample_files/libtrivial/lib/libtrivial.c +5 -0
  14. data/test/sample_files/libtrivial/lib/libtrivial.o +0 -0
  15. data/test/sample_files/libtrivial/libtrivial_so.bundle +0 -0
  16. data/test/sample_files/libtrivial/mkrf.log +1 -0
  17. data/test/sample_files/libxml-ruby-0.3.8/CHANGELOG +74 -0
  18. data/test/sample_files/libxml-ruby-0.3.8/LICENSE +22 -0
  19. data/test/sample_files/libxml-ruby-0.3.8/README +144 -0
  20. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/cbg.c +76 -0
  21. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/extconf.rb +49 -0
  22. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/libxml.c +86 -0
  23. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/libxml.h +82 -0
  24. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/libxml.rb +107 -0
  25. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/mkrf.log +1 -0
  26. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/old_extconf.rb +95 -0
  27. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_attr.c +372 -0
  28. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_attr.h +21 -0
  29. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_attribute.c +224 -0
  30. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_attribute.h +21 -0
  31. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_document.c +1159 -0
  32. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_document.h +27 -0
  33. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_dtd.c +168 -0
  34. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_dtd.h +17 -0
  35. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_input_cbg.c +167 -0
  36. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_input_cbg.h +21 -0
  37. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_node.c +2139 -0
  38. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_node.h +28 -0
  39. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_node_set.c +248 -0
  40. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_node_set.h +26 -0
  41. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_ns.c +153 -0
  42. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_ns.h +21 -0
  43. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_parser.c +1417 -0
  44. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_parser.h +31 -0
  45. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_parser_context.c +715 -0
  46. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_parser_context.h +22 -0
  47. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_sax_parser.c +426 -0
  48. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_sax_parser.h +52 -0
  49. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_schema.c +142 -0
  50. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_schema.h +16 -0
  51. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_tree.c +43 -0
  52. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_tree.h +12 -0
  53. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xinclude.c +20 -0
  54. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xinclude.h +13 -0
  55. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpath.c +363 -0
  56. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpath.h +24 -0
  57. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpath_context.c +125 -0
  58. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpath_context.h +24 -0
  59. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpointer.c +100 -0
  60. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpointer.h +27 -0
  61. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpointer_context.c +21 -0
  62. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpointer_context.h +18 -0
  63. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/sax_parser_callbacks.inc +202 -0
  64. data/test/sample_files/syck-0.55/CHANGELOG +186 -0
  65. data/test/sample_files/syck-0.55/COPYING +54 -0
  66. data/test/sample_files/syck-0.55/Makefile +582 -0
  67. data/test/sample_files/syck-0.55/Makefile.am +5 -0
  68. data/test/sample_files/syck-0.55/Makefile.in +582 -0
  69. data/test/sample_files/syck-0.55/README +105 -0
  70. data/test/sample_files/syck-0.55/README.BYTECODE +484 -0
  71. data/test/sample_files/syck-0.55/README.EXT +444 -0
  72. data/test/sample_files/syck-0.55/RELEASE +123 -0
  73. data/test/sample_files/syck-0.55/TODO +25 -0
  74. data/test/sample_files/syck-0.55/aclocal.m4 +883 -0
  75. data/test/sample_files/syck-0.55/bootstrap +7 -0
  76. data/test/sample_files/syck-0.55/config.h +79 -0
  77. data/test/sample_files/syck-0.55/config.h.in +78 -0
  78. data/test/sample_files/syck-0.55/config.status +1197 -0
  79. data/test/sample_files/syck-0.55/config/README +14 -0
  80. data/test/sample_files/syck-0.55/config/depcomp +529 -0
  81. data/test/sample_files/syck-0.55/config/install-sh +323 -0
  82. data/test/sample_files/syck-0.55/config/missing +357 -0
  83. data/test/sample_files/syck-0.55/configure +6728 -0
  84. data/test/sample_files/syck-0.55/configure.in +36 -0
  85. data/test/sample_files/syck-0.55/ext/ruby/CHANGELOG +303 -0
  86. data/test/sample_files/syck-0.55/ext/ruby/README +400 -0
  87. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/MANIFEST +1 -0
  88. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/bytecode.c +1170 -0
  89. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/emitter.c +1224 -0
  90. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/extconf.rb +10 -0
  91. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/gram.c +1894 -0
  92. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/gram.h +79 -0
  93. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/handler.c +174 -0
  94. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/implicit.c +2989 -0
  95. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/mkrf.log +1 -0
  96. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/node.c +407 -0
  97. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/rubyext.c +2385 -0
  98. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/syck.c +504 -0
  99. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/syck.h +458 -0
  100. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/token.c +2707 -0
  101. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/yaml2byte.c +250 -0
  102. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/yamlbyte.h +170 -0
  103. data/test/sample_files/syck-0.55/ext/ruby/install.rb +1022 -0
  104. data/test/sample_files/syck-0.55/ext/ruby/lib/okay.rb +161 -0
  105. data/test/sample_files/syck-0.55/ext/ruby/lib/okay/news.rb +69 -0
  106. data/test/sample_files/syck-0.55/ext/ruby/lib/okay/rpc.rb +434 -0
  107. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml.rb +436 -0
  108. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/baseemitter.rb +247 -0
  109. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/basenode.rb +216 -0
  110. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/compat.rb +26 -0
  111. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/constants.rb +45 -0
  112. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/dbm.rb +111 -0
  113. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/emitter.rb +107 -0
  114. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/encoding.rb +33 -0
  115. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/error.rb +34 -0
  116. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/rubytypes.rb +438 -0
  117. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/store.rb +29 -0
  118. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/stream.rb +40 -0
  119. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/stringio.rb +83 -0
  120. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/syck.rb +19 -0
  121. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/tag.rb +86 -0
  122. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/types.rb +188 -0
  123. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/yamlnode.rb +54 -0
  124. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/ypath.rb +52 -0
  125. data/test/sample_files/syck-0.55/ext/ruby/lib/yod.rb +1168 -0
  126. data/test/sample_files/syck-0.55/ext/ruby/samples/okayNews-modules.rb +27 -0
  127. data/test/sample_files/syck-0.55/ext/ruby/samples/okayNews-sample.rb +336 -0
  128. data/test/sample_files/syck-0.55/ext/ruby/samples/okayNews-validate.rb +341 -0
  129. data/test/sample_files/syck-0.55/ext/ruby/samples/okayRpc-client.rb +51 -0
  130. data/test/sample_files/syck-0.55/ext/ruby/samples/okayRpc-server.rb +85 -0
  131. data/test/sample_files/syck-0.55/ext/ruby/samples/yaml-sortHashKeys.rb +128 -0
  132. data/test/sample_files/syck-0.55/ext/ruby/tests/basic.rb +1653 -0
  133. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsAnchorAlias.yml +51 -0
  134. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsBasicTests.yml +282 -0
  135. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsBlockMapping.yml +78 -0
  136. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsBlockSequence.yml +0 -0
  137. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsDocumentSeparator.yml +102 -0
  138. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsErrorTests.yml +23 -0
  139. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsFlowCollections.yml +73 -0
  140. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsFoldedScalars.yml +215 -0
  141. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsMapInSeq.yml +0 -0
  142. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsNullsAndEmpties.yml +66 -0
  143. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsRubyTests.yml +182 -0
  144. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsSpecificationExamples.yml +2699 -0
  145. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsTypeTransfers.yml +265 -0
  146. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsYpath.yml +221 -0
  147. data/test/sample_files/syck-0.55/ext/ruby/yts/cookbook.rb +159 -0
  148. data/test/sample_files/syck-0.55/ext/ruby/yts/index.yml +10 -0
  149. data/test/sample_files/syck-0.55/ext/ruby/yts/yts.rb +193 -0
  150. data/test/sample_files/syck-0.55/lib/Makefile +497 -0
  151. data/test/sample_files/syck-0.55/lib/Makefile.am +27 -0
  152. data/test/sample_files/syck-0.55/lib/Makefile.in +497 -0
  153. data/test/sample_files/syck-0.55/lib/bytecode.c +1170 -0
  154. data/test/sample_files/syck-0.55/lib/bytecode.re +525 -0
  155. data/test/sample_files/syck-0.55/lib/emitter.c +1224 -0
  156. data/test/sample_files/syck-0.55/lib/gram.c +1894 -0
  157. data/test/sample_files/syck-0.55/lib/gram.h +79 -0
  158. data/test/sample_files/syck-0.55/lib/gram.output +2005 -0
  159. data/test/sample_files/syck-0.55/lib/gram.y +481 -0
  160. data/test/sample_files/syck-0.55/lib/handler.c +174 -0
  161. data/test/sample_files/syck-0.55/lib/implicit.c +2989 -0
  162. data/test/sample_files/syck-0.55/lib/implicit.re +206 -0
  163. data/test/sample_files/syck-0.55/lib/node.c +407 -0
  164. data/test/sample_files/syck-0.55/lib/syck.c +504 -0
  165. data/test/sample_files/syck-0.55/lib/syck.h +458 -0
  166. data/test/sample_files/syck-0.55/lib/syck_st.c +577 -0
  167. data/test/sample_files/syck-0.55/lib/syck_st.h +46 -0
  168. data/test/sample_files/syck-0.55/lib/token.c +2707 -0
  169. data/test/sample_files/syck-0.55/lib/token.re +1139 -0
  170. data/test/sample_files/syck-0.55/lib/yaml2byte.c +250 -0
  171. data/test/sample_files/syck-0.55/lib/yamlbyte.h +170 -0
  172. data/test/sample_files/syck-0.55/stamp-h1 +1 -0
  173. data/test/sample_files/syck-0.55/tests/Basic.c +141 -0
  174. data/test/sample_files/syck-0.55/tests/CuTest.c +294 -0
  175. data/test/sample_files/syck-0.55/tests/CuTest.h +84 -0
  176. data/test/sample_files/syck-0.55/tests/Emit.c +87 -0
  177. data/test/sample_files/syck-0.55/tests/Makefile +480 -0
  178. data/test/sample_files/syck-0.55/tests/Makefile.am +13 -0
  179. data/test/sample_files/syck-0.55/tests/Makefile.in +480 -0
  180. data/test/sample_files/syck-0.55/tests/Parse.c +208 -0
  181. data/test/sample_files/syck-0.55/tests/YTS.c +2310 -0
  182. data/test/sample_files/syck-0.55/tests/YTS.c.erb +326 -0
  183. data/test/sample_files/syck-0.55/tests/YTS.c.rb +44 -0
  184. data/test/test_availability.rb +68 -0
  185. data/test/test_generator.rb +74 -0
  186. metadata +252 -0
@@ -0,0 +1,436 @@
1
+ # -*- mode: ruby; ruby-indent-level: 4; tab-width: 4 -*- vim: sw=4 ts=4
2
+ # $Id: yaml.rb,v 1.30 2005/04/07 16:22:02 why Exp $
3
+ #
4
+ # = yaml.rb: top-level module with methods for loading and parsing YAML documents
5
+ #
6
+ # Author:: why the lucky stiff
7
+ #
8
+
9
+ require 'stringio'
10
+ require 'yaml/compat'
11
+ require 'yaml/error'
12
+ require 'yaml/syck'
13
+ require 'yaml/tag'
14
+ require 'yaml/stream'
15
+
16
+ # == YAML
17
+ #
18
+ # YAML(tm) (rhymes with 'camel') is a
19
+ # straightforward machine parsable data serialization format designed for
20
+ # human readability and interaction with scripting languages such as Perl
21
+ # and Python. YAML is optimized for data serialization, formatted
22
+ # dumping, configuration files, log files, Internet messaging and
23
+ # filtering. This specification describes the YAML information model and
24
+ # serialization format. Together with the Unicode standard for characters, it
25
+ # provides all the information necessary to understand YAML Version 1.0
26
+ # and construct computer programs to process it.
27
+ #
28
+ # See http://yaml.org/ for more information. For a quick tutorial, please
29
+ # visit YAML In Five Minutes (http://yaml.kwiki.org/?YamlInFiveMinutes).
30
+ #
31
+ # == About This Library
32
+ #
33
+ # The YAML 1.0 specification outlines four stages of YAML loading and dumping.
34
+ # This library honors all four of those stages, although data is really only
35
+ # available to you in three stages.
36
+ #
37
+ # The four stages are: native, representation, serialization, and presentation.
38
+ #
39
+ # The native stage refers to data which has been loaded completely into Ruby's
40
+ # own types. (See +YAML::load+.)
41
+ #
42
+ # The representation stage means data which has been composed into
43
+ # +YAML::BaseNode+ objects. In this stage, the document is available as a
44
+ # tree of node objects. You can perform YPath queries and transformations
45
+ # at this level. (See +YAML::parse+.)
46
+ #
47
+ # The serialization stage happens inside the parser. The YAML parser used in
48
+ # Ruby is called Syck. Serialized nodes are available in the extension as
49
+ # SyckNode structs.
50
+ #
51
+ # The presentation stage is the YAML document itself. This is accessible
52
+ # to you as a string. (See +YAML::dump+.)
53
+ #
54
+ # For more information about the various information models, see Chapter
55
+ # 3 of the YAML 1.0 Specification (http://yaml.org/spec/#id2491269).
56
+ #
57
+ # The YAML module provides quick access to the most common loading (YAML::load)
58
+ # and dumping (YAML::dump) tasks. This module also provides an API for registering
59
+ # global types (YAML::add_domain_type).
60
+ #
61
+ # == Example
62
+ #
63
+ # A simple round-trip (load and dump) of an object.
64
+ #
65
+ # require "yaml"
66
+ #
67
+ # test_obj = ["dogs", "cats", "badgers"]
68
+ #
69
+ # yaml_obj = YAML::dump( test_obj )
70
+ # # -> ---
71
+ # - dogs
72
+ # - cats
73
+ # - badgers
74
+ # ruby_obj = YAML::load( yaml_obj )
75
+ # # => ["dogs", "cats", "badgers"]
76
+ # ruby_obj == test_obj
77
+ # # => true
78
+ #
79
+ # To register your custom types with the global resolver, use +add_domain_type+.
80
+ #
81
+ # YAML::add_domain_type( "your-site.com,2004", "widget" ) do |type, val|
82
+ # Widget.new( val )
83
+ # end
84
+ #
85
+ module YAML
86
+
87
+ Resolver = YAML::Syck::Resolver
88
+ DefaultResolver = YAML::Syck::DefaultResolver
89
+ DefaultResolver.use_types_at( @@tagged_classes )
90
+ GenericResolver = YAML::Syck::GenericResolver
91
+ Parser = YAML::Syck::Parser
92
+ Emitter = YAML::Syck::Emitter
93
+
94
+ # Returns a new default parser
95
+ def YAML.parser; Parser.new.set_resolver( YAML.resolver ); end
96
+ # Returns a new generic parser
97
+ def YAML.generic_parser; Parser.new.set_resolver( GenericResolver ); end
98
+ # Returns the default resolver
99
+ def YAML.resolver; DefaultResolver; end
100
+ # Returns a new default emitter
101
+ def YAML.emitter; Emitter.new.set_resolver( YAML.resolver ); end
102
+
103
+ #
104
+ # Converts _obj_ to YAML and writes the YAML result to _io_.
105
+ #
106
+ # File.open( 'animals.yaml', 'w' ) do |out|
107
+ # YAML.dump( ['badger', 'elephant', 'tiger'], out )
108
+ # end
109
+ #
110
+ # If no _io_ is provided, a string containing the dumped YAML
111
+ # is returned.
112
+ #
113
+ # YAML.dump( :locked )
114
+ # #=> "--- :locked"
115
+ #
116
+ def YAML.dump( obj, io = nil )
117
+ obj.to_yaml( io || io2 = StringIO.new )
118
+ io || ( io2.rewind; io2.read )
119
+ end
120
+
121
+ #
122
+ # Load a document from the current _io_ stream.
123
+ #
124
+ # File.open( 'animals.yaml' ) { |yf| YAML::load( yf ) }
125
+ # #=> ['badger', 'elephant', 'tiger']
126
+ #
127
+ # Can also load from a string.
128
+ #
129
+ # YAML.load( "--- :locked" )
130
+ # #=> :locked
131
+ #
132
+ def YAML.load( io )
133
+ yp = parser.load( io )
134
+ end
135
+
136
+ #
137
+ # Load a document from the file located at _filepath_.
138
+ #
139
+ # YAML.load_file( 'animals.yaml' )
140
+ # #=> ['badger', 'elephant', 'tiger']
141
+ #
142
+ def YAML.load_file( filepath )
143
+ File.open( filepath ) do |f|
144
+ load( f )
145
+ end
146
+ end
147
+
148
+ #
149
+ # Parse the first document from the current _io_ stream
150
+ #
151
+ # File.open( 'animals.yaml' ) { |yf| YAML::load( yf ) }
152
+ # #=> #<YAML::Syck::Node:0x82ccce0
153
+ # @kind=:seq,
154
+ # @value=
155
+ # [#<YAML::Syck::Node:0x82ccd94
156
+ # @kind=:scalar,
157
+ # @type_id="str",
158
+ # @value="badger">,
159
+ # #<YAML::Syck::Node:0x82ccd58
160
+ # @kind=:scalar,
161
+ # @type_id="str",
162
+ # @value="elephant">,
163
+ # #<YAML::Syck::Node:0x82ccd1c
164
+ # @kind=:scalar,
165
+ # @type_id="str",
166
+ # @value="tiger">]>
167
+ #
168
+ # Can also load from a string.
169
+ #
170
+ # YAML.parse( "--- :locked" )
171
+ # #=> #<YAML::Syck::Node:0x82edddc
172
+ # @type_id="tag:ruby.yaml.org,2002:sym",
173
+ # @value=":locked", @kind=:scalar>
174
+ #
175
+ def YAML.parse( io )
176
+ yp = generic_parser.load( io )
177
+ end
178
+
179
+ #
180
+ # Parse a document from the file located at _filepath_.
181
+ #
182
+ # YAML.parse_file( 'animals.yaml' )
183
+ # #=> #<YAML::Syck::Node:0x82ccce0
184
+ # @kind=:seq,
185
+ # @value=
186
+ # [#<YAML::Syck::Node:0x82ccd94
187
+ # @kind=:scalar,
188
+ # @type_id="str",
189
+ # @value="badger">,
190
+ # #<YAML::Syck::Node:0x82ccd58
191
+ # @kind=:scalar,
192
+ # @type_id="str",
193
+ # @value="elephant">,
194
+ # #<YAML::Syck::Node:0x82ccd1c
195
+ # @kind=:scalar,
196
+ # @type_id="str",
197
+ # @value="tiger">]>
198
+ #
199
+ def YAML.parse_file( filepath )
200
+ File.open( filepath ) do |f|
201
+ parse( f )
202
+ end
203
+ end
204
+
205
+ #
206
+ # Calls _block_ with each consecutive document in the YAML
207
+ # stream contained in _io_.
208
+ #
209
+ # File.open( 'many-docs.yaml' ) do |yf|
210
+ # YAML.each_document( yf ) do |ydoc|
211
+ # ## ydoc contains the single object
212
+ # ## from the YAML document
213
+ # end
214
+ # end
215
+ #
216
+ def YAML.each_document( io, &block )
217
+ yp = parser.load_documents( io, &block )
218
+ end
219
+
220
+ #
221
+ # Calls _block_ with each consecutive document in the YAML
222
+ # stream contained in _io_.
223
+ #
224
+ # File.open( 'many-docs.yaml' ) do |yf|
225
+ # YAML.load_documents( yf ) do |ydoc|
226
+ # ## ydoc contains the single object
227
+ # ## from the YAML document
228
+ # end
229
+ # end
230
+ #
231
+ def YAML.load_documents( io, &doc_proc )
232
+ YAML.each_document( io, &doc_proc )
233
+ end
234
+
235
+ #
236
+ # Calls _block_ with a tree of +YAML::BaseNodes+, one tree for
237
+ # each consecutive document in the YAML stream contained in _io_.
238
+ #
239
+ # File.open( 'many-docs.yaml' ) do |yf|
240
+ # YAML.each_node( yf ) do |ydoc|
241
+ # ## ydoc contains a tree of nodes
242
+ # ## from the YAML document
243
+ # end
244
+ # end
245
+ #
246
+ def YAML.each_node( io, &doc_proc )
247
+ yp = generic_parser.load_documents( io, &doc_proc )
248
+ end
249
+
250
+ #
251
+ # Calls _block_ with a tree of +YAML::BaseNodes+, one tree for
252
+ # each consecutive document in the YAML stream contained in _io_.
253
+ #
254
+ # File.open( 'many-docs.yaml' ) do |yf|
255
+ # YAML.parse_documents( yf ) do |ydoc|
256
+ # ## ydoc contains a tree of nodes
257
+ # ## from the YAML document
258
+ # end
259
+ # end
260
+ #
261
+ def YAML.parse_documents( io, &doc_proc )
262
+ YAML.each_node( io, &doc_proc )
263
+ end
264
+
265
+ #
266
+ # Loads all documents from the current _io_ stream,
267
+ # returning a +YAML::Stream+ object containing all
268
+ # loaded documents.
269
+ #
270
+ def YAML.load_stream( io )
271
+ d = nil
272
+ parser.load_documents( io ) do |doc|
273
+ d = YAML::Stream.new if not d
274
+ d.add( doc )
275
+ end
276
+ return d
277
+ end
278
+
279
+ #
280
+ # Returns a YAML stream containing each of the items in +objs+,
281
+ # each having their own document.
282
+ #
283
+ # YAML.dump_stream( 0, [], {} )
284
+ # #=> --- 0
285
+ # --- []
286
+ # --- {}
287
+ #
288
+ def YAML.dump_stream( *objs )
289
+ d = YAML::Stream.new
290
+ objs.each do |doc|
291
+ d.add( doc )
292
+ end
293
+ d.emit
294
+ end
295
+
296
+ #
297
+ # Add a global handler for a YAML domain type.
298
+ #
299
+ def YAML.add_domain_type( domain, type_tag, &transfer_proc )
300
+ resolver.add_type( "tag:#{ domain }:#{ type_tag }", transfer_proc )
301
+ end
302
+
303
+ #
304
+ # Add a transfer method for a builtin type
305
+ #
306
+ def YAML.add_builtin_type( type_tag, &transfer_proc )
307
+ resolver.add_type( "tag:yaml.org,2002:#{ type_tag }", transfer_proc )
308
+ end
309
+
310
+ #
311
+ # Add a transfer method for a builtin type
312
+ #
313
+ def YAML.add_ruby_type( type, &transfer_proc )
314
+ resolver.add_type( "tag:ruby.yaml.org,2002:#{ type_tag }", transfer_proc )
315
+ end
316
+
317
+ #
318
+ # Add a private document type
319
+ #
320
+ def YAML.add_private_type( type_re, &transfer_proc )
321
+ resolver.add_type( "x-private:" + type_re, transfer_proc )
322
+ end
323
+
324
+ #
325
+ # Detect typing of a string
326
+ #
327
+ def YAML.detect_implicit( val )
328
+ resolver.detect_implicit( val )
329
+ end
330
+
331
+ #
332
+ # Convert a type_id to a taguri
333
+ #
334
+ def YAML.tagurize( val )
335
+ resolver.tagurize( val )
336
+ end
337
+
338
+ #
339
+ # Apply a transfer method to a Ruby object
340
+ #
341
+ def YAML.transfer( type_id, obj )
342
+ resolver.transfer( YAML.tagurize( type_id ), obj )
343
+ end
344
+
345
+ #
346
+ # Apply any implicit a node may qualify for
347
+ #
348
+ def YAML.try_implicit( obj )
349
+ YAML.transfer( YAML.detect_implicit( obj ), obj )
350
+ end
351
+
352
+ #
353
+ # Method to extract colon-seperated type and class, returning
354
+ # the type and the constant of the class
355
+ #
356
+ def YAML.read_type_class( type, obj_class )
357
+ scheme, domain, type, tclass = type.split( ':', 4 )
358
+ tclass.split( "::" ).each { |c| obj_class = obj_class.const_get( c ) } if tclass
359
+ return [ type, obj_class ]
360
+ end
361
+
362
+ #
363
+ # Allocate blank object
364
+ #
365
+ def YAML.object_maker( obj_class, val )
366
+ if Hash === val
367
+ o = obj_class.allocate
368
+ val.each_pair { |k,v|
369
+ o.instance_variable_set("@#{k}", v)
370
+ }
371
+ o
372
+ else
373
+ raise YAML::Error, "Invalid object explicitly tagged !ruby/Object: " + val.inspect
374
+ end
375
+ end
376
+
377
+ #
378
+ # Allocate an Emitter if needed
379
+ #
380
+ def YAML.quick_emit( oid, opts = {}, &e )
381
+ out =
382
+ if opts.is_a? YAML::Emitter
383
+ opts
384
+ else
385
+ emitter.reset( opts )
386
+ end
387
+ out.emit( oid, &e )
388
+ end
389
+
390
+ end
391
+
392
+ require 'yaml/rubytypes'
393
+ require 'yaml/types'
394
+
395
+ module Kernel # :nodoc:
396
+ #
397
+ # ryan:: You know how Kernel.p is a really convenient way to dump ruby
398
+ # structures? The only downside is that it's not as legible as
399
+ # YAML.
400
+ #
401
+ # _why:: (listening)
402
+ #
403
+ # ryan:: I know you don't want to urinate all over your users' namespaces.
404
+ # But, on the other hand, convenience of dumping for debugging is,
405
+ # IMO, a big YAML use case.
406
+ #
407
+ # _why:: Go nuts! Have a pony parade!
408
+ #
409
+ # ryan:: Either way, I certainly will have a pony parade.
410
+ #
411
+
412
+ # Prints any supplied _objects_ out in YAML. Intended as
413
+ # a variation on +Kernel::p+.
414
+ #
415
+ # S = Struct.new(:name, :state)
416
+ # s = S['dave', 'TX']
417
+ # y s
418
+ #
419
+ # _produces:_
420
+ #
421
+ # --- !ruby/struct:S
422
+ # name: dave
423
+ # state: TX
424
+ #
425
+ def y( object, *objects )
426
+ objects.unshift object
427
+ puts( if objects.length == 1
428
+ YAML::dump( *objects )
429
+ else
430
+ YAML::dump_stream( *objects )
431
+ end )
432
+ end
433
+ private :y
434
+ end
435
+
436
+
@@ -0,0 +1,247 @@
1
+ #
2
+ # BaseEmitter
3
+ #
4
+
5
+ require 'yaml/constants'
6
+ require 'yaml/encoding'
7
+ require 'yaml/error'
8
+
9
+ module YAML
10
+
11
+ module BaseEmitter
12
+
13
+ def options( opt = nil )
14
+ if opt
15
+ @options[opt] || YAML::DEFAULTS[opt]
16
+ else
17
+ @options
18
+ end
19
+ end
20
+
21
+ def options=( opt )
22
+ @options = opt
23
+ end
24
+
25
+ #
26
+ # Emit binary data
27
+ #
28
+ def binary_base64( value )
29
+ self << "!binary "
30
+ self.node_text( [value].pack("m"), '|' )
31
+ end
32
+
33
+ #
34
+ # Emit plain, normal flowing text
35
+ #
36
+ def node_text( value, block = nil )
37
+ @seq_map = false
38
+ valx = value.dup
39
+ unless block
40
+ block =
41
+ if options(:UseBlock)
42
+ '|'
43
+ elsif not options(:UseFold) and valx =~ /\n[ \t]/ and not valx =~ /#{YAML::ESCAPE_CHAR}/
44
+ '|'
45
+ else
46
+ '>'
47
+ end
48
+
49
+ indt = $&.to_i if block =~ /\d+/
50
+ if valx =~ /(\A\n*[ \t#]|^---\s+)/
51
+ indt = options(:Indent) unless indt.to_i > 0
52
+ block += indt.to_s
53
+ end
54
+
55
+ block +=
56
+ if valx =~ /\n\Z\n/
57
+ "+"
58
+ elsif valx =~ /\Z\n/
59
+ ""
60
+ else
61
+ "-"
62
+ end
63
+ end
64
+ block += "\n"
65
+ if block[0] == ?"
66
+ esc_skip = ( "\t\n" unless valx =~ /^[ \t]/ ) || ""
67
+ valx = fold( YAML::escape( valx, esc_skip ) + "\"" ).chomp
68
+ self << '"' + indent_text( valx, indt, false )
69
+ else
70
+ if block[0] == ?>
71
+ valx = fold( valx )
72
+ end
73
+ #p [block, indt]
74
+ self << block + indent_text( valx, indt )
75
+ end
76
+ end
77
+
78
+ #
79
+ # Emit a simple, unqouted string
80
+ #
81
+ def simple( value )
82
+ @seq_map = false
83
+ self << value.to_s
84
+ end
85
+
86
+ #
87
+ # Emit double-quoted string
88
+ #
89
+ def double( value )
90
+ "\"#{YAML.escape( value )}\""
91
+ end
92
+
93
+ #
94
+ # Emit single-quoted string
95
+ #
96
+ def single( value )
97
+ "'#{value}'"
98
+ end
99
+
100
+ #
101
+ # Write a text block with the current indent
102
+ #
103
+ def indent_text( text, mod, first_line = true )
104
+ return "" if text.to_s.empty?
105
+ spacing = indent( mod )
106
+ text = text.gsub( /\A([^\n])/, "#{ spacing }\\1" ) if first_line
107
+ return text.gsub( /\n^([^\n])/, "\n#{spacing}\\1" )
108
+ end
109
+
110
+ #
111
+ # Write a current indent
112
+ #
113
+ def indent( mod = nil )
114
+ #p [ self.id, level, mod, :INDENT ]
115
+ if level <= 0
116
+ mod ||= 0
117
+ else
118
+ mod ||= options(:Indent)
119
+ mod += ( level - 1 ) * options(:Indent)
120
+ end
121
+ return " " * mod
122
+ end
123
+
124
+ #
125
+ # Add indent to the buffer
126
+ #
127
+ def indent!
128
+ self << indent
129
+ end
130
+
131
+ #
132
+ # Folding paragraphs within a column
133
+ #
134
+ def fold( value )
135
+ value.gsub( /(^[ \t]+.*$)|(\S.{0,#{options(:BestWidth) - 1}})(?:[ \t]+|(\n+(?=[ \t]|\Z))|$)/ ) do |s|
136
+ $1 || $2 + ( $3 || "\n" )
137
+ end
138
+ end
139
+
140
+ #
141
+ # Quick mapping
142
+ #
143
+ def map( type, &e )
144
+ val = Mapping.new
145
+ e.call( val )
146
+ self << "#{type} " if type.length.nonzero?
147
+
148
+ #
149
+ # Empty hashes
150
+ #
151
+ if val.length.zero?
152
+ self << "{}"
153
+ @seq_map = false
154
+ else
155
+ # FIXME
156
+ # if @buffer.length == 1 and options(:UseHeader) == false and type.length.zero?
157
+ # @headless = 1
158
+ # end
159
+
160
+ defkey = @options.delete( :DefaultKey )
161
+ if defkey
162
+ seq_map_shortcut
163
+ self << "= : "
164
+ defkey.to_yaml( :Emitter => self )
165
+ end
166
+
167
+ #
168
+ # Emit the key and value
169
+ #
170
+ val.each { |v|
171
+ seq_map_shortcut
172
+ if v[0].is_complex_yaml?
173
+ self << "? "
174
+ end
175
+ v[0].to_yaml( :Emitter => self )
176
+ if v[0].is_complex_yaml?
177
+ self << "\n"
178
+ indent!
179
+ end
180
+ self << ": "
181
+ v[1].to_yaml( :Emitter => self )
182
+ }
183
+ end
184
+ end
185
+
186
+ def seq_map_shortcut
187
+ # FIXME: seq_map needs to work with the new anchoring system
188
+ # if @seq_map
189
+ # @anchor_extras[@buffer.length - 1] = "\n" + indent
190
+ # @seq_map = false
191
+ # else
192
+ self << "\n"
193
+ indent!
194
+ # end
195
+ end
196
+
197
+ #
198
+ # Quick sequence
199
+ #
200
+ def seq( type, &e )
201
+ @seq_map = false
202
+ val = Sequence.new
203
+ e.call( val )
204
+ self << "#{type} " if type.length.nonzero?
205
+
206
+ #
207
+ # Empty arrays
208
+ #
209
+ if val.length.zero?
210
+ self << "[]"
211
+ else
212
+ # FIXME
213
+ # if @buffer.length == 1 and options(:UseHeader) == false and type.length.zero?
214
+ # @headless = 1
215
+ # end
216
+
217
+ #
218
+ # Emit the key and value
219
+ #
220
+ val.each { |v|
221
+ self << "\n"
222
+ indent!
223
+ self << "- "
224
+ @seq_map = true if v.class == Hash
225
+ v.to_yaml( :Emitter => self )
226
+ }
227
+ end
228
+ end
229
+
230
+ end
231
+
232
+ #
233
+ # Emitter helper classes
234
+ #
235
+ class Mapping < Array
236
+ def add( k, v )
237
+ push [k, v]
238
+ end
239
+ end
240
+
241
+ class Sequence < Array
242
+ def add( v )
243
+ push v
244
+ end
245
+ end
246
+
247
+ end