delfos 0.0.2.pre.rc2 → 0.0.2.pre.rc3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/delfos_import +38 -0
- data/exe/delfos_import_offline_queries +9 -0
- data/exe/delfos_update_distance +11 -0
- data/lib/delfos.rb +29 -73
- data/lib/delfos/config.rb +90 -0
- data/lib/delfos/config/inclusion.rb +90 -0
- data/lib/delfos/file_system.rb +7 -2
- data/lib/delfos/file_system/app_directories.rb +16 -18
- data/lib/delfos/file_system/app_files.rb +31 -0
- data/lib/delfos/file_system/file_cache.rb +21 -0
- data/lib/delfos/file_system/path_determination.rb +10 -7
- data/lib/delfos/method_trace.rb +18 -6
- data/lib/delfos/method_trace/call_handler.rb +6 -2
- data/lib/delfos/method_trace/code_location.rb +2 -12
- data/lib/delfos/method_trace/code_location/container_method_factory.rb +50 -25
- data/lib/delfos/method_trace/code_location/eval_in_caller.rb +2 -4
- data/lib/delfos/method_trace/code_location/filename_helpers.rb +1 -1
- data/lib/delfos/method_trace/code_location/method.rb +13 -9
- data/lib/delfos/neo4j.rb +12 -3
- data/lib/delfos/neo4j/distance/update.rb +1 -1
- data/lib/delfos/neo4j/live/call_site_logger.rb +27 -0
- data/lib/delfos/neo4j/offline.rb +13 -0
- data/lib/delfos/neo4j/offline/call_site_logger.rb +6 -1
- data/lib/delfos/neo4j/offline/importer.rb +8 -7
- data/lib/delfos/neo4j/query_execution/batch/execution.rb +93 -0
- data/lib/delfos/neo4j/query_execution/batch/retryable.rb +103 -0
- data/lib/delfos/neo4j/query_execution/errors.rb +4 -3
- data/lib/delfos/neo4j/query_execution/http.rb +1 -1
- data/lib/delfos/neo4j/query_execution/sync.rb +1 -1
- data/lib/delfos/neo4j/query_execution/transactional.rb +1 -1
- data/lib/delfos/neo4j/schema.rb +1 -1
- metadata +38 -16
- data/lib/delfos/neo4j/batch/execution.rb +0 -91
- data/lib/delfos/neo4j/batch/retryable.rb +0 -101
- data/lib/delfos/setup.rb +0 -120
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2abc41e61012e7262afb07416943d0eac71811f3
|
4
|
+
data.tar.gz: 9015780c3ed0a18153c3eceb083914ac2bf23ee5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 521ee2c4de9433e74a6989caf6991c76fb0dc238b842a5444fe0dcca1a049c98d96670c755f63ed4bf71e1359c3a69257f0aac18106aad47cd8a46f4e7143204
|
7
|
+
data.tar.gz: d5b09f2278d2312707d11743a8156cb1de88fb44fcb76f6599a226e84f09b5c1d764d862e52af19b26ea9295aaacdf423ac713c269caca3b01670b64b6c3137d
|
data/exe/delfos_import
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "fileutils"
|
5
|
+
|
6
|
+
# Credit to http://ruby-journal.com/how-to-import-millions-records-via-activerecord-within-minutes-not-hours/
|
7
|
+
# for the basis for this script
|
8
|
+
|
9
|
+
NUMBER_OF_SPLIT_LINES = 10_000
|
10
|
+
SPLIT_FILE_PREFIX = "delfos_queries_"
|
11
|
+
TEMP_DIRECTORY = "./tmp/delfos"
|
12
|
+
BIG_FILE_PATH = ARGV[0] || "./tmp/delfos/query_parameters.json"
|
13
|
+
|
14
|
+
BIG_FILENAME = File.basename BIG_FILE_PATH
|
15
|
+
FileUtils.rm_rf TEMP_DIRECTORY
|
16
|
+
FileUtils.mkdir_p TEMP_DIRECTORY
|
17
|
+
FileUtils.cp BIG_FILE_PATH, "#{TEMP_DIRECTORY}/#{BIG_FILENAME}"
|
18
|
+
|
19
|
+
FileUtils.cd TEMP_DIRECTORY
|
20
|
+
|
21
|
+
def split_file
|
22
|
+
puts "Split '#{BIG_FILENAME}' file into small chunks with size #{NUMBER_OF_SPLIT_LINES} lines"
|
23
|
+
system "split -l #{NUMBER_OF_SPLIT_LINES} #{BIG_FILENAME} #{SPLIT_FILE_PREFIX}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def process_split_files
|
27
|
+
split_files = Dir.glob("#{SPLIT_FILE_PREFIX}*")
|
28
|
+
|
29
|
+
split_files.each do |f|
|
30
|
+
command = "FILE=#{f} delfos_import_offline_queries"
|
31
|
+
system command
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
split_file
|
36
|
+
process_split_files
|
37
|
+
|
38
|
+
system "delfos_update_distance"
|
data/lib/delfos.rb
CHANGED
@@ -1,103 +1,59 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "forwardable"
|
4
|
+
|
5
|
+
require "delfos/config"
|
6
|
+
require "delfos/method_trace"
|
7
|
+
require "delfos/neo4j"
|
4
8
|
|
5
9
|
module Delfos
|
6
10
|
class << self
|
7
|
-
|
11
|
+
extend Forwardable
|
12
|
+
|
13
|
+
def_delegators :config,
|
14
|
+
:batch_size,
|
15
|
+
:call_site_logger,
|
16
|
+
:logger,
|
17
|
+
:max_query_size,
|
8
18
|
:offline_query_saving,
|
9
19
|
:offline_query_filename
|
10
20
|
|
11
|
-
|
12
|
-
|
13
|
-
# rubocop:disable Metrics/ParameterLists
|
14
|
-
def setup!(
|
15
|
-
logger: nil,
|
16
|
-
call_site_logger: nil,
|
17
|
-
application_directories: nil,
|
18
|
-
batch_size: nil,
|
19
|
-
max_query_size: nil,
|
20
|
-
offline_query_saving: nil
|
21
|
-
)
|
22
|
-
# rubocop:enable Metrics/ParameterLists
|
23
|
-
self.logger = logger
|
24
|
-
self.batch_size = batch_size
|
25
|
-
self.max_query_size = max_query_size
|
21
|
+
attr_reader :config
|
26
22
|
|
27
|
-
|
28
|
-
|
29
|
-
application_directories: application_directories,
|
30
|
-
offline_query_saving: offline_query_saving,
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
|
-
def import_offline_queries(filename)
|
35
|
-
require "delfos/neo4j/offline/importer"
|
36
|
-
Neo4j::Offline::Importer.new(filename).perform
|
23
|
+
def start!
|
24
|
+
::Delfos::MethodTrace.enable!
|
37
25
|
end
|
38
26
|
|
39
|
-
def
|
40
|
-
|
41
|
-
end
|
27
|
+
def finish!
|
28
|
+
::Delfos::MethodTrace.disable!
|
42
29
|
|
43
|
-
|
44
|
-
@max_query_size ||= 10_000
|
30
|
+
config.call_site_logger.finish!
|
45
31
|
end
|
46
32
|
|
47
|
-
def
|
48
|
-
|
49
|
-
FileSystem.include_file?(file)
|
33
|
+
def reset!
|
34
|
+
Delfos.config&.call_site_logger&.reset!
|
50
35
|
end
|
51
36
|
|
52
|
-
|
53
|
-
|
54
|
-
def call_site_logger
|
55
|
-
@call_site_logger ||= Delfos::Setup.default_call_site_logger
|
56
|
-
end
|
37
|
+
def configure
|
38
|
+
new_config
|
57
39
|
|
58
|
-
|
59
|
-
@logger ||= default_logger
|
40
|
+
yield config if block_given?
|
60
41
|
end
|
61
42
|
|
62
|
-
def
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
def setup_neo4j!
|
67
|
-
require "delfos/neo4j"
|
68
|
-
@neo4j ||= Neo4j.config
|
43
|
+
def import_offline_queries(filename)
|
44
|
+
Neo4j.import_offline_queries(filename)
|
69
45
|
end
|
70
46
|
|
71
|
-
def
|
72
|
-
|
73
|
-
Delfos.call_site_logger.finish!
|
74
|
-
else
|
75
|
-
flush!
|
76
|
-
update_distance!
|
77
|
-
disable!
|
78
|
-
end
|
47
|
+
def include_file?(file)
|
48
|
+
config&.include?(file)
|
79
49
|
end
|
80
50
|
|
81
51
|
def update_distance!
|
82
|
-
require "delfos/neo4j"
|
83
52
|
Neo4j.update_distance!
|
84
53
|
end
|
85
54
|
|
86
|
-
def
|
87
|
-
|
88
|
-
Neo4j.flush!
|
89
|
-
end
|
90
|
-
|
91
|
-
def disable!
|
92
|
-
Setup.disable!
|
93
|
-
end
|
94
|
-
|
95
|
-
def default_logger
|
96
|
-
require "logger"
|
97
|
-
|
98
|
-
Logger.new(STDOUT).tap do |l|
|
99
|
-
l.level = Logger::ERROR
|
100
|
-
end
|
55
|
+
def new_config
|
56
|
+
@config ||= Delfos::Config.new
|
101
57
|
end
|
102
58
|
end
|
103
59
|
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "forwardable"
|
4
|
+
require_relative "config/inclusion"
|
5
|
+
|
6
|
+
module Delfos
|
7
|
+
class Config
|
8
|
+
attr_reader :offline_query_saving, :offline_query_filename
|
9
|
+
|
10
|
+
attr_accessor :batch_size,
|
11
|
+
:call_site_logger,
|
12
|
+
:logger,
|
13
|
+
:max_query_size
|
14
|
+
|
15
|
+
extend Forwardable
|
16
|
+
|
17
|
+
def_delegators :inclusion,
|
18
|
+
:included_directories, :included_files, :include=, :include, :include?,
|
19
|
+
:excluded_directories, :excluded_files, :exclude=, :exclude, :exclude?
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
@batch_size = default_batch_size
|
23
|
+
@logger = default_logger
|
24
|
+
@max_query_size = default_max_query_size
|
25
|
+
@offline_query_saving = default_offline_query_saving
|
26
|
+
@offline_query_filename = nil
|
27
|
+
@call_site_logger = default_call_site_logger
|
28
|
+
end
|
29
|
+
|
30
|
+
def offline_query_saving=(bool)
|
31
|
+
@offline_query_saving = bool
|
32
|
+
@call_site_logger = default_call_site_logger
|
33
|
+
end
|
34
|
+
|
35
|
+
def offline_query_filename=(path)
|
36
|
+
@offline_query_filename = path || default_offline_query_filename
|
37
|
+
end
|
38
|
+
|
39
|
+
def neo4j
|
40
|
+
setup_neo4j!
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def inclusion
|
46
|
+
@inclusion ||= Inclusion.new
|
47
|
+
end
|
48
|
+
|
49
|
+
def default_batch_size
|
50
|
+
100
|
51
|
+
end
|
52
|
+
|
53
|
+
def default_call_site_logger
|
54
|
+
if @offline_query_saving
|
55
|
+
require "delfos/neo4j/offline/call_site_logger"
|
56
|
+
Delfos:: Neo4j::Offline::CallSiteLogger.new
|
57
|
+
else
|
58
|
+
setup_neo4j!
|
59
|
+
require "delfos/neo4j/live/call_site_logger"
|
60
|
+
Delfos:: Neo4j::Live::CallSiteLogger.new
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def setup_neo4j!
|
65
|
+
require "delfos/neo4j"
|
66
|
+
@neo4j ||= Neo4j.config
|
67
|
+
end
|
68
|
+
|
69
|
+
def default_logger
|
70
|
+
require "logger"
|
71
|
+
Logger.new(STDOUT).tap do |l|
|
72
|
+
l.level = Logger::ERROR
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def default_max_query_size
|
77
|
+
10_000
|
78
|
+
end
|
79
|
+
|
80
|
+
def default_offline_query_saving
|
81
|
+
false
|
82
|
+
end
|
83
|
+
|
84
|
+
def default_offline_query_filename
|
85
|
+
FileUtils.mkdir_p "./tmp/delfos" if @offline_query_saving
|
86
|
+
|
87
|
+
"./tmp/delfos/query_parameters.json"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "delfos/file_system/app_directories"
|
4
|
+
require "delfos/file_system/app_files"
|
5
|
+
|
6
|
+
module Delfos
|
7
|
+
class Config
|
8
|
+
class Inclusion
|
9
|
+
attr_reader :included_directories, :included_files,
|
10
|
+
:excluded_directories, :excluded_files
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
require "pathname"
|
14
|
+
@included_directories = default_included_directories
|
15
|
+
@included_files = []
|
16
|
+
|
17
|
+
@excluded_directories = []
|
18
|
+
@excluded_files = []
|
19
|
+
end
|
20
|
+
|
21
|
+
def exclude(paths)
|
22
|
+
append_all_to(paths, "excluded")
|
23
|
+
end
|
24
|
+
|
25
|
+
def include(paths)
|
26
|
+
append_all_to(paths, "included")
|
27
|
+
end
|
28
|
+
|
29
|
+
def include=(paths)
|
30
|
+
replace_all_with(paths, "included")
|
31
|
+
end
|
32
|
+
|
33
|
+
def exclude=(paths)
|
34
|
+
replace_all_with(paths, "excluded")
|
35
|
+
end
|
36
|
+
|
37
|
+
def include?(file)
|
38
|
+
app_directories.include?(file) && app_files.include?(file)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def append_all_to(paths, type)
|
44
|
+
files, directories = files_and_directories_from(paths)
|
45
|
+
|
46
|
+
append_to(files, "@#{type}_files")
|
47
|
+
append_to(directories, "@#{type}_directories")
|
48
|
+
end
|
49
|
+
|
50
|
+
def append_to(paths, ivar_name)
|
51
|
+
ivar = instance_variable_get(ivar_name)
|
52
|
+
ivar += paths
|
53
|
+
ivar.uniq!
|
54
|
+
instance_variable_set(ivar_name, ivar)
|
55
|
+
end
|
56
|
+
|
57
|
+
def replace_all_with(paths, type)
|
58
|
+
files, directories = files_and_directories_from(paths)
|
59
|
+
|
60
|
+
replace_with(files, "@#{type}_files")
|
61
|
+
replace_with(directories, "@#{type}_directories")
|
62
|
+
end
|
63
|
+
|
64
|
+
def replace_with(paths, ivar_name)
|
65
|
+
instance_variable_set(ivar_name, paths)
|
66
|
+
instance_variable_get(ivar_name).uniq!
|
67
|
+
end
|
68
|
+
|
69
|
+
def files_and_directories_from(paths)
|
70
|
+
expand_paths(paths).partition(&:file?)
|
71
|
+
end
|
72
|
+
|
73
|
+
def app_directories
|
74
|
+
@app_directories ||= FileSystem.app_directories(@included_directories, @excluded_directories)
|
75
|
+
end
|
76
|
+
|
77
|
+
def app_files
|
78
|
+
@app_files ||= FileSystem.app_files(@included_files, @excluded_files)
|
79
|
+
end
|
80
|
+
|
81
|
+
def default_included_directories
|
82
|
+
%w[app lib].map { |f| Pathname.new(f.to_s).expand_path }
|
83
|
+
end
|
84
|
+
|
85
|
+
def expand_paths(files)
|
86
|
+
Array(files).compact.map { |f| Pathname.new(f.to_s).expand_path }
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/delfos/file_system.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative "file_system/distance_calculation"
|
4
4
|
require_relative "file_system/app_directories"
|
5
|
+
require_relative "file_system/app_files"
|
5
6
|
|
6
7
|
module Delfos
|
7
8
|
module FileSystem
|
@@ -9,8 +10,12 @@ module Delfos
|
|
9
10
|
DistanceCalculation.new(start_file, finish_file)
|
10
11
|
end
|
11
12
|
|
12
|
-
def self.
|
13
|
-
|
13
|
+
def self.app_directories(included, excluded)
|
14
|
+
AppDirectories.new(included, excluded)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.app_files(included, excluded)
|
18
|
+
AppFiles.new(included, excluded)
|
14
19
|
end
|
15
20
|
end
|
16
21
|
end
|
@@ -1,41 +1,39 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "common_path"
|
4
|
+
require_relative "file_cache"
|
4
5
|
|
5
6
|
module Delfos
|
6
7
|
module FileSystem
|
7
|
-
|
8
|
-
|
8
|
+
class AppDirectories
|
9
|
+
include FileCache
|
9
10
|
|
10
|
-
def
|
11
|
-
|
11
|
+
def initialize(included, excluded)
|
12
|
+
@included = included
|
13
|
+
@excluded = excluded
|
12
14
|
end
|
13
15
|
|
14
|
-
def
|
15
|
-
|
16
|
-
with_cache(file) { should_include?(file) }
|
16
|
+
def exclude?(file)
|
17
|
+
!include?(file)
|
17
18
|
end
|
18
19
|
|
19
|
-
def
|
20
|
-
|
20
|
+
def include?(file)
|
21
|
+
return false if file.nil?
|
22
|
+
with_cache(file) { should_include?(file) }
|
21
23
|
end
|
22
24
|
|
23
25
|
private
|
24
26
|
|
25
27
|
def should_include?(file)
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
def expand_path(f)
|
30
|
-
Pathname.new(f).expand_path
|
28
|
+
!matches(file, @excluded) && matches(file, @included)
|
31
29
|
end
|
32
30
|
|
33
|
-
def
|
34
|
-
|
31
|
+
def matches(f, directories)
|
32
|
+
CommonPath.included_in?(expand_path(f), directories)
|
35
33
|
end
|
36
34
|
|
37
|
-
def
|
38
|
-
|
35
|
+
def expand_path(f)
|
36
|
+
Pathname.new(f).expand_path
|
39
37
|
end
|
40
38
|
end
|
41
39
|
end
|