Class: DiverDown::Web

Inherits:
Object
  • Object
show all
Defined in:
lib/diver_down/web.rb,
lib/diver_down/web/action.rb,
lib/diver_down/web/bit_id.rb,
lib/diver_down/web/metadata.rb,
lib/diver_down/web/definition_store.rb,
lib/diver_down/web/definition_filter.rb,
lib/diver_down/web/definition_loader.rb,
lib/diver_down/web/definition_to_dot.rb,
lib/diver_down/web/indented_string_io.rb,
lib/diver_down/web/definition_enumerator.rb,
lib/diver_down/web/dev_server_middleware.rb,
lib/diver_down/web/metadata/source_alias.rb,
lib/diver_down/web/source_alias_resolver.rb,
lib/diver_down/web/metadata/source_metadata.rb,
lib/diver_down/web/definition_module_dependencies.rb

Defined Under Namespace

Modules: BitId Classes: Action, DefinitionEnumerator, DefinitionFilter, DefinitionLoader, DefinitionModuleDependencies, DefinitionStore, DefinitionToDot, DevServerMiddleware, IndentedStringIo, Metadata, SourceAliasResolver

Constant Summary collapse

WEB_DIR =
File.expand_path('../../web', __dir__)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(definition_dir:, metadata:, blob_prefix:) ⇒ Web

Returns a new instance of Web.

Parameters:



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/diver_down/web.rb', line 34

def initialize(definition_dir:, metadata:, blob_prefix:)
  @metadata = 
  @blob_prefix = blob_prefix&.sub(%r{/+$}, '')
  @files_server = Rack::Files.new(File.join(WEB_DIR))

  definition_files = ::Dir["#{definition_dir}/**/*.{yml,yaml,msgpack,json}"].sort
  @total_definition_files_size = definition_files.size
  @action = nil

  load_definition_files_on_thread(definition_files)
end

Class Method Details

.storeDiverDown::Web::DefinitionStore



26
27
28
# File 'lib/diver_down/web.rb', line 26

def self.store
  @store ||= DiverDown::Web::DefinitionStore.new
end

Instance Method Details

#call(env) ⇒ Array[Integer, Hash, Array]

Parameters:

  • env (Hash)

Returns:

  • (Array[Integer, Hash, Array])


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/diver_down/web.rb', line 48

def call(env)
  request = Rack::Request.new(env)

  if @action&.store.object_id != self.class.store.object_id
    @action = DiverDown::Web::Action.new(store: self.class.store, metadata: @metadata, blob_prefix: @blob_prefix)
  end

  case [request.request_method, request.path]
  in ['GET', %r{\A/api/definitions\.json\z}]
    @action.definitions(
      page: request.params['page']&.to_i || 1,
      per: request.params['per']&.to_i || 100,
      title: request.params['title'] || '',
      source: request.params['source'] || '',
      definition_group: request.params['definition_group'] || ''
    )
  in ['GET', %r{\A/api/sources\.json\z}]
    @action.sources
  in ['GET', %r{\A/api/modules\.json\z}]
    @action.modules
  in ['GET', %r{\A/api/modules/(?<modulee>[^/]+)\.json\z}]
    modulee = CGI.unescape(Regexp.last_match[:modulee])
    @action.module(modulee)
  in ['GET', %r{\A/api/definitions/(?<bit_id>\d+)\.json\z}]
    bit_id = Regexp.last_match[:bit_id].to_i
    compound = request.params['compound'] == '1'
    concentrate = request.params['concentrate'] == '1'
    only_module = request.params['only_module'] == '1'
    remove_internal_sources = request.params['remove_internal_sources'] == '1'
    focus_modules = request.params['focus_modules'] || []
    modules = request.params['modules'] || []
    @action.combine_definitions(bit_id, compound, concentrate, only_module, remove_internal_sources, focus_modules, modules)
  in ['GET', %r{\A/api/sources/(?<source>[^/]+)\.json\z}]
    source = Regexp.last_match[:source]
    @action.source(source)
  in ['GET', %r{\A/api/reload\.json\z}]
    @action.reload_cache
  in ['POST', %r{\A/api/sources/(?<source>[^/]+)/module.json\z}]
    source = Regexp.last_match[:source]
    modulee = request.params['module'] || ''
    @action.set_module(source, modulee)
  in ['POST', %r{\A/api/sources/(?<source>[^/]+)/memo.json\z}]
    source = Regexp.last_match[:source]
    memo = request.params['memo'] || ''
    @action.set_memo(source, memo)
  in ['POST', %r{\A/api/modules/(?<from_module>[^/]+)/dependency_types/(?<to_module>[^/]+)\.json\z}]
    from_module = CGI.unescape(Regexp.last_match[:from_module])
    to_module = CGI.unescape(Regexp.last_match[:to_module])
    dependency_type = request.params['dependency_type']

    @action.update_module_dependency_type(from_module, to_module, dependency_type)
  in ['POST', %r{\A/api/sources/(?<from_source>[^/]+)/dependency_types/(?<to_source>[^/]+)\.json\z}]
    from_source = Regexp.last_match[:from_source]
    to_source = Regexp.last_match[:to_source]
    dependency_type = request.params['dependency_type']

    @action.update_source_dependency_type(from_source, to_source, dependency_type)
  in ['GET', %r{\A/api/pid\.json\z}]
    @action.pid
  in ['GET', %r{\A/api/initialization_status\.json\z}]
    @action.initialization_status(@total_definition_files_size)
  in ['GET', %r{\A/api/configuration\.json\z}]
    @action.configuration
  in ['GET', %r{\A/api/source_aliases\.json\z}]
    @action.source_aliases
  in ['POST', %r{\A/api/source_aliases\.json\z}]
    alias_name = request.params['alias_name']
    old_alias_name = request.params['old_alias_name'] # NOTE: nillable
    source_names = request.params['source_names'] || []

    @action.update_source_alias(alias_name, old_alias_name, source_names)
  in ['GET', %r{\A/assets/}]
    @files_server.call(env)
  in ['GET', /\.json\z/], ['POST', /\.json\z/]
    @action.not_found
  else
    @files_server.call(env.merge('PATH_INFO' => '/index.html'))
  end
end