kaisoku 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +133 -0
  4. data/Rakefile +8 -0
  5. data/exe/kaisoku +6 -0
  6. data/lib/kaisoku/adapter.rb +81 -0
  7. data/lib/kaisoku/adapters/cucumber.rb +91 -0
  8. data/lib/kaisoku/adapters/minitest.rb +96 -0
  9. data/lib/kaisoku/adapters/rspec.rb +111 -0
  10. data/lib/kaisoku/adapters/test_unit.rb +35 -0
  11. data/lib/kaisoku/checksum.rb +55 -0
  12. data/lib/kaisoku/cli.rb +158 -0
  13. data/lib/kaisoku/commands/daemon_command.rb +31 -0
  14. data/lib/kaisoku/commands/map_command.rb +86 -0
  15. data/lib/kaisoku/commands/preload_command.rb +40 -0
  16. data/lib/kaisoku/commands/run_command.rb +93 -0
  17. data/lib/kaisoku/commands/watch_command.rb +37 -0
  18. data/lib/kaisoku/configuration.rb +69 -0
  19. data/lib/kaisoku/coverage_collector.rb +83 -0
  20. data/lib/kaisoku/daemon/client.rb +22 -0
  21. data/lib/kaisoku/daemon/server.rb +39 -0
  22. data/lib/kaisoku/daemon/socket_path.rb +13 -0
  23. data/lib/kaisoku/doctor.rb +46 -0
  24. data/lib/kaisoku/entity.rb +77 -0
  25. data/lib/kaisoku/entity_result.rb +19 -0
  26. data/lib/kaisoku/environment_tracker.rb +28 -0
  27. data/lib/kaisoku/evaluator/cli.rb +112 -0
  28. data/lib/kaisoku/evaluator/command_result.rb +64 -0
  29. data/lib/kaisoku/evaluator/history.rb +23 -0
  30. data/lib/kaisoku/evaluator/metrics.rb +45 -0
  31. data/lib/kaisoku/evaluator/mutation_seeder.rb +78 -0
  32. data/lib/kaisoku/evaluator/replay.rb +121 -0
  33. data/lib/kaisoku/evaluator/report.rb +128 -0
  34. data/lib/kaisoku/hybrid_policy.rb +14 -0
  35. data/lib/kaisoku/listen_watcher.rb +34 -0
  36. data/lib/kaisoku/lsp/message_io.rb +42 -0
  37. data/lib/kaisoku/lsp/server.rb +100 -0
  38. data/lib/kaisoku/method_map.rb +75 -0
  39. data/lib/kaisoku/preload/client.rb +22 -0
  40. data/lib/kaisoku/preload/daemon.rb +48 -0
  41. data/lib/kaisoku/preload/fallback_runner.rb +45 -0
  42. data/lib/kaisoku/preload/server.rb +123 -0
  43. data/lib/kaisoku/preload/socket_path.rb +13 -0
  44. data/lib/kaisoku/prioritizer.rb +18 -0
  45. data/lib/kaisoku/rails/integration.rb +56 -0
  46. data/lib/kaisoku/reporters/console.rb +24 -0
  47. data/lib/kaisoku/reporters/factory.rb +24 -0
  48. data/lib/kaisoku/reporters/json.rb +28 -0
  49. data/lib/kaisoku/reporters/junit.rb +50 -0
  50. data/lib/kaisoku/reporters/tui.rb +29 -0
  51. data/lib/kaisoku/runner.rb +48 -0
  52. data/lib/kaisoku/runtime_context.rb +28 -0
  53. data/lib/kaisoku/scheduler/fork_pool.rb +105 -0
  54. data/lib/kaisoku/scheduler/result_persister.rb +43 -0
  55. data/lib/kaisoku/selection.rb +51 -0
  56. data/lib/kaisoku/selector.rb +173 -0
  57. data/lib/kaisoku/snapshot/inline.rb +51 -0
  58. data/lib/kaisoku/snapshot/rspec.rb +22 -0
  59. data/lib/kaisoku/static_analysis/analyzer.rb +120 -0
  60. data/lib/kaisoku/test_map/dependency_queries.rb +81 -0
  61. data/lib/kaisoku/test_map/health.rb +24 -0
  62. data/lib/kaisoku/test_map/hot_files.rb +32 -0
  63. data/lib/kaisoku/test_map/schema.rb +81 -0
  64. data/lib/kaisoku/test_map/snapshot.rb +53 -0
  65. data/lib/kaisoku/test_map/stats.rb +19 -0
  66. data/lib/kaisoku/test_map.rb +170 -0
  67. data/lib/kaisoku/version.rb +5 -0
  68. data/lib/kaisoku/watch_session.rb +35 -0
  69. data/lib/kaisoku/watcher.rb +63 -0
  70. data/lib/kaisoku/worker.rb +46 -0
  71. data/lib/kaisoku.rb +67 -0
  72. metadata +186 -0
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kaisoku
4
+ class Watcher
5
+ DEFAULT_PATHS = %w[app lib spec test config db].freeze
6
+ IGNORED_PARTS = %w[.git .kaisoku].freeze
7
+
8
+ attr_reader :configuration, :paths, :interval
9
+
10
+ def initialize(configuration: Configuration.new, paths: DEFAULT_PATHS, interval: 0.2)
11
+ @configuration = configuration
12
+ @paths = Array(paths).empty? ? DEFAULT_PATHS : Array(paths)
13
+ @interval = interval.to_f
14
+ end
15
+
16
+ def snapshot
17
+ watched_files.to_h do |file|
18
+ [configuration.relative_path(file), File.mtime(file).to_f]
19
+ end
20
+ end
21
+
22
+ def changed_paths(before, after)
23
+ (before.keys | after.keys).reject { |path| before[path] == after[path] }.sort
24
+ end
25
+
26
+ def each_change
27
+ previous = snapshot
28
+
29
+ loop do
30
+ sleep interval
31
+ current = snapshot
32
+ changed = changed_paths(previous, current)
33
+
34
+ yield changed unless changed.empty?
35
+ previous = current
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def watched_files
42
+ paths.flat_map do |path|
43
+ absolute = configuration.absolute_path(path)
44
+
45
+ if File.directory?(absolute)
46
+ Dir.glob(File.join(absolute, '**', '*'), File::FNM_DOTMATCH).select { |file| watchable_file?(file) }
47
+ elsif watchable_file?(absolute)
48
+ [absolute]
49
+ else
50
+ []
51
+ end
52
+ end.uniq.sort
53
+ end
54
+
55
+ def watchable_file?(path)
56
+ return false unless File.file?(path)
57
+
58
+ relative = configuration.relative_path(path)
59
+ parts = relative.split(File::SEPARATOR)
60
+ !parts.intersect?(IGNORED_PARTS)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'rails/integration'
4
+
5
+ module Kaisoku
6
+ class Worker
7
+ def initialize(adapter:, collector: CoverageCollector.new, rails_integration: nil)
8
+ @adapter = adapter
9
+ @collector = collector
10
+ @rails_integration = rails_integration || Rails::Integration.new(configuration: adapter.configuration)
11
+ end
12
+
13
+ def run(entity)
14
+ payload = {}
15
+ collection = CoverageCollector::Result.new(dependencies: {}, skipped: true, reason: nil)
16
+
17
+ @rails_integration.wrap_reloader do
18
+ @adapter.run([entity], reporter: nil) do |event, lifecycle_entity, lifecycle_payload = {}|
19
+ case event
20
+ when :entity_started
21
+ @collector.start_entity
22
+ when :entity_finished
23
+ collection = @collector.finish_entity
24
+ payload = lifecycle_payload
25
+ entity = lifecycle_entity
26
+ end
27
+ end
28
+ end
29
+
30
+ EntityResult.new(
31
+ entity: entity,
32
+ payload: payload,
33
+ dependencies: collection.dependencies,
34
+ collection_skipped: collection.skipped?
35
+ )
36
+ rescue StandardError => e
37
+ EntityResult.new(
38
+ entity: entity,
39
+ payload: { status: 'failed', duration_ms: 0 },
40
+ dependencies: {},
41
+ collection_skipped: true,
42
+ error: "#{e.class}: #{e.message}"
43
+ )
44
+ end
45
+ end
46
+ end
data/lib/kaisoku.rb ADDED
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'kaisoku/version'
4
+ require_relative 'kaisoku/entity'
5
+ require_relative 'kaisoku/entity_result'
6
+ require_relative 'kaisoku/selection'
7
+ require_relative 'kaisoku/configuration'
8
+ require_relative 'kaisoku/runtime_context'
9
+ require_relative 'kaisoku/checksum'
10
+ require_relative 'kaisoku/environment_tracker'
11
+ require_relative 'kaisoku/method_map'
12
+ require_relative 'kaisoku/test_map'
13
+ require_relative 'kaisoku/static_analysis/analyzer'
14
+ require_relative 'kaisoku/hybrid_policy'
15
+ require_relative 'kaisoku/selector'
16
+ require_relative 'kaisoku/prioritizer'
17
+ require_relative 'kaisoku/evaluator/metrics'
18
+ require_relative 'kaisoku/evaluator/command_result'
19
+ require_relative 'kaisoku/evaluator/history'
20
+ require_relative 'kaisoku/evaluator/report'
21
+ require_relative 'kaisoku/evaluator/replay'
22
+ require_relative 'kaisoku/evaluator/mutation_seeder'
23
+ require_relative 'kaisoku/evaluator/cli'
24
+ require_relative 'kaisoku/coverage_collector'
25
+ require_relative 'kaisoku/scheduler/result_persister'
26
+ require_relative 'kaisoku/runner'
27
+ require_relative 'kaisoku/worker'
28
+ require_relative 'kaisoku/scheduler/fork_pool'
29
+ require_relative 'kaisoku/watcher'
30
+ require_relative 'kaisoku/listen_watcher'
31
+ require_relative 'kaisoku/watch_session'
32
+ require_relative 'kaisoku/lsp/message_io'
33
+ require_relative 'kaisoku/lsp/server'
34
+ require_relative 'kaisoku/doctor'
35
+ require_relative 'kaisoku/preload/server'
36
+ require_relative 'kaisoku/preload/fallback_runner'
37
+ require_relative 'kaisoku/preload/socket_path'
38
+ require_relative 'kaisoku/preload/daemon'
39
+ require_relative 'kaisoku/preload/client'
40
+ require_relative 'kaisoku/rails/integration'
41
+ require_relative 'kaisoku/snapshot/inline'
42
+ require_relative 'kaisoku/snapshot/rspec'
43
+ require_relative 'kaisoku/reporters/console'
44
+ require_relative 'kaisoku/reporters/json'
45
+ require_relative 'kaisoku/reporters/junit'
46
+ require_relative 'kaisoku/reporters/tui'
47
+ require_relative 'kaisoku/reporters/factory'
48
+ require_relative 'kaisoku/daemon/socket_path'
49
+ require_relative 'kaisoku/daemon/server'
50
+ require_relative 'kaisoku/daemon/client'
51
+ require_relative 'kaisoku/commands/run_command'
52
+ require_relative 'kaisoku/commands/map_command'
53
+ require_relative 'kaisoku/commands/watch_command'
54
+ require_relative 'kaisoku/commands/daemon_command'
55
+ require_relative 'kaisoku/commands/preload_command'
56
+ require_relative 'kaisoku/adapter'
57
+ require_relative 'kaisoku/adapters/rspec'
58
+ require_relative 'kaisoku/adapters/minitest'
59
+ require_relative 'kaisoku/adapters/test_unit'
60
+ require_relative 'kaisoku/adapters/cucumber'
61
+ require_relative 'kaisoku/cli'
62
+
63
+ module Kaisoku
64
+ class Error < StandardError; end
65
+ end
66
+
67
+ Kaisoku::Snapshot::RSpec.install
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kaisoku
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yudai Takada
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: listen
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '3.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '3.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: minitest
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '5.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: msgpack
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '1.8'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '1.8'
54
+ - !ruby/object:Gem::Dependency
55
+ name: prism
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '1.0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '1.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: sqlite3
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '1.7'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '1.7'
82
+ description: Kaisoku selects impacted Ruby tests with safe fallbacks, dependency maps,
83
+ parallel execution, and evaluation tooling.
84
+ email:
85
+ - t.yudai92@gmail.com
86
+ executables:
87
+ - kaisoku
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - LICENSE.txt
92
+ - README.md
93
+ - Rakefile
94
+ - exe/kaisoku
95
+ - lib/kaisoku.rb
96
+ - lib/kaisoku/adapter.rb
97
+ - lib/kaisoku/adapters/cucumber.rb
98
+ - lib/kaisoku/adapters/minitest.rb
99
+ - lib/kaisoku/adapters/rspec.rb
100
+ - lib/kaisoku/adapters/test_unit.rb
101
+ - lib/kaisoku/checksum.rb
102
+ - lib/kaisoku/cli.rb
103
+ - lib/kaisoku/commands/daemon_command.rb
104
+ - lib/kaisoku/commands/map_command.rb
105
+ - lib/kaisoku/commands/preload_command.rb
106
+ - lib/kaisoku/commands/run_command.rb
107
+ - lib/kaisoku/commands/watch_command.rb
108
+ - lib/kaisoku/configuration.rb
109
+ - lib/kaisoku/coverage_collector.rb
110
+ - lib/kaisoku/daemon/client.rb
111
+ - lib/kaisoku/daemon/server.rb
112
+ - lib/kaisoku/daemon/socket_path.rb
113
+ - lib/kaisoku/doctor.rb
114
+ - lib/kaisoku/entity.rb
115
+ - lib/kaisoku/entity_result.rb
116
+ - lib/kaisoku/environment_tracker.rb
117
+ - lib/kaisoku/evaluator/cli.rb
118
+ - lib/kaisoku/evaluator/command_result.rb
119
+ - lib/kaisoku/evaluator/history.rb
120
+ - lib/kaisoku/evaluator/metrics.rb
121
+ - lib/kaisoku/evaluator/mutation_seeder.rb
122
+ - lib/kaisoku/evaluator/replay.rb
123
+ - lib/kaisoku/evaluator/report.rb
124
+ - lib/kaisoku/hybrid_policy.rb
125
+ - lib/kaisoku/listen_watcher.rb
126
+ - lib/kaisoku/lsp/message_io.rb
127
+ - lib/kaisoku/lsp/server.rb
128
+ - lib/kaisoku/method_map.rb
129
+ - lib/kaisoku/preload/client.rb
130
+ - lib/kaisoku/preload/daemon.rb
131
+ - lib/kaisoku/preload/fallback_runner.rb
132
+ - lib/kaisoku/preload/server.rb
133
+ - lib/kaisoku/preload/socket_path.rb
134
+ - lib/kaisoku/prioritizer.rb
135
+ - lib/kaisoku/rails/integration.rb
136
+ - lib/kaisoku/reporters/console.rb
137
+ - lib/kaisoku/reporters/factory.rb
138
+ - lib/kaisoku/reporters/json.rb
139
+ - lib/kaisoku/reporters/junit.rb
140
+ - lib/kaisoku/reporters/tui.rb
141
+ - lib/kaisoku/runner.rb
142
+ - lib/kaisoku/runtime_context.rb
143
+ - lib/kaisoku/scheduler/fork_pool.rb
144
+ - lib/kaisoku/scheduler/result_persister.rb
145
+ - lib/kaisoku/selection.rb
146
+ - lib/kaisoku/selector.rb
147
+ - lib/kaisoku/snapshot/inline.rb
148
+ - lib/kaisoku/snapshot/rspec.rb
149
+ - lib/kaisoku/static_analysis/analyzer.rb
150
+ - lib/kaisoku/test_map.rb
151
+ - lib/kaisoku/test_map/dependency_queries.rb
152
+ - lib/kaisoku/test_map/health.rb
153
+ - lib/kaisoku/test_map/hot_files.rb
154
+ - lib/kaisoku/test_map/schema.rb
155
+ - lib/kaisoku/test_map/snapshot.rb
156
+ - lib/kaisoku/test_map/stats.rb
157
+ - lib/kaisoku/version.rb
158
+ - lib/kaisoku/watch_session.rb
159
+ - lib/kaisoku/watcher.rb
160
+ - lib/kaisoku/worker.rb
161
+ homepage: https://github.com/ydah/kaisoku
162
+ licenses:
163
+ - MIT
164
+ metadata:
165
+ allowed_push_host: https://rubygems.org
166
+ homepage_uri: https://github.com/ydah/kaisoku
167
+ source_code_uri: https://github.com/ydah/kaisoku
168
+ rubygems_mfa_required: 'true'
169
+ rdoc_options: []
170
+ require_paths:
171
+ - lib
172
+ required_ruby_version: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: 3.2.0
177
+ required_rubygems_version: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ requirements: []
183
+ rubygems_version: 4.0.6
184
+ specification_version: 4
185
+ summary: Research-backed regression test selection for Ruby.
186
+ test_files: []