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