lib/yard/serializers/yardoc_serializer.rb in yard-0.9.18 vs lib/yard/serializers/yardoc_serializer.rb in yard-0.9.19

- old
+ new

@@ -1,152 +1,152 @@ -# frozen_string_literal: true -module YARD - # Stubs marshal dumps and acts a delegate class for an object by path - # - # @private - class StubProxy - instance_methods.each {|m| undef_method(m) unless m.to_s =~ /^__|^object_id$/ } - - def _dump(_depth) @path end - def self._load(str) new(str) end - def hash; @path.hash end - - def initialize(path, transient = false) - @path = path - @transient = transient - end - - def method_missing(meth, *args, &block) - return true if meth == :respond_to? && args.first == :_dump - @object = nil if @transient - @object ||= Registry.at(@path) - @object.send(meth, *args, &block) - rescue NoMethodError => e - e.backtrace.delete_if {|l| l[0, FILELEN] == __FILE__ } - raise - end - - FILELEN = __FILE__.size - end - - module Serializers - class YardocSerializer < FileSystemSerializer - def initialize(yfile) - super(:basepath => yfile, :extension => 'dat') - end - - def objects_path; File.join(basepath, 'objects') end - # @deprecated The registry no longer tracks proxy types - def proxy_types_path; File.join(basepath, 'proxy_types') end - def checksums_path; File.join(basepath, 'checksums') end - def object_types_path; File.join(basepath, 'object_types') end - def complete_lock_path; File.join(basepath, 'complete') end - def processing_path; File.join(basepath, 'processing') end - - def complete? - File.exist?(complete_lock_path) && !locked_for_writing? - end - - # Creates a pessmistic transactional lock on the database for writing. - # Use with {YARD.parse} to ensure the database is not written multiple - # times. - # - # @see #locked_for_writing? - def lock_for_writing - File.open!(processing_path, 'w') {} - yield - ensure - File.unlink(processing_path) if File.exist?(processing_path) - end - - # @return [Boolean] whether the database is currently locked for writing - def locked_for_writing? - File.exist?(processing_path) - end - - def serialized_path(object) - path = - case object - when String, Symbol - object = object.to_s - if object =~ /#/ - object += '_i' - elsif object =~ /\./ - object += '_c' - end - object.split(/::|\.|#/).map do |p| - p.gsub(/[^\w\.-]/) do |x| - encoded = '_' - - x.each_byte {|b| encoded << ("%X" % b) } - encoded - end - end.join('/') + '.' + extension - when YARD::CodeObjects::RootObject - 'root.dat' - else - super(object) - end - - File.join('objects', path) - end - - def serialize(object) - if Hash === object - super(object[:root], dump(object)) if object[:root] - else - super(object, dump(object)) - end - end - - def deserialize(path, is_path = false) - path = File.join(basepath, serialized_path(path)) unless is_path - if File.file?(path) - log.debug "Deserializing #{path}..." - Marshal.load(File.read_binary(path)) - else - log.debug "Could not find #{path}" - nil - end - end - - private - - def dump(object) - object = internal_dump(object, true) unless object.is_a?(Hash) - Marshal.dump(object) - end - - def internal_dump(object, first_object = false) - if !first_object && object.is_a?(CodeObjects::Base) && - !(Tags::OverloadTag === object) - return StubProxy.new(object.path) - end - - if object.is_a?(Hash) || object.is_a?(Array) || - object.is_a?(CodeObjects::Base) || - !object.instance_variables.empty? - object = object.dup - end - - object.instance_variables.each do |ivar| - ivar_obj = object.instance_variable_get(ivar) - ivar_obj_dump = internal_dump(ivar_obj) - object.instance_variable_set(ivar, ivar_obj_dump) - end - - case object - when Hash - list = object.map do |k, v| - [k, v].map {|item| internal_dump(item) } - end - object.replace(Hash[list]) - when Array - list = object.map {|item| internal_dump(item) } - object.replace(list) - end - - object - end - end - end -end +# frozen_string_literal: true +module YARD + # Stubs marshal dumps and acts a delegate class for an object by path + # + # @private + class StubProxy + instance_methods.each {|m| undef_method(m) unless m.to_s =~ /^__|^object_id$/ } + + def _dump(_depth) @path end + def self._load(str) new(str) end + def hash; @path.hash end + + def initialize(path, transient = false) + @path = path + @transient = transient + end + + def method_missing(meth, *args, &block) + return true if meth == :respond_to? && args.first == :_dump + @object = nil if @transient + @object ||= Registry.at(@path) + @object.send(meth, *args, &block) + rescue NoMethodError => e + e.backtrace.delete_if {|l| l[0, FILELEN] == __FILE__ } + raise + end + + FILELEN = __FILE__.size + end + + module Serializers + class YardocSerializer < FileSystemSerializer + def initialize(yfile) + super(:basepath => yfile, :extension => 'dat') + end + + def objects_path; File.join(basepath, 'objects') end + # @deprecated The registry no longer tracks proxy types + def proxy_types_path; File.join(basepath, 'proxy_types') end + def checksums_path; File.join(basepath, 'checksums') end + def object_types_path; File.join(basepath, 'object_types') end + def complete_lock_path; File.join(basepath, 'complete') end + def processing_path; File.join(basepath, 'processing') end + + def complete? + File.exist?(complete_lock_path) && !locked_for_writing? + end + + # Creates a pessmistic transactional lock on the database for writing. + # Use with {YARD.parse} to ensure the database is not written multiple + # times. + # + # @see #locked_for_writing? + def lock_for_writing + File.open!(processing_path, 'w') {} + yield + ensure + File.unlink(processing_path) if File.exist?(processing_path) + end + + # @return [Boolean] whether the database is currently locked for writing + def locked_for_writing? + File.exist?(processing_path) + end + + def serialized_path(object) + path = + case object + when String, Symbol + object = object.to_s + if object =~ /#/ + object += '_i' + elsif object =~ /\./ + object += '_c' + end + object.split(/::|\.|#/).map do |p| + p.gsub(/[^\w\.-]/) do |x| + encoded = '_' + + x.each_byte {|b| encoded << ("%X" % b) } + encoded + end + end.join('/') + '.' + extension + when YARD::CodeObjects::RootObject + 'root.dat' + else + super(object) + end + + File.join('objects', path) + end + + def serialize(object) + if Hash === object + super(object[:root], dump(object)) if object[:root] + else + super(object, dump(object)) + end + end + + def deserialize(path, is_path = false) + path = File.join(basepath, serialized_path(path)) unless is_path + if File.file?(path) + log.debug "Deserializing #{path}..." + Marshal.load(File.read_binary(path)) + else + log.debug "Could not find #{path}" + nil + end + end + + private + + def dump(object) + object = internal_dump(object, true) unless object.is_a?(Hash) + Marshal.dump(object) + end + + def internal_dump(object, first_object = false) + if !first_object && object.is_a?(CodeObjects::Base) && + !(Tags::OverloadTag === object) + return StubProxy.new(object.path) + end + + if object.is_a?(Hash) || object.is_a?(Array) || + object.is_a?(CodeObjects::Base) || + !object.instance_variables.empty? + object = object.dup + end + + object.instance_variables.each do |ivar| + ivar_obj = object.instance_variable_get(ivar) + ivar_obj_dump = internal_dump(ivar_obj) + object.instance_variable_set(ivar, ivar_obj_dump) + end + + case object + when Hash + list = object.map do |k, v| + [k, v].map {|item| internal_dump(item) } + end + object.replace(Hash[list]) + when Array + list = object.map {|item| internal_dump(item) } + object.replace(list) + end + + object + end + end + end +end