lib/diver_down/web/action.rb in diver_down-0.0.1.alpha14 vs lib/diver_down/web/action.rb in diver_down-0.0.1.alpha15

- old
+ new

@@ -10,18 +10,22 @@ :total_pages, :total_count, :per ) + M = Mutex.new + + attr_reader :store + # @param store [DiverDown::Definition::Store] # @param metadata [DiverDown::Web::Metadata] - # @param request [Rack::Request] - def initialize(store:, metadata:, request:) + def initialize(store:, metadata:) @store = store @metadata = metadata @source_alias_resolver = DiverDown::Web::SourceAliasResolver.new(@metadata.source_alias) - @request = request + @module_dependency_map = nil + @module_dependency_map_cache_id = nil end # GET /api/source_aliases.json def source_aliases source_aliases = @metadata.source_alias.to_h.map do |alias_name, source_names| @@ -59,105 +63,100 @@ # GET /api/sources.json def sources source_names = Set.new - # rubocop:disable Style/HashEachMethods - @store.each do |_, definition| - definition.sources.each do |source| - source_names.add(source.source_name) - end + @store.combined_definition.sources.each do |source| + source_names.add(source.source_name) end - # rubocop:enable Style/HashEachMethods - classified_sources_count = source_names.count { @metadata.source(_1).modules? } + classified_sources_count = source_names.count { @metadata.source(_1).module? } json( sources: source_names.sort.map do |source_name| source_metadata = @metadata.source(source_name) { source_name:, resolved_alias: @metadata.source_alias.resolve_alias(source_name), memo: source_metadata.memo, - modules: source_metadata.modules.map do |module_name| - { module_name: } - end, + module: source_metadata.module, } end, classified_sources_count: ) end # GET /api/modules.json def modules # Hash{ DiverDown::Definition::Modulee => Set<Integer> } - module_set = Set.new + modules = Set.new - # rubocop:disable Style/HashEachMethods - @store.each do |_, definition| - definition.sources.each do |source| - modules = @metadata.source(source.source_name).modules - module_set.add(modules) unless modules.empty? - end + @store.combined_definition.sources.each do |source| + modulee = @metadata.source(source.source_name).module + modules.add(modulee) unless modulee.nil? end - # rubocop:enable Style/HashEachMethods json( - modules: module_set.sort.map do - _1.map do |module_name| - { - module_name:, - } - end - end + modules: modules.sort ) end - # GET /api/modules/:module_name.json - # @param module_names [Array<String>] - def module(module_names) - # Hash{ DiverDown::Definition::Modulee => Set<Integer> } - related_definition_store_ids = Set.new - source_names = Set.new + # GET /api/modules/:modulee.json + # @param modulee [String] + def module(modulee) + module_dependency_map = fetch_module_dependency_map - # rubocop:disable Style/HashEachMethods - @store.each do |_, definition| - definition.sources.each do |source| - source_module_names = @metadata.source(source.source_name).modules - - next unless source_module_names[0..module_names.size - 1] == module_names - - source_names.add(source.source_name) - related_definition_store_ids.add(definition.store_id) - end - end - # rubocop:enable Style/HashEachMethods - - if related_definition_store_ids.empty? + unless module_dependency_map.key?(modulee) return not_found end - related_definitions = related_definition_store_ids.map { @store.get(_1) } + module_dependency = module_dependency_map.fetch(modulee) json( - modules: module_names.map do + module: modulee, + module_dependencies: module_dependency.module_dependencies.compact.sort, + module_reverse_dependencies: module_dependency.module_reverse_dependencies.compact.sort, + sources: module_dependency.sources.map do |source| { - module_name: _1, + source_name: source.source_name, + module: @metadata.source(source.source_name).module, + memo: @metadata.source(source.source_name).memo, + dependencies: source.dependencies.map do |dependency| + { + source_name: dependency.source_name, + module: @metadata.source(dependency.source_name).module, + method_ids: dependency.method_ids.sort.map do |method_id| + { + context: method_id.context, + name: method_id.name, + paths: method_id.paths.sort, + } + end, + } + end, } end, - sources: source_names.sort.map do |source_name| + source_reverse_dependencies: module_dependency.source_reverse_dependencies.map do |source| { - source_name:, - memo: @metadata.source(source_name).memo, + source_name: source.source_name, + module: @metadata.source(source.source_name).module, + memo: @metadata.source(source.source_name).memo, + dependencies: source.dependencies.map do |dependency| + { + source_name: dependency.source_name, + module: @metadata.source(dependency.source_name).module, + method_ids: dependency.method_ids.sort.map do |method_id| + { + context: method_id.context, + name: method_id.name, + paths: method_id.paths.sort, + } + end, + } + end, } - end, - related_definitions: related_definitions.map do |definition| - { - id: definition.store_id, - title: definition.title, - } end ) end # GET /api/definitions.json @@ -176,11 +175,11 @@ { id: definition.store_id, definition_group: definition.definition_group, title: definition.title, sources_count: definition.sources.size, - unclassified_sources_count: definition.sources.reject { @metadata.source(_1.source_name).modules? }.size, + unclassified_sources_count: definition.sources.reject { @metadata.source(_1.source_name).module? }.size, } end, pagination: pagination.to_h ) end @@ -198,43 +197,17 @@ json( pid: Process.pid ) end - # GET /api/module_definition/:module_names.json - # - # @param bit_id [Integer] - # @param compound [Boolean] - # @param concentrate [Boolean] - # @param only_module [Boolean] - # @param modules [Array<String>] - def module_definition(compound, concentrate, only_module, modules) - definition = @store.combined_definition - - # Filter all sources and dependencies by modules if match_modules is given - resolved_definition = DiverDown::Web::ModuleSourcesFilter.new(@metadata).filter(definition, modules:) - - # Resolve source aliases - resolved_definition = @source_alias_resolver.resolve(resolved_definition) - - render_combined_definition( - (1..@store.size).to_a, - resolved_definition, - modules, - compound:, - concentrate:, - only_module: - ) - end - # GET /api/definitions/:bit_id.json # # @param bit_id [Integer] # @param compound [Boolean] # @param concentrate [Boolean] # @param only_module [Boolean] - def combine_definitions(bit_id, compound, concentrate, only_module) + def combine_definitions(bit_id, compound, concentrate, only_module, remove_internal_sources, focus_modules, modules) ids = DiverDown::Web::BitId.bit_id_to_ids(bit_id) valid_ids = ids.select do @store.key?(_1) end @@ -252,10 +225,12 @@ end if definition # Resolve source aliases resolved_definition = @source_alias_resolver.resolve(definition) + # Filter sources and dependencies by condition + resolved_definition = DiverDown::Web::DefinitionFilter.new(@metadata, focus_modules:, modules:, remove_internal_sources:).filter(resolved_definition) render_combined_definition( valid_ids, resolved_definition, titles, @@ -302,33 +277,32 @@ end end return not_found if related_definitions.empty? - module_names = if found_sources.empty? - [] - else - source = DiverDown::Definition::Source.combine(*found_sources) - @metadata.source(source.source_name).modules - end + modulee = if found_sources.empty? + nil + else + source = DiverDown::Definition::Source.combine(*found_sources) + @metadata.source(source.source_name).module + end json( source_name:, resolved_alias: @metadata.source_alias.resolve_alias(source_name), memo: @metadata.source(source_name).memo, - modules: module_names.map do - { module_name: _1 } - end, + module: modulee, related_definitions: related_definitions.map do |id, definition| { id:, title: definition.title, } end, reverse_dependencies: reverse_dependencies.values.map { |reverse_dependency| { source_name: reverse_dependency.source_name, + module: @metadata.source(reverse_dependency.source_name).module, method_ids: reverse_dependency.method_ids.sort.map do |method_id| { context: method_id.context, name: method_id.name, paths: method_id.paths.sort, @@ -337,23 +311,23 @@ } } ) end - # POST /api/sources/:source_name/modules.json + # POST /api/sources/:source_name/module.json # # @param source_name [String] - # @param modules [Array<String>] - def set_modules(source_name, modules) + # @param module [Array<String>] + def set_module(source_name, modulee) found_source = @store.any? do |_, definition| definition.sources.any? do |source| source.source_name == source_name end end if found_source - @metadata.source(source_name).modules = modules + @metadata.source(source_name).module = modulee @metadata.flush json({}) else not_found @@ -386,12 +360,10 @@ [404, { 'content-type' => 'text/plain' }, ['not found']] end private - attr_reader :request, :store - def build_method_id_key(dependency, method_id) "#{dependency.source_name}-#{method_id.context}-#{method_id.name}" end def paginate(enumerator, page, per) @@ -449,15 +421,30 @@ sources: definition.sources.map do { source_name: _1.source_name, resolved_alias: @metadata.source_alias.resolve_alias(_1.source_name), memo: @metadata.source(_1.source_name).memo, - modules: @metadata.source(_1.source_name).modules.map do |module_name| - { module_name: } + module: @metadata.source(_1.source_name).module, + dependencies: _1.dependencies.map do |dependency| + { + source_name: dependency.source_name, + } end, } end ) + end + + def fetch_module_dependency_map + M.synchronize do + if @module_dependency_map_cache_id != @store.combined_definition.object_id + definition = @store.combined_definition + @module_dependency_map = DiverDown::Web::DefinitionModuleDependencies.new(@metadata, definition).build_module_dependency_map + @module_dependency_map_cache_id = definition.object_id + end + end + + @module_dependency_map end end end end