From fc94f7081506f1d4f27ad557203d2147028945d1 Mon Sep 17 00:00:00 2001 From: alpaca-tc Date: Wed, 10 Apr 2024 22:03:20 +0900 Subject: [PATCH 1/2] Organize modules used only for DiverDown::Web --- lib/diver_down.rb | 3 --- lib/diver_down/web.rb | 3 +++ lib/diver_down/{ => web}/definition_loader.rb | 0 lib/diver_down/{ => web}/definition_store.rb | 0 lib/diver_down/{ => web}/indented_string_io.rb | 0 spec/diver_down/{ => web}/definition_loader_spec.rb | 0 spec/diver_down/{ => web}/definition_store_spec.rb | 0 spec/diver_down/{ => web}/indented_string_io_spec.rb | 0 8 files changed, 3 insertions(+), 3 deletions(-) rename lib/diver_down/{ => web}/definition_loader.rb (100%) rename lib/diver_down/{ => web}/definition_store.rb (100%) rename lib/diver_down/{ => web}/indented_string_io.rb (100%) rename spec/diver_down/{ => web}/definition_loader_spec.rb (100%) rename spec/diver_down/{ => web}/definition_store_spec.rb (100%) rename spec/diver_down/{ => web}/indented_string_io_spec.rb (100%) diff --git a/lib/diver_down.rb b/lib/diver_down.rb index 063f355..27e250a 100644 --- a/lib/diver_down.rb +++ b/lib/diver_down.rb @@ -9,8 +9,5 @@ class Error < StandardError; end DELIMITER = ',' require 'diver_down/definition' - require 'diver_down/definition_store' - require 'diver_down/definition_loader' - require 'diver_down/indented_string_io' require 'diver_down/helper' end diff --git a/lib/diver_down/web.rb b/lib/diver_down/web.rb index 9f0c148..8835875 100644 --- a/lib/diver_down/web.rb +++ b/lib/diver_down/web.rb @@ -13,6 +13,9 @@ class Web require 'diver_down/web/definition_enumerator' require 'diver_down/web/bit_id' require 'diver_down/web/module_store' + require 'diver_down/web/indented_string_io' + require 'diver_down/web/definition_store' + require 'diver_down/web/definition_loader' # For development autoload :DevServerMiddleware, 'diver_down/web/dev_server_middleware' diff --git a/lib/diver_down/definition_loader.rb b/lib/diver_down/web/definition_loader.rb similarity index 100% rename from lib/diver_down/definition_loader.rb rename to lib/diver_down/web/definition_loader.rb diff --git a/lib/diver_down/definition_store.rb b/lib/diver_down/web/definition_store.rb similarity index 100% rename from lib/diver_down/definition_store.rb rename to lib/diver_down/web/definition_store.rb diff --git a/lib/diver_down/indented_string_io.rb b/lib/diver_down/web/indented_string_io.rb similarity index 100% rename from lib/diver_down/indented_string_io.rb rename to lib/diver_down/web/indented_string_io.rb diff --git a/spec/diver_down/definition_loader_spec.rb b/spec/diver_down/web/definition_loader_spec.rb similarity index 100% rename from spec/diver_down/definition_loader_spec.rb rename to spec/diver_down/web/definition_loader_spec.rb diff --git a/spec/diver_down/definition_store_spec.rb b/spec/diver_down/web/definition_store_spec.rb similarity index 100% rename from spec/diver_down/definition_store_spec.rb rename to spec/diver_down/web/definition_store_spec.rb diff --git a/spec/diver_down/indented_string_io_spec.rb b/spec/diver_down/web/indented_string_io_spec.rb similarity index 100% rename from spec/diver_down/indented_string_io_spec.rb rename to spec/diver_down/web/indented_string_io_spec.rb From 7ae87ac3256b5f0dea55e365ebbd6b3492013a45 Mon Sep 17 00:00:00 2001 From: alpaca-tc Date: Wed, 10 Apr 2024 22:08:24 +0900 Subject: [PATCH 2/2] fix old namespace --- lib/diver_down/definition.rb | 4 +- lib/diver_down/web.rb | 6 +- lib/diver_down/web/definition_loader.rb | 50 +++---- lib/diver_down/web/definition_store.rb | 124 +++++++++--------- lib/diver_down/web/definition_to_dot.rb | 2 +- lib/diver_down/web/indented_string_io.rb | 82 ++++++------ .../web/definition_enumerator_spec.rb | 6 +- spec/diver_down/web/definition_loader_spec.rb | 10 +- spec/diver_down/web/definition_store_spec.rb | 2 +- .../diver_down/web/indented_string_io_spec.rb | 2 +- spec/diver_down/web_spec.rb | 2 +- 11 files changed, 148 insertions(+), 142 deletions(-) diff --git a/lib/diver_down/definition.rb b/lib/diver_down/definition.rb index 66e348b..be6ed86 100644 --- a/lib/diver_down/definition.rb +++ b/lib/diver_down/definition.rb @@ -39,8 +39,8 @@ def self.combine(definition_group:, title:, definitions: []) attr_reader :definition_group, :title - # ID issued when stored in DefinitionStore - # I want to manage ID in DefinitionStore, but for performance reasons, I have to set Definition#id to determine its identity + # ID issued when stored in DiverDown::Web::DefinitionStore + # I want to manage ID in DiverDown::Web::DefinitionStore, but for performance reasons, I have to set Definition#id to determine its identity # because naive comparing the identity by instance variables of Definitions is slow. # @attr_accessor [Integer] attr_accessor :store_id diff --git a/lib/diver_down/web.rb b/lib/diver_down/web.rb index 8835875..62dd02e 100644 --- a/lib/diver_down/web.rb +++ b/lib/diver_down/web.rb @@ -22,8 +22,8 @@ class Web # @param definition_dir [String] # @param module_store [DiverDown::ModuleStore] - # @param store [DiverDown::DefinitionStore] - def initialize(definition_dir:, module_store:, store: DiverDown::DefinitionStore.new) + # @param store [DiverDown::Web::DefinitionStore] + def initialize(definition_dir:, module_store:, store: DiverDown::Web::DefinitionStore.new) @store = store @module_store = module_store @files_server = Rack::Files.new(File.join(WEB_DIR)) @@ -84,7 +84,7 @@ def call(env) private def load_definition_files_on_thread(definition_files) - definition_loader = DiverDown::DefinitionLoader.new + definition_loader = DiverDown::Web::DefinitionLoader.new Thread.new do loop do diff --git a/lib/diver_down/web/definition_loader.rb b/lib/diver_down/web/definition_loader.rb index e664e7b..445da5c 100644 --- a/lib/diver_down/web/definition_loader.rb +++ b/lib/diver_down/web/definition_loader.rb @@ -1,35 +1,37 @@ # frozen_string_literal: true module DiverDown - class DefinitionLoader - # @param path [String] - def load_file(path) - hash = case File.extname(path) - when '.yaml', '.yml' - from_yaml(path) - when '.msgpack' - from_msgpack(path) - when '.json' - from_json(path) - else - raise ArgumentError, "Unsupported file type: #{path}" - end + class Web + class DefinitionLoader + # @param path [String] + def load_file(path) + hash = case File.extname(path) + when '.yaml', '.yml' + from_yaml(path) + when '.msgpack' + from_msgpack(path) + when '.json' + from_json(path) + else + raise ArgumentError, "Unsupported file type: #{path}" + end - DiverDown::Definition.from_hash(hash) - end + DiverDown::Definition.from_hash(hash) + end - private + private - def from_json(path) - JSON.parse(File.read(path)) - end + def from_json(path) + JSON.parse(File.read(path)) + end - def from_yaml(path) - YAML.load_file(path) - end + def from_yaml(path) + YAML.load_file(path) + end - def from_msgpack(path) - MessagePack.unpack(File.binread(path)) + def from_msgpack(path) + MessagePack.unpack(File.binread(path)) + end end end end diff --git a/lib/diver_down/web/definition_store.rb b/lib/diver_down/web/definition_store.rb index 187f11e..0b4b1dd 100644 --- a/lib/diver_down/web/definition_store.rb +++ b/lib/diver_down/web/definition_store.rb @@ -1,86 +1,88 @@ # frozen_string_literal: true module DiverDown - class DefinitionStore - include Enumerable + class Web + class DefinitionStore + include Enumerable - attr_reader :bit_id + attr_reader :bit_id - def initialize - # Hash{ Integer(unique bit flag) => DiverDown::Definition } - @definitions = [] - @definition_group_store = Hash.new { |h, k| h[k] = [] } - end + def initialize + # Hash{ Integer(unique bit flag) => DiverDown::Definition } + @definitions = [] + @definition_group_store = Hash.new { |h, k| h[k] = [] } + end - # @param id [Integer] - # @raise [KeyError] if the id is not found - # @return [DiverDown::Definition] - def get(id) - index = id - 1 + # @param id [Integer] + # @raise [KeyError] if the id is not found + # @return [DiverDown::Definition] + def get(id) + index = id - 1 - raise(KeyError, "id not found: #{id}") if id <= 0 || @definitions.size < id + raise(KeyError, "id not found: #{id}") if id <= 0 || @definitions.size < id - @definitions.fetch(index) - end + @definitions.fetch(index) + end - # @param definitions [Array] - # @return [Array] ids of the definitions - def set(*definitions) - definitions.map do - raise(ArgumentError, 'definition already set') if _1.store_id + # @param definitions [Array] + # @return [Array] ids of the definitions + def set(*definitions) + definitions.map do + raise(ArgumentError, 'definition already set') if _1.store_id - _1.store_id = @definitions.size + 1 + _1.store_id = @definitions.size + 1 - @definitions.push(_1) - @definition_group_store[_1.definition_group] << _1 + @definitions.push(_1) + @definition_group_store[_1.definition_group] << _1 - _1.store_id + _1.store_id + end end - end - # @return [Array] - def definition_groups - keys = @definition_group_store.keys + # @return [Array] + def definition_groups + keys = @definition_group_store.keys - # Sort keys with nil at the end - with_nil = keys.include?(nil) - keys.delete(nil) if with_nil - keys.sort! - keys.push(nil) if with_nil + # Sort keys with nil at the end + with_nil = keys.include?(nil) + keys.delete(nil) if with_nil + keys.sort! + keys.push(nil) if with_nil - keys - end + keys + end - # @param definition_group [String, nil] - # @return [Array] - def filter_by_definition_group(definition_group) - @definition_group_store.fetch(definition_group, []) - end + # @param definition_group [String, nil] + # @return [Array] + def filter_by_definition_group(definition_group) + @definition_group_store.fetch(definition_group, []) + end - # @param id [Integer] - # @return [Boolean] - def key?(id) - id.positive? && id <= @definitions.size - end + # @param id [Integer] + # @return [Boolean] + def key?(id) + id.positive? && id <= @definitions.size + end - # @return [Integer] - def length - @definitions.length - end - alias size length + # @return [Integer] + def length + @definitions.length + end + alias size length - # @return [Boolean] - def empty? - @definitions.empty? - end + # @return [Boolean] + def empty? + @definitions.empty? + end - # @yield [DiverDown::Definition] - def each - return enum_for(__method__) unless block_given? + # @yield [DiverDown::Definition] + def each + return enum_for(__method__) unless block_given? - # NOTE: To allow values to be rewritten during #each, duplicate the value through #to_a. - @definitions.each.with_index(1) do |definition, id| - yield(id, definition) + # NOTE: To allow values to be rewritten during #each, duplicate the value through #to_a. + @definitions.each.with_index(1) do |definition, id| + yield(id, definition) + end end end end diff --git a/lib/diver_down/web/definition_to_dot.rb b/lib/diver_down/web/definition_to_dot.rb index 74598b7..8e09a1f 100644 --- a/lib/diver_down/web/definition_to_dot.rb +++ b/lib/diver_down/web/definition_to_dot.rb @@ -145,7 +145,7 @@ def length def initialize(definition, module_store, compound: false, concentrate: false, only_module: false) @definition = definition @module_store = module_store - @io = DiverDown::IndentedStringIo.new + @io = DiverDown::Web::IndentedStringIo.new @indent = 0 @compound = compound || only_module # When only-module is enabled, dependencies between modules are displayed as compound. @compound_map = Hash.new { |h, k| h[k] = {} } # Hash{ ltail => Hash{ lhead => issued id } } diff --git a/lib/diver_down/web/indented_string_io.rb b/lib/diver_down/web/indented_string_io.rb index fa461d6..dbcfcf0 100644 --- a/lib/diver_down/web/indented_string_io.rb +++ b/lib/diver_down/web/indented_string_io.rb @@ -4,54 +4,56 @@ require 'forwardable' module DiverDown - class IndentedStringIo - extend ::Forwardable + class Web + class IndentedStringIo + extend ::Forwardable - def_delegators :@io, :rewind, :string + def_delegators :@io, :rewind, :string - attr_accessor :indent + attr_accessor :indent - # @param tab [String] - def initialize(tab: ' ') - @io = StringIO.new - @indent = 0 - @tab = tab - end + # @param tab [String] + def initialize(tab: ' ') + @io = StringIO.new + @indent = 0 + @tab = tab + end - # @param contents [Array] - # @param indent [Boolean] Enable or disable indentation - # @return [void] - def write(*contents, indent: true) - indent_string = if indent - @tab * @indent - else - '' - end - - string = contents.join - lines = string.lines - lines.each do |line| - if line == "\n" - @io.write "\n" - else - @io.write "#{indent_string}#{line}" + # @param contents [Array] + # @param indent [Boolean] Enable or disable indentation + # @return [void] + def write(*contents, indent: true) + indent_string = if indent + @tab * @indent + else + '' + end + + string = contents.join + lines = string.lines + lines.each do |line| + if line == "\n" + @io.write "\n" + else + @io.write "#{indent_string}#{line}" + end end end - end - # @param content [String] - # @return [void] - def puts(*contents, indent: true) - write("#{contents.join("\n")}\n", indent:) - nil - end + # @param content [String] + # @return [void] + def puts(*contents, indent: true) + write("#{contents.join("\n")}\n", indent:) + nil + end - # increase the indent level for the block - def indented - @indent += 1 - yield - ensure - @indent -= 1 + # increase the indent level for the block + def indented + @indent += 1 + yield + ensure + @indent -= 1 + end end end end diff --git a/spec/diver_down/web/definition_enumerator_spec.rb b/spec/diver_down/web/definition_enumerator_spec.rb index 279ba24..4fc3f63 100644 --- a/spec/diver_down/web/definition_enumerator_spec.rb +++ b/spec/diver_down/web/definition_enumerator_spec.rb @@ -4,7 +4,7 @@ describe 'InstanceMethods' do describe '#each' do it 'returns definitions sorted by definition_group' do - store = DiverDown::DefinitionStore.new + store = DiverDown::Web::DefinitionStore.new definition_1 = DiverDown::Definition.new definition_2 = DiverDown::Definition.new(definition_group: 'b', title: 'definition_2') definition_3 = DiverDown::Definition.new(definition_group: 'c', title: 'definition_3') @@ -37,7 +37,7 @@ def assert_query(store, title, expected) end it 'filters by title' do - store = DiverDown::DefinitionStore.new + store = DiverDown::Web::DefinitionStore.new definition_1 = DiverDown::Definition.new( title: '01234', @@ -83,7 +83,7 @@ def assert_query(store, source, expected) end it 'filters by source' do - store = DiverDown::DefinitionStore.new + store = DiverDown::Web::DefinitionStore.new definition_1 = DiverDown::Definition.new( title: '01234', diff --git a/spec/diver_down/web/definition_loader_spec.rb b/spec/diver_down/web/definition_loader_spec.rb index 3f01e0e..a57775d 100644 --- a/spec/diver_down/web/definition_loader_spec.rb +++ b/spec/diver_down/web/definition_loader_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -RSpec.describe DiverDown::DefinitionStore do +RSpec.describe DiverDown::Web::DefinitionStore do describe 'InstanceMethods' do describe '#load_file' do it 'loads yaml' do @@ -10,7 +10,7 @@ definition = DiverDown::Definition.new(title: 'a') File.write(path, definition.to_h.to_yaml) - loader = DiverDown::DefinitionLoader.new + loader = DiverDown::Web::DefinitionLoader.new expect(loader.load_file(path)).to eq(definition) end @@ -22,7 +22,7 @@ definition = DiverDown::Definition.new(title: 'a') File.write(path, definition.to_h.to_yaml) - loader = DiverDown::DefinitionLoader.new + loader = DiverDown::Web::DefinitionLoader.new expect(loader.load_file(path)).to eq(definition) end @@ -34,7 +34,7 @@ definition = DiverDown::Definition.new(title: 'a') File.write(path, JSON.dump(definition.to_h)) - loader = DiverDown::DefinitionLoader.new + loader = DiverDown::Web::DefinitionLoader.new expect(loader.load_file(path)).to eq(definition) end @@ -46,7 +46,7 @@ definition = DiverDown::Definition.new(title: 'a') File.write(path, definition.to_h.to_msgpack) - loader = DiverDown::DefinitionLoader.new + loader = DiverDown::Web::DefinitionLoader.new expect(loader.load_file(path)).to eq(definition) end diff --git a/spec/diver_down/web/definition_store_spec.rb b/spec/diver_down/web/definition_store_spec.rb index 572dc0b..81ddabf 100644 --- a/spec/diver_down/web/definition_store_spec.rb +++ b/spec/diver_down/web/definition_store_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -RSpec.describe DiverDown::DefinitionStore do +RSpec.describe DiverDown::Web::DefinitionStore do describe 'InstanceMethods' do describe '#get' do it 'raises KeyError if key not found' do diff --git a/spec/diver_down/web/indented_string_io_spec.rb b/spec/diver_down/web/indented_string_io_spec.rb index 0129d3f..2c607be 100644 --- a/spec/diver_down/web/indented_string_io_spec.rb +++ b/spec/diver_down/web/indented_string_io_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -RSpec.describe DiverDown::IndentedStringIo do +RSpec.describe DiverDown::Web::IndentedStringIo do describe 'InstanceMethods' do describe '#write' do it 'writes string' do diff --git a/spec/diver_down/web_spec.rb b/spec/diver_down/web_spec.rb index e31d9e0..733a2b0 100644 --- a/spec/diver_down/web_spec.rb +++ b/spec/diver_down/web_spec.rb @@ -12,7 +12,7 @@ def app end let(:store) do - DiverDown::DefinitionStore.new + DiverDown::Web::DefinitionStore.new end let(:module_store) do