thread_weaver 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 (53) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/main.yml +19 -0
  3. data/.gitignore +59 -0
  4. data/.rspec +3 -0
  5. data/.vscode/settings.json +14 -0
  6. data/CHANGELOG.md +7 -0
  7. data/Gemfile +17 -0
  8. data/LICENSE +21 -0
  9. data/README.md +37 -0
  10. data/Rakefile +13 -0
  11. data/bin/console +15 -0
  12. data/bin/gem_smoke_test +10 -0
  13. data/bin/setup +8 -0
  14. data/examples/always_deadlocks.rb +15 -0
  15. data/examples/takes_a_while.rb +7 -0
  16. data/examples/thread_safe_nonblocking_run_at_most_once.rb +23 -0
  17. data/examples/thread_safe_run_at_most_once.rb +19 -0
  18. data/examples/thread_unsafe_run_at_most_once.rb +17 -0
  19. data/lib/thread_weaver.rb +15 -0
  20. data/lib/thread_weaver/controllable_thread.rb +177 -0
  21. data/lib/thread_weaver/iterative_race_detector.rb +178 -0
  22. data/lib/thread_weaver/thread_instruction.rb +68 -0
  23. data/lib/thread_weaver/version.rb +6 -0
  24. data/sorbet/config +2 -0
  25. data/sorbet/rbi/gems/ast.rbi +48 -0
  26. data/sorbet/rbi/gems/coderay.rbi +285 -0
  27. data/sorbet/rbi/gems/method_source.rbi +64 -0
  28. data/sorbet/rbi/gems/parallel.rbi +83 -0
  29. data/sorbet/rbi/gems/parser.rbi +1510 -0
  30. data/sorbet/rbi/gems/pry-nav.rbi +29 -0
  31. data/sorbet/rbi/gems/pry.rbi +1965 -0
  32. data/sorbet/rbi/gems/rainbow.rbi +118 -0
  33. data/sorbet/rbi/gems/rake.rbi +645 -0
  34. data/sorbet/rbi/gems/regexp_parser.rbi +920 -0
  35. data/sorbet/rbi/gems/rexml.rbi +589 -0
  36. data/sorbet/rbi/gems/rspec-core.rbi +1893 -0
  37. data/sorbet/rbi/gems/rspec-expectations.rbi +1148 -0
  38. data/sorbet/rbi/gems/rspec-mocks.rbi +1091 -0
  39. data/sorbet/rbi/gems/rspec-support.rbi +280 -0
  40. data/sorbet/rbi/gems/rspec.rbi +15 -0
  41. data/sorbet/rbi/gems/rubocop-ast.rbi +1351 -0
  42. data/sorbet/rbi/gems/rubocop-performance.rbi +471 -0
  43. data/sorbet/rbi/gems/rubocop.rbi +7510 -0
  44. data/sorbet/rbi/gems/ruby-progressbar.rbi +305 -0
  45. data/sorbet/rbi/gems/standard.rbi +141 -0
  46. data/sorbet/rbi/gems/unicode-display_width.rbi +17 -0
  47. data/sorbet/rbi/hidden-definitions/errors.txt +4309 -0
  48. data/sorbet/rbi/hidden-definitions/hidden.rbi +8622 -0
  49. data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +276 -0
  50. data/sorbet/rbi/sorbet-typed/lib/rubocop-performance/~>1.6/rubocop-performance.rbi +149 -0
  51. data/sorbet/rbi/todo.rbi +6 -0
  52. data/thread_weaver.gemspec +34 -0
  53. metadata +111 -0
@@ -0,0 +1,276 @@
1
+ # This file is autogenerated. Do not edit it by hand. Regenerate it with:
2
+ # srb rbi sorbet-typed
3
+ #
4
+ # If you would like to make changes to this file, great! Please upstream any changes you make here:
5
+ #
6
+ # https://github.com/sorbet/sorbet-typed/edit/master/lib/rainbow/all/rainbow.rbi
7
+ #
8
+ # typed: strong
9
+
10
+ module Rainbow
11
+ sig { returns(T::Boolean) }
12
+ attr_accessor :enabled
13
+
14
+ class Color
15
+ sig { returns(Symbol) }
16
+ attr_reader :ground
17
+
18
+ sig do
19
+ params(
20
+ ground: Symbol,
21
+ values: T.any([Integer], [Integer, Integer, Integer])
22
+ ).returns(Color)
23
+ end
24
+ def self.build(ground, values); end
25
+
26
+ sig { params(hex: String).returns([Integer, Integer, Integer]) }
27
+ def self.parse_hex_color(hex); end
28
+
29
+ class Indexed < Color
30
+ sig { returns(Integer) }
31
+ attr_reader :num
32
+
33
+ sig { params(ground: Symbol, num: Integer).returns(Indexed) }
34
+ def initialize(ground, num); end
35
+
36
+ sig { returns(T::Array[Integer]) }
37
+ def codes; end
38
+ end
39
+
40
+ class Named < Indexed
41
+ NAMES = T.let(nil, T::Hash[Symbol, Integer])
42
+
43
+ sig { returns(T::Array[Symbol]) }
44
+ def self.color_names; end
45
+
46
+ sig { returns(String) }
47
+ def self.valid_names; end
48
+
49
+ sig { params(ground: Symbol, name: Symbol).returns(Named) }
50
+ def initialize(ground, name); end
51
+ end
52
+
53
+ class RGB < Indexed
54
+ sig { returns(Integer) }
55
+ attr_accessor :r, :g, :b
56
+
57
+ sig { params(value: Numeric).returns(Integer) }
58
+ def to_ansi_domain(value); end
59
+
60
+ sig { params(ground: Symbol, values: Integer).returns(RGB) }
61
+ def initialize(ground, *values); end
62
+
63
+ sig { returns(T::Array[Integer]) }
64
+ def codes; end
65
+ end
66
+
67
+ class X11Named < RGB
68
+ include X11ColorNames
69
+
70
+ sig { returns(T::Array[Symbol]) }
71
+ def self.color_names; end
72
+
73
+ sig { returns(String) }
74
+ def self.valid_names; end
75
+
76
+ sig { params(ground: Symbol, name: Symbol).returns(X11Named) }
77
+ def initialize(ground, name); end
78
+ end
79
+ end
80
+
81
+ sig { returns(Wrapper) }
82
+ def self.global; end
83
+
84
+ sig { returns(T::Boolean) }
85
+ def self.enabled; end
86
+
87
+ sig { params(value: T::Boolean).returns(T::Boolean) }
88
+ def self.enabled=(value); end
89
+
90
+ sig { params(string: String).returns(String) }
91
+ def self.uncolor(string); end
92
+
93
+ class NullPresenter < String
94
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
95
+ def color(*values); end
96
+
97
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
98
+ def foreground(*values); end
99
+
100
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
101
+ def fg(*values); end
102
+
103
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
104
+ def background(*values); end
105
+
106
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
107
+ def bg(*values); end
108
+
109
+ sig { returns(NullPresenter) }
110
+ def reset; end
111
+
112
+ sig { returns(NullPresenter) }
113
+ def bright; end
114
+
115
+ sig { returns(NullPresenter) }
116
+ def faint; end
117
+
118
+ sig { returns(NullPresenter) }
119
+ def italic; end
120
+
121
+ sig { returns(NullPresenter) }
122
+ def underline; end
123
+
124
+ sig { returns(NullPresenter) }
125
+ def blink; end
126
+
127
+ sig { returns(NullPresenter) }
128
+ def inverse; end
129
+
130
+ sig { returns(NullPresenter) }
131
+ def hide; end
132
+
133
+ sig { returns(NullPresenter) }
134
+ def cross_out; end
135
+
136
+ sig { returns(NullPresenter) }
137
+ def black; end
138
+
139
+ sig { returns(NullPresenter) }
140
+ def red; end
141
+
142
+ sig { returns(NullPresenter) }
143
+ def green; end
144
+
145
+ sig { returns(NullPresenter) }
146
+ def yellow; end
147
+
148
+ sig { returns(NullPresenter) }
149
+ def blue; end
150
+
151
+ sig { returns(NullPresenter) }
152
+ def magenta; end
153
+
154
+ sig { returns(NullPresenter) }
155
+ def cyan; end
156
+
157
+ sig { returns(NullPresenter) }
158
+ def white; end
159
+
160
+ sig { returns(NullPresenter) }
161
+ def bold; end
162
+
163
+ sig { returns(NullPresenter) }
164
+ def dark; end
165
+
166
+ sig { returns(NullPresenter) }
167
+ def strike; end
168
+ end
169
+
170
+ class Presenter < String
171
+ TERM_EFFECTS = T.let(nil, T::Hash[Symbol, Integer])
172
+
173
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
174
+ def color(*values); end
175
+
176
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
177
+ def foreground(*values); end
178
+
179
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
180
+ def fg(*values); end
181
+
182
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
183
+ def background(*values); end
184
+
185
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
186
+ def bg(*values); end
187
+
188
+ sig { returns(Presenter) }
189
+ def reset; end
190
+
191
+ sig { returns(Presenter) }
192
+ def bright; end
193
+
194
+ sig { returns(Presenter) }
195
+ def faint; end
196
+
197
+ sig { returns(Presenter) }
198
+ def italic; end
199
+
200
+ sig { returns(Presenter) }
201
+ def underline; end
202
+
203
+ sig { returns(Presenter) }
204
+ def blink; end
205
+
206
+ sig { returns(Presenter) }
207
+ def inverse; end
208
+
209
+ sig { returns(Presenter) }
210
+ def hide; end
211
+
212
+ sig { returns(Presenter) }
213
+ def cross_out; end
214
+
215
+ sig { returns(Presenter) }
216
+ def black; end
217
+
218
+ sig { returns(Presenter) }
219
+ def red; end
220
+
221
+ sig { returns(Presenter) }
222
+ def green; end
223
+
224
+ sig { returns(Presenter) }
225
+ def yellow; end
226
+
227
+ sig { returns(Presenter) }
228
+ def blue; end
229
+
230
+ sig { returns(Presenter) }
231
+ def magenta; end
232
+
233
+ sig { returns(Presenter) }
234
+ def cyan; end
235
+
236
+ sig { returns(Presenter) }
237
+ def white; end
238
+
239
+ sig { returns(Presenter) }
240
+ def bold; end
241
+
242
+ sig { returns(Presenter) }
243
+ def dark; end
244
+
245
+ sig { returns(Presenter) }
246
+ def strike; end
247
+ end
248
+
249
+ class StringUtils
250
+ sig { params(string: String, codes: T::Array[Integer]).returns(String) }
251
+ def self.wrap_with_sgr(string, codes); end
252
+
253
+ sig { params(string: String).returns(String) }
254
+ def uncolor(string); end
255
+ end
256
+
257
+ VERSION = T.let(nil, String)
258
+
259
+ class Wrapper
260
+ sig { returns(T::Boolean) }
261
+ attr_accessor :enabled
262
+
263
+ sig { params(enabled: T::Boolean).returns(Wrapper) }
264
+ def initialize(enabled = true); end
265
+
266
+ sig { params(string: String).returns(T.any(Rainbow::Presenter, Rainbow::NullPresenter)) }
267
+ def wrap(string); end
268
+ end
269
+
270
+ module X11ColorNames
271
+ NAMES = T.let(nil, T::Hash[Symbol, [Integer, Integer, Integer]])
272
+ end
273
+ end
274
+
275
+ sig { params(string: String).returns(Rainbow::Presenter) }
276
+ def Rainbow(string); end
@@ -0,0 +1,149 @@
1
+ # This file is autogenerated. Do not edit it by hand. Regenerate it with:
2
+ # srb rbi sorbet-typed
3
+ #
4
+ # If you would like to make changes to this file, great! Please upstream any changes you make here:
5
+ #
6
+ # https://github.com/sorbet/sorbet-typed/edit/master/lib/rubocop-performance/~>1.6/rubocop-performance.rbi
7
+ #
8
+ # typed: strict
9
+
10
+ module RuboCop::Performance
11
+ CONFIG = ::T.let(nil, ::T.untyped)
12
+ end
13
+
14
+ module RuboCop::Performance::Version
15
+ STRING = ::T.let(nil, ::T.untyped)
16
+ end
17
+
18
+ class RuboCop::Cop::Performance::BindCall
19
+ MSG = ::T.let(nil, ::T.untyped)
20
+ end
21
+
22
+ class RuboCop::Cop::Performance::Caller
23
+ MSG_BRACE = ::T.let(nil, ::T.untyped)
24
+ MSG_FIRST = ::T.let(nil, ::T.untyped)
25
+ end
26
+
27
+ class RuboCop::Cop::Performance::CaseWhenSplat
28
+ ARRAY_MSG = ::T.let(nil, ::T.untyped)
29
+ MSG = ::T.let(nil, ::T.untyped)
30
+ end
31
+
32
+ class RuboCop::Cop::Performance::Casecmp
33
+ CASE_METHODS = ::T.let(nil, ::T.untyped)
34
+ MSG = ::T.let(nil, ::T.untyped)
35
+ end
36
+
37
+ class RuboCop::Cop::Performance::ChainArrayAllocation
38
+ ALWAYS_RETURNS_NEW_ARRAY = ::T.let(nil, ::T.untyped)
39
+ HAS_MUTATION_ALTERNATIVE = ::T.let(nil, ::T.untyped)
40
+ MSG = ::T.let(nil, ::T.untyped)
41
+ RETURNS_NEW_ARRAY_WHEN_NO_BLOCK = ::T.let(nil, ::T.untyped)
42
+ RETURN_NEW_ARRAY_WHEN_ARGS = ::T.let(nil, ::T.untyped)
43
+ end
44
+
45
+ class RuboCop::Cop::Performance::CompareWithBlock
46
+ MSG = ::T.let(nil, ::T.untyped)
47
+ end
48
+
49
+ class RuboCop::Cop::Performance::Count
50
+ MSG = ::T.let(nil, ::T.untyped)
51
+ end
52
+
53
+ class RuboCop::Cop::Performance::DeletePrefix
54
+ MSG = ::T.let(nil, ::T.untyped)
55
+ PREFERRED_METHODS = ::T.let(nil, ::T.untyped)
56
+ end
57
+
58
+ class RuboCop::Cop::Performance::DeleteSuffix
59
+ MSG = ::T.let(nil, ::T.untyped)
60
+ PREFERRED_METHODS = ::T.let(nil, ::T.untyped)
61
+ end
62
+
63
+ class RuboCop::Cop::Performance::Detect
64
+ MSG = ::T.let(nil, ::T.untyped)
65
+ REVERSE_MSG = ::T.let(nil, ::T.untyped)
66
+ end
67
+
68
+ class RuboCop::Cop::Performance::DoubleStartEndWith
69
+ MSG = ::T.let(nil, ::T.untyped)
70
+ end
71
+
72
+ class RuboCop::Cop::Performance::EndWith
73
+ MSG = ::T.let(nil, ::T.untyped)
74
+ end
75
+
76
+ class RuboCop::Cop::Performance::FixedSize
77
+ MSG = ::T.let(nil, ::T.untyped)
78
+ end
79
+
80
+ class RuboCop::Cop::Performance::FlatMap
81
+ FLATTEN_MULTIPLE_LEVELS = ::T.let(nil, ::T.untyped)
82
+ MSG = ::T.let(nil, ::T.untyped)
83
+ end
84
+
85
+ class RuboCop::Cop::Performance::OpenStruct
86
+ MSG = ::T.let(nil, ::T.untyped)
87
+ end
88
+
89
+ class RuboCop::Cop::Performance::RangeInclude
90
+ MSG = ::T.let(nil, ::T.untyped)
91
+ end
92
+
93
+ class RuboCop::Cop::Performance::RedundantBlockCall
94
+ CLOSE_PAREN = ::T.let(nil, ::T.untyped)
95
+ MSG = ::T.let(nil, ::T.untyped)
96
+ OPEN_PAREN = ::T.let(nil, ::T.untyped)
97
+ SPACE = ::T.let(nil, ::T.untyped)
98
+ YIELD = ::T.let(nil, ::T.untyped)
99
+ end
100
+
101
+ class RuboCop::Cop::Performance::RedundantMatch
102
+ MSG = ::T.let(nil, ::T.untyped)
103
+ end
104
+
105
+ class RuboCop::Cop::Performance::RedundantMerge
106
+ AREF_ASGN = ::T.let(nil, ::T.untyped)
107
+ MSG = ::T.let(nil, ::T.untyped)
108
+ WITH_MODIFIER_CORRECTION = ::T.let(nil, ::T.untyped)
109
+ end
110
+
111
+ class RuboCop::Cop::Performance::RegexpMatch
112
+ MATCH_NODE_PATTERN = ::T.let(nil, ::T.untyped)
113
+ MSG = ::T.let(nil, ::T.untyped)
114
+ TYPES_IMPLEMENTING_MATCH = ::T.let(nil, ::T.untyped)
115
+ end
116
+
117
+ class RuboCop::Cop::Performance::ReverseEach
118
+ MSG = ::T.let(nil, ::T.untyped)
119
+ UNDERSCORE = ::T.let(nil, ::T.untyped)
120
+ end
121
+
122
+ class RuboCop::Cop::Performance::Size
123
+ MSG = ::T.let(nil, ::T.untyped)
124
+ end
125
+
126
+ class RuboCop::Cop::Performance::StartWith
127
+ MSG = ::T.let(nil, ::T.untyped)
128
+ end
129
+
130
+ class RuboCop::Cop::Performance::StringReplacement
131
+ BANG = ::T.let(nil, ::T.untyped)
132
+ DELETE = ::T.let(nil, ::T.untyped)
133
+ DETERMINISTIC_REGEX = ::T.let(nil, ::T.untyped)
134
+ MSG = ::T.let(nil, ::T.untyped)
135
+ TR = ::T.let(nil, ::T.untyped)
136
+ end
137
+
138
+ class RuboCop::Cop::Performance::TimesMap
139
+ MESSAGE = ::T.let(nil, ::T.untyped)
140
+ MESSAGE_ONLY_IF = ::T.let(nil, ::T.untyped)
141
+ end
142
+
143
+ class RuboCop::Cop::Performance::UnfreezeString
144
+ MSG = ::T.let(nil, ::T.untyped)
145
+ end
146
+
147
+ class RuboCop::Cop::Performance::UriDefaultParser
148
+ MSG = ::T.let(nil, ::T.untyped)
149
+ end
@@ -0,0 +1,6 @@
1
+ # This file is autogenerated. Do not edit it by hand. Regenerate it with:
2
+ # srb rbi todo
3
+
4
+ # typed: strong
5
+ module T::CompatibilityPatches::RSpecCompatibility::MethodDoubleExtensions; end
6
+ module T::CompatibilityPatches::RSpecCompatibility::RecorderExtensions; end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/thread_weaver/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "thread_weaver"
7
+ spec.version = ThreadWeaver::VERSION
8
+ spec.authors = ["Andrew Hamon"]
9
+ spec.email = ["and.ham95@gmail.com"]
10
+
11
+ spec.summary = "Tool-assisted thread-safety testing inspired by ThreadWeaver for Java"
12
+ spec.homepage = "https://github.com/andrewhamon/thread_weaver_rb"
13
+ spec.license = "MIT"
14
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "https://github.com/andrewhamon/thread_weaver_rb"
18
+ spec.metadata["changelog_uri"] = "https://github.com/andrewhamon/thread_weaver_rb/blob/main/CHANGELOG.md"
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ # Uncomment to register a new dependency of your gem
30
+ spec.add_dependency "sorbet-runtime"
31
+
32
+ # For more information and examples about making a new gem, checkout our
33
+ # guide at: https://bundler.io/guides/creating_gem.html
34
+ end