diver_down 0.0.1.alpha16 → 0.0.1.alpha17

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88a43fc4236cb489ca44a9105db9ad3750f53a2929a9153db564e20d3f4e2fee
4
- data.tar.gz: 589ab5cce7bfdee343a4c3d967a7aece57ff1d389d3700af222579c450a13a42
3
+ metadata.gz: 9a2f7ed8cc7afd42927d7456860430b3349c9a597925bfbf50a8510da47051dc
4
+ data.tar.gz: 6f204f7954c88becbedf9a04983a4be8b195ac4ef45d2e7dc8ec50f5d80094de
5
5
  SHA512:
6
- metadata.gz: eda67006560b775d12e582afa991b789d727f2d947ad82cab470408690ab682133c34d433309467ae67637472de1cc82f246e6618c4cbc36f2a5e7f8d6bb555f
7
- data.tar.gz: e116e4edbcd125c4a56e8641cbda5b6427ce4c6beaa86935a1339fabb9ff3db14d6bd9319538cf2643d270d1b8ee6019b74bc70089e14820511f05c7578f2079
6
+ metadata.gz: 7653069f6d81577ce96f4b4488d194e625562056f98dbf366b87700fa50eb1444ae0eea53ef6307c9879a326e0962c6bb1f654bdf1220d9983166422a092a0a0
7
+ data.tar.gz: 6449971ce4909626c376a1f36efc233b3995f05f6d3bed73dab792791fc645be56e02425578b3bd3e7d29c66b1b4b702609af7de46ada16bcea6a262e27e0cc3
data/exe/diver_down_web CHANGED
@@ -6,6 +6,7 @@ require 'rack/contrib'
6
6
  require 'diver_down'
7
7
  require 'diver_down-web'
8
8
  require 'optparse'
9
+ require 'tempfile'
9
10
 
10
11
  options = {}
11
12
  option_parser = OptionParser.new do |opts|
@@ -3,34 +3,41 @@
3
3
  module DiverDown
4
4
  module Trace
5
5
  class IgnoredMethodIds
6
+ VALID_VALUE = %i[
7
+ single
8
+ all
9
+ ].freeze
10
+
6
11
  def initialize(ignored_methods)
7
12
  # Ignore all methods in the module
8
- # Hash{ Module => Boolean }
13
+ # Hash{ Module => Symbol }
9
14
  @ignored_modules = {}
10
15
 
11
16
  # Ignore all methods in the class
12
- # Hash{ Module => Hash{ Symbol => Boolean } }
17
+ # Hash{ Module => Hash{ Symbol => Symbol } }
13
18
  @ignored_class_method_id = Hash.new { |h, k| h[k] = {} }
14
19
 
15
20
  # Ignore all methods in the instance
16
- # Hash{ Module => Hash{ Symbol => Boolean } }
21
+ # Hash{ Module => Hash{ Symbol => Symbol } }
17
22
  @ignored_instance_method_id = Hash.new { |h, k| h[k] = {} }
18
23
 
19
- ignored_methods.each do |ignored_method|
24
+ ignored_methods.each do |ignored_method, value|
25
+ raise ArgumentError, "Invalid value: #{value}. valid values are #{VALID_VALUE}" unless VALID_VALUE.include?(value)
26
+
20
27
  if ignored_method.include?('.')
21
28
  # instance method
22
29
  class_name, method_id = ignored_method.split('.')
23
30
  mod = DiverDown::Helper.constantize(class_name)
24
- @ignored_class_method_id[mod][method_id.to_sym] = true
31
+ @ignored_class_method_id[mod][method_id.to_sym] = value
25
32
  elsif ignored_method.include?('#')
26
33
  # class method
27
34
  class_name, method_id = ignored_method.split('#')
28
35
  mod = DiverDown::Helper.constantize(class_name)
29
- @ignored_instance_method_id[mod][method_id.to_sym] = true
36
+ @ignored_instance_method_id[mod][method_id.to_sym] = value
30
37
  else
31
38
  # module
32
39
  mod = DiverDown::Helper.constantize(ignored_method)
33
- @ignored_modules[mod] = true
40
+ @ignored_modules[mod] = value
34
41
  end
35
42
  end
36
43
  end
@@ -38,14 +45,14 @@ module DiverDown
38
45
  # @param mod [Module]
39
46
  # @param is_class [Boolean] class is true, instance is false
40
47
  # @param method_id [Symbol]
41
- # @return [Boolean]
42
- def ignored?(mod, is_class, method_id)
43
- ignored_module?(mod) || ignored_method?(mod, is_class, method_id)
48
+ # @return [Symbol, false] VALID_VALUE
49
+ def ignored(mod, is_class, method_id)
50
+ ignored_module(mod) || ignored_method(mod, is_class, method_id)
44
51
  end
45
52
 
46
53
  private
47
54
 
48
- def ignored_module?(mod)
55
+ def ignored_module(mod)
49
56
  unless @ignored_modules.key?(mod)
50
57
  dig_superclass(mod)
51
58
  end
@@ -53,7 +60,7 @@ module DiverDown
53
60
  @ignored_modules.fetch(mod)
54
61
  end
55
62
 
56
- def ignored_method?(mod, is_class, method_id)
63
+ def ignored_method(mod, is_class, method_id)
57
64
  store = if is_class
58
65
  # class methods
59
66
  @ignored_class_method_id
@@ -96,10 +103,8 @@ module DiverDown
96
103
  end
97
104
 
98
105
  # Convert nil to boolean
99
- ignored = !!ignored
100
-
101
106
  stack.each do
102
- @ignored_modules[_1] = ignored
107
+ @ignored_modules[_1] = ignored || false
103
108
  end
104
109
  end
105
110
 
@@ -125,10 +130,8 @@ module DiverDown
125
130
  end
126
131
 
127
132
  # Convert nil to boolean
128
- ignored = !!ignored
129
-
130
133
  stack.each do
131
- store[_1][method_id] = ignored
134
+ store[_1][method_id] = ignored || false
132
135
  end
133
136
  end
134
137
  end
@@ -38,13 +38,15 @@ module DiverDown
38
38
  private
39
39
 
40
40
  def build_trace_point
41
- call_stack = DiverDown::Trace::CallStack.new
41
+ call_stacks = {}
42
42
 
43
43
  TracePoint.new(*DiverDown::Trace::Tracer.trace_events) do |tp|
44
44
  # Skip the trace of the library itself
45
45
  next if tp.path&.start_with?(DiverDown::LIB_DIR)
46
46
  next if TracePoint == tp.defined_class
47
47
 
48
+ call_stack = call_stacks[Thread.current] ||= DiverDown::Trace::CallStack.new
49
+
48
50
  case tp.event
49
51
  when :b_call
50
52
  call_stack.push
@@ -64,9 +66,12 @@ module DiverDown
64
66
  next
65
67
  end
66
68
 
67
- if !@ignored_method_ids.nil? && @ignored_method_ids.ignored?(mod, DiverDown::Helper.module?(tp.self), tp.method_id)
68
- # If this method is ignored, the call stack is ignored until the method returns.
69
- call_stack.push(ignored: true)
69
+ ignored = @ignored_method_ids.ignored(mod, DiverDown::Helper.module?(tp.self), tp.method_id) if @ignored_method_ids
70
+
71
+ if ignored
72
+ # If ignored is :all, the call stack is ignored until the method returns.
73
+ # If ignored is :single, the call stack is ignored only current call.
74
+ call_stack.push(ignored: ignored == :all)
70
75
  next
71
76
  end
72
77
 
@@ -24,7 +24,7 @@ module DiverDown
24
24
 
25
25
  # @param module_set [DiverDown::Trace::ModuleSet, Array<Module, String>]
26
26
  # @param caller_paths [Array<String>, nil] if nil, trace all files
27
- # @param ignored_method_ids [Array<String>]
27
+ # @param ignored_method_ids [Hash{ String => Symbol }, nil]
28
28
  # @param filter_method_id_path [#call, nil] filter method_id.path
29
29
  # @param module_set [DiverDown::Trace::ModuleSet, nil] for optimization
30
30
  def initialize(module_set: {}, caller_paths: nil, ignored_method_ids: nil, filter_method_id_path: nil)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DiverDown
4
- VERSION = '0.0.1.alpha16'
4
+ VERSION = '0.0.1.alpha17'
5
5
  end
@@ -21,9 +21,8 @@ module DiverDown
21
21
  def initialize(store:, metadata:)
22
22
  @store = store
23
23
  @metadata = metadata
24
- @source_alias_resolver = DiverDown::Web::SourceAliasResolver.new(@metadata.source_alias)
25
- @module_dependency_map = nil
26
- @module_dependency_map_cache_id = nil
24
+
25
+ reload
27
26
  end
28
27
 
29
28
  # GET /api/source_aliases.json
@@ -327,6 +326,7 @@ module DiverDown
327
326
  if found_source
328
327
  @metadata.source(source_name).module = modulee
329
328
  @metadata.flush
329
+ reload
330
330
 
331
331
  json({})
332
332
  else
@@ -348,6 +348,7 @@ module DiverDown
348
348
  if found_source
349
349
  @metadata.source(source_name).memo = memo
350
350
  @metadata.flush
351
+ reload
351
352
 
352
353
  json({})
353
354
  else
@@ -355,6 +356,13 @@ module DiverDown
355
356
  end
356
357
  end
357
358
 
359
+ # @return [Array[Integer, Hash, Array]]
360
+ def reload_cache
361
+ @metadata.reload
362
+ reload
363
+ json({})
364
+ end
365
+
358
366
  # @return [Array[Integer, Hash, Array]]
359
367
  def not_found
360
368
  [404, { 'content-type' => 'text/plain' }, ['not found']]
@@ -445,6 +453,12 @@ module DiverDown
445
453
 
446
454
  @module_dependency_map
447
455
  end
456
+
457
+ def reload
458
+ @source_alias_resolver = DiverDown::Web::SourceAliasResolver.new(@metadata.source_alias)
459
+ @module_dependency_map = nil
460
+ @module_dependency_map_cache_id = nil
461
+ end
448
462
  end
449
463
  end
450
464
  end
@@ -6,12 +6,12 @@ module DiverDown
6
6
  require 'diver_down/web/metadata/source_metadata'
7
7
  require 'diver_down/web/metadata/source_alias'
8
8
 
9
- attr_reader :source_alias
9
+ attr_reader :path, :source_alias
10
10
 
11
11
  # @param path [String]
12
12
  def initialize(path)
13
13
  @path = path
14
- load
14
+ reload
15
15
  end
16
16
 
17
17
  # @param source_name [String]
@@ -41,25 +41,19 @@ module DiverDown
41
41
  File.write(@path, to_h.to_yaml)
42
42
  end
43
43
 
44
- private
45
-
46
- def load
44
+ # Reload metadata from file
45
+ # @return [void]
46
+ def reload
47
47
  @source_map = Hash.new { |h, source_name| h[source_name] = DiverDown::Web::Metadata::SourceMetadata.new }
48
48
  @source_alias = DiverDown::Web::Metadata::SourceAlias.new
49
49
 
50
- loaded = YAML.load_file(@path)
50
+ loaded = YAML.load_file(@path) if File.exist?(@path)
51
51
 
52
52
  return if loaded.nil?
53
53
 
54
- # NOTE: This is for backward compatibility. It will be removed in the future.
55
- (loaded[:sources] || loaded || []).each do |source_name, source_hash|
54
+ loaded[:sources]&.each do |source_name, source_hash|
56
55
  source(source_name).memo = source_hash[:memo] if source_hash[:memo]
57
-
58
- if source_hash[:modules].is_a?(Array)
59
- source(source_name).module = source_hash[:modules][0]
60
- elsif source_hash[:module]
61
- source(source_name).module = source_hash[:module]
62
- end
56
+ source(source_name).module = source_hash[:module] if source_hash[:module]
63
57
  end
64
58
 
65
59
  loaded[:source_alias]&.each do |alias_name, source_names|
@@ -78,6 +78,8 @@ module DiverDown
78
78
  in ['GET', %r{\A/api/sources/(?<source>[^/]+)\.json\z}]
79
79
  source = Regexp.last_match[:source]
80
80
  @action.source(source)
81
+ in ['GET', %r{\A/api/reload\.json\z}]
82
+ @action.reload_cache
81
83
  in ['POST', %r{\A/api/sources/(?<source>[^/]+)/module.json\z}]
82
84
  source = Regexp.last_match[:source]
83
85
  modulee = request.params['module'] || ''
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diver_down
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha16
4
+ version: 0.0.1.alpha17
5
5
  platform: ruby
6
6
  authors:
7
7
  - alpaca-tc
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-25 00:00:00.000000000 Z
11
+ date: 2024-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  requirements: []
112
- rubygems_version: 3.5.11
112
+ rubygems_version: 3.5.18
113
113
  signing_key:
114
114
  specification_version: 4
115
115
  summary: dynamically analyze application dependencies and generate a comprehensive