aboutsummaryrefslogtreecommitdiffstats
path: root/lib/yaml/tag.rb
diff options
context:
space:
mode:
authorwhy <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-09-13 03:58:33 +0000
committerwhy <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-09-13 03:58:33 +0000
commitf1827a2fafaa50ba89f35c8c05beffd28b1dd6e6 (patch)
tree095d144b8790cb1d1a99fbe40e0e79e31f65fcac /lib/yaml/tag.rb
parent2007d73102b29e7bf50d08f6690ae5e6ffa5ea9a (diff)
downloadruby-f1827a2fafaa50ba89f35c8c05beffd28b1dd6e6.tar.gz
* lib/yaml.rb: reworking YAML::Stream to use the new
emitter. * lib/yaml/stream.rb: ditto. * lib/yaml/rubytypes.rb: added Object#yaml_new. * lib/yaml/tag.rb: the tag_subclasses? method now shows up in the class. allow taguri to be set using an accessor. continue support of Object#to_yaml_type. * ext/syck/rubyext.c: new emitter code. yaml_new and yaml_initialize get called, should they be present. consolidated all the diaspora of internal node types into the family below YAML::Syck::Node -- Map, Seq, Scalar -- all of whom are SyckNode structs pointing to Ruby data. moved Object#yaml_new into the node_import and made it the default behavior. the target_class is always called wih yaml_new, prepended a parameter, which is the klass. loaded nodes through GenericResolver show their style. new Resolver#tagurize converts type ids to taguris. * ext/syck/implicit.re: were 'y' and 'n' seriously omitted?? * ext/syck/emitter.c: renovated emitter, walks the tree in advance. consolidated redundant block_styles struct into the scalar_style struct. (this means loaded nodes can now be sent back to emitter and preserve at least its very basic formatting.) * ext/syck/gram.c: headless documents of any kind allowed. * ext/syck/node.c: new syck_replace_str methods and syck_empty_* methods for rewriting node contents, while keeping the ID and other setup info. added syck_seq_assign. * ext/syck/syck.h: reflect block_styles and new node functions. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9141 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/yaml/tag.rb')
-rw-r--r--lib/yaml/tag.rb86
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/yaml/tag.rb b/lib/yaml/tag.rb
new file mode 100644
index 0000000000..0e25e1f85a
--- /dev/null
+++ b/lib/yaml/tag.rb
@@ -0,0 +1,86 @@
+# -*- mode: ruby; ruby-indent-level: 4; tab-width: 4 -*- vim: sw=4 ts=4
+# $Id$
+#
+# = yaml/tag.rb: methods for associating a taguri to a class.
+#
+# Author:: why the lucky stiff
+#
+module YAML
+ # A dictionary of taguris which map to
+ # Ruby classes.
+ @@tagged_classes = {}
+
+ #
+ # Associates a taguri _tag_ with a Ruby class _cls_. The taguri is used to give types
+ # to classes when loading YAML. Taguris are of the form:
+ #
+ # tag:authorityName,date:specific
+ #
+ # The +authorityName+ is a domain name or email address. The +date+ is the date the type
+ # was issued in YYYY or YYYY-MM or YYYY-MM-DD format. The +specific+ is a name for
+ # the type being added.
+ #
+ # For example, built-in YAML types have 'yaml.org' as the +authorityName+ and '2002' as the
+ # +date+. The +specific+ is simply the name of the type:
+ #
+ # tag:yaml.org,2002:int
+ # tag:yaml.org,2002:float
+ # tag:yaml.org,2002:timestamp
+ #
+ # The domain must be owned by you on the +date+ declared. If you don't own any domains on the
+ # date you declare the type, you can simply use an e-mail address.
+ #
+ # tag:why@ruby-lang.org,2004:notes/personal
+ #
+ def YAML.tag_class( tag, cls )
+ if @@tagged_classes.has_key? tag
+ warn "class #{ @@tagged_classes[tag] } held ownership of the #{ tag } tag"
+ end
+ @@tagged_classes[tag] = cls
+ end
+
+ # Returns the complete dictionary of taguris, paired with classes. The key for
+ # the dictionary is the full taguri. The value for each key is the class constant
+ # associated to that taguri.
+ #
+ # YAML.tagged_classes["tag:yaml.org,2002:int"] => Integer
+ #
+ def YAML.tagged_classes
+ @@tagged_classes
+ end
+end
+
+class Module # :nodoc: all
+ # Adds a taguri _tag_ to a class, used when dumping or loading the class
+ # in YAML. See YAML::tag_class for detailed information on typing and
+ # taguris.
+ def yaml_as( tag, sc = true )
+ class_eval <<-"end;"
+ attr_accessor :taguri
+ def taguri
+ if respond_to? :to_yaml_type
+ YAML::tagurize( to_yaml_type[1..-1] )
+ else
+ return @taguri if @taguri
+ tag = #{ tag.dump }
+ if self.class.yaml_tag_subclasses? and self.class != YAML::tagged_classes[tag]
+ tag = "\#{ tag }:\#{ self.class.yaml_tag_class_name }"
+ end
+ tag
+ end
+ end
+ def self.yaml_tag_subclasses?; #{ sc ? 'true' : 'false' }; end
+ end;
+ YAML::tag_class tag, self
+ end
+ # Transforms the subclass name into a name suitable for display
+ # in a subclassed tag.
+ def yaml_tag_class_name
+ self.name
+ end
+ # Transforms the subclass name found in the tag into a Ruby
+ # constant name.
+ def yaml_tag_read_class( name )
+ name
+ end
+end