rbs 3.0.0.dev.2 → 3.0.0.dev.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +2 -1
  3. data/.github/workflows/ruby.yml +4 -0
  4. data/Gemfile.lock +11 -11
  5. data/Rakefile +2 -2
  6. data/Steepfile +1 -1
  7. data/core/array.rbs +573 -423
  8. data/core/basic_object.rbs +11 -39
  9. data/core/binding.rbs +1 -1
  10. data/core/builtin.rbs +8 -0
  11. data/core/class.rbs +37 -0
  12. data/core/comparable.rbs +7 -18
  13. data/core/complex.rbs +2 -2
  14. data/core/data.rbs +419 -0
  15. data/core/dir.rbs +52 -104
  16. data/core/encoding.rbs +22 -181
  17. data/core/enumerable.rbs +212 -175
  18. data/core/enumerator/product.rbs +96 -0
  19. data/core/enumerator.rbs +57 -8
  20. data/core/errors.rbs +8 -2
  21. data/core/exception.rbs +41 -0
  22. data/core/fiber.rbs +95 -12
  23. data/core/file.rbs +840 -275
  24. data/core/file_test.rbs +34 -19
  25. data/core/float.rbs +40 -96
  26. data/core/gc.rbs +15 -3
  27. data/core/hash.rbs +113 -175
  28. data/core/integer.rbs +85 -145
  29. data/core/io/buffer.rbs +187 -60
  30. data/core/io/wait.rbs +28 -16
  31. data/core/io.rbs +1859 -1389
  32. data/core/kernel.rbs +525 -961
  33. data/core/match_data.rbs +306 -142
  34. data/core/math.rbs +506 -234
  35. data/core/method.rbs +0 -24
  36. data/core/module.rbs +110 -17
  37. data/core/nil_class.rbs +2 -0
  38. data/core/numeric.rbs +76 -144
  39. data/core/object.rbs +88 -212
  40. data/core/proc.rbs +17 -5
  41. data/core/process.rbs +22 -5
  42. data/core/ractor.rbs +1 -1
  43. data/core/random.rbs +20 -3
  44. data/core/range.rbs +91 -89
  45. data/core/rational.rbs +2 -3
  46. data/core/rbs/unnamed/argf.rbs +177 -120
  47. data/core/rbs/unnamed/env_class.rbs +89 -163
  48. data/core/rbs/unnamed/random.rbs +36 -12
  49. data/core/refinement.rbs +8 -0
  50. data/core/regexp.rbs +462 -272
  51. data/core/ruby_vm.rbs +210 -0
  52. data/{stdlib/set/0 → core}/set.rbs +43 -47
  53. data/core/string.rbs +1403 -1332
  54. data/core/string_io.rbs +191 -107
  55. data/core/struct.rbs +67 -63
  56. data/core/symbol.rbs +187 -201
  57. data/core/thread.rbs +40 -35
  58. data/core/time.rbs +902 -826
  59. data/core/trace_point.rbs +55 -6
  60. data/core/unbound_method.rbs +48 -24
  61. data/docs/collection.md +4 -0
  62. data/docs/syntax.md +55 -0
  63. data/ext/rbs_extension/parser.c +5 -6
  64. data/lib/rbs/cli.rb +6 -1
  65. data/lib/rbs/collection/cleaner.rb +8 -1
  66. data/lib/rbs/collection/config/lockfile.rb +3 -1
  67. data/lib/rbs/collection/config/lockfile_generator.rb +16 -14
  68. data/lib/rbs/collection/config.rb +1 -1
  69. data/lib/rbs/collection/sources/git.rb +9 -2
  70. data/lib/rbs/collection/sources/local.rb +79 -0
  71. data/lib/rbs/collection/sources.rb +8 -1
  72. data/lib/rbs/environment.rb +6 -5
  73. data/lib/rbs/environment_loader.rb +3 -2
  74. data/lib/rbs/errors.rb +18 -0
  75. data/lib/rbs/locator.rb +26 -7
  76. data/lib/rbs/sorter.rb +2 -2
  77. data/lib/rbs/version.rb +1 -1
  78. data/sig/collection/sources.rbs +32 -3
  79. data/sig/environment.rbs +2 -3
  80. data/sig/locator.rbs +14 -2
  81. data/sig/shims/{abstract_syntax_tree.rbs → _abstract_syntax_tree.rbs} +0 -0
  82. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -13
  83. data/stdlib/cgi/0/core.rbs +16 -0
  84. data/stdlib/coverage/0/coverage.rbs +50 -8
  85. data/stdlib/csv/0/csv.rbs +1 -1
  86. data/stdlib/date/0/date.rbs +856 -726
  87. data/stdlib/date/0/date_time.rbs +83 -210
  88. data/stdlib/erb/0/erb.rbs +13 -36
  89. data/stdlib/etc/0/etc.rbs +127 -20
  90. data/stdlib/fileutils/0/fileutils.rbs +1290 -381
  91. data/stdlib/logger/0/logger.rbs +466 -316
  92. data/stdlib/net-http/0/net-http.rbs +2211 -534
  93. data/stdlib/nkf/0/nkf.rbs +5 -5
  94. data/stdlib/objspace/0/objspace.rbs +31 -14
  95. data/stdlib/openssl/0/openssl.rbs +11 -7
  96. data/stdlib/optparse/0/optparse.rbs +20 -17
  97. data/stdlib/pathname/0/pathname.rbs +21 -4
  98. data/stdlib/pstore/0/pstore.rbs +378 -154
  99. data/stdlib/pty/0/pty.rbs +24 -8
  100. data/stdlib/ripper/0/ripper.rbs +1650 -0
  101. data/stdlib/socket/0/addrinfo.rbs +9 -15
  102. data/stdlib/socket/0/socket.rbs +36 -3
  103. data/stdlib/strscan/0/string_scanner.rbs +7 -5
  104. data/stdlib/tempfile/0/tempfile.rbs +104 -44
  105. data/stdlib/time/0/time.rbs +2 -2
  106. data/stdlib/uri/0/file.rbs +5 -0
  107. data/stdlib/uri/0/generic.rbs +2 -2
  108. data/stdlib/yaml/0/yaml.rbs +2 -2
  109. data/stdlib/zlib/0/zlib.rbs +1 -1
  110. metadata +8 -6
  111. data/core/deprecated.rbs +0 -9
  112. data/sig/shims/ripper.rbs +0 -8
@@ -1,122 +1,349 @@
1
1
  # <!-- rdoc-file=lib/pstore.rb -->
2
- # PStore implements a file based persistence mechanism based on a Hash. User
3
- # code can store hierarchies of Ruby objects (values) into the data store file
4
- # by name (keys). An object hierarchy may be just a single object. User code
5
- # may later read values back from the data store or even update data, as needed.
2
+ # PStore implements a file based persistence mechanism based on a Hash. User
3
+ # code can store hierarchies of Ruby objects (values) into the data store by
4
+ # name (keys). An object hierarchy may be just a single object. User code may
5
+ # later read values back from the data store or even update data, as needed.
6
6
  #
7
7
  # The transactional behavior ensures that any changes succeed or fail together.
8
8
  # This can be used to ensure that the data store is not left in a transitory
9
9
  # state, where some values were updated but others were not.
10
10
  #
11
11
  # Behind the scenes, Ruby objects are stored to the data store file with
12
- # Marshal. That carries the usual limitations. Proc objects cannot be
12
+ # Marshal. That carries the usual limitations. Proc objects cannot be
13
13
  # marshalled, for example.
14
14
  #
15
- # ## Usage example:
15
+ # There are three important concepts here (details at the links):
16
+ #
17
+ # * [Store](rdoc-ref:PStore@The+Store): a store is an instance of PStore.
18
+ # * [Entries](rdoc-ref:PStore@Entries): the store is hash-like; each entry is
19
+ # the key for a stored object.
20
+ # * [Transactions](rdoc-ref:PStore@Transactions): each transaction is a
21
+ # collection of prospective changes to the store; a transaction is defined
22
+ # in the block given with a call to PStore#transaction.
23
+ #
24
+ #
25
+ # ## About the Examples
26
+ #
27
+ # Examples on this page need a store that has known properties. They can get a
28
+ # new (and populated) store by calling thus:
29
+ #
30
+ # example_store do |store|
31
+ # # Example code using store goes here.
32
+ # end
33
+ #
34
+ # All we really need to know about `example_store` is that it yields a fresh
35
+ # store with a known population of entries; its implementation:
36
+ #
37
+ # require 'pstore'
38
+ # require 'tempfile'
39
+ # # Yield a pristine store for use in examples.
40
+ # def example_store
41
+ # # Create the store in a temporary file.
42
+ # Tempfile.create do |file|
43
+ # store = PStore.new(file)
44
+ # # Populate the store.
45
+ # store.transaction do
46
+ # store[:foo] = 0
47
+ # store[:bar] = 1
48
+ # store[:baz] = 2
49
+ # end
50
+ # yield store
51
+ # end
52
+ # end
53
+ #
54
+ # ## The Store
55
+ #
56
+ # The contents of the store are maintained in a file whose path is specified
57
+ # when the store is created (see PStore.new). The objects are stored and
58
+ # retrieved using module Marshal, which means that certain objects cannot be
59
+ # added to the store; see [Marshal::dump](rdoc-ref:Marshal.dump).
60
+ #
61
+ # ## Entries
62
+ #
63
+ # A store may have any number of entries. Each entry has a key and a value, just
64
+ # as in a hash:
65
+ #
66
+ # * Key: as in a hash, the key can be (almost) any object; see [Hash
67
+ # Keys](rdoc-ref:Hash@Hash+Keys). You may find it convenient to keep it
68
+ # simple by using only symbols or strings as keys.
69
+ # * Value: the value may be any object that can be marshalled by Marshal (see
70
+ # [Marshal::dump](rdoc-ref:Marshal.dump)) and in fact may be a collection
71
+ # (e.g., an array, a hash, a set, a range, etc). That collection may in turn
72
+ # contain nested objects, including collections, to any depth; those objects
73
+ # must also be Marshal-able. See [Hierarchical
74
+ # Values](rdoc-ref:PStore@Hierarchical+Values).
75
+ #
76
+ #
77
+ # ## Transactions
78
+ #
79
+ # ### The Transaction Block
80
+ #
81
+ # The block given with a call to method #transaction# contains a *transaction*,
82
+ # which consists of calls to PStore methods that read from or write to the store
83
+ # (that is, all PStore methods except #transaction itself, #path, and
84
+ # Pstore.new):
85
+ #
86
+ # example_store do |store|
87
+ # store.transaction do
88
+ # store.keys # => [:foo, :bar, :baz]
89
+ # store[:bat] = 3
90
+ # store.keys # => [:foo, :bar, :baz, :bat]
91
+ # end
92
+ # end
93
+ #
94
+ # Execution of the transaction is deferred until the block exits, and is
95
+ # executed *atomically* (all-or-nothing): either all transaction calls are
96
+ # executed, or none are. This maintains the integrity of the store.
97
+ #
98
+ # Other code in the block (including even calls to #path and PStore.new) is
99
+ # executed immediately, not deferred.
100
+ #
101
+ # The transaction block:
102
+ #
103
+ # * May not contain a nested call to #transaction.
104
+ # * Is the only context where methods that read from or write to the store are
105
+ # allowed.
106
+ #
107
+ #
108
+ # As seen above, changes in a transaction are made automatically when the block
109
+ # exits. The block may be exited early by calling method #commit or #abort.
110
+ #
111
+ # * Method #commit triggers the update to the store and exits the block:
112
+ #
113
+ # example_store do |store|
114
+ # store.transaction do
115
+ # store.keys # => [:foo, :bar, :baz]
116
+ # store[:bat] = 3
117
+ # store.commit
118
+ # fail 'Cannot get here'
119
+ # end
120
+ # store.transaction do
121
+ # # Update was completed.
122
+ # store.keys # => [:foo, :bar, :baz, :bat]
123
+ # end
124
+ # end
125
+ #
126
+ # * Method #abort discards the update to the store and exits the block:
127
+ #
128
+ # example_store do |store|
129
+ # store.transaction do
130
+ # store.keys # => [:foo, :bar, :baz]
131
+ # store[:bat] = 3
132
+ # store.abort
133
+ # fail 'Cannot get here'
134
+ # end
135
+ # store.transaction do
136
+ # # Update was not completed.
137
+ # store.keys # => [:foo, :bar, :baz]
138
+ # end
139
+ # end
140
+ #
141
+ #
142
+ # ### Read-Only Transactions
143
+ #
144
+ # By default, a transaction allows both reading from and writing to the store:
145
+ #
146
+ # store.transaction do
147
+ # # Read-write transaction.
148
+ # # Any code except a call to #transaction is allowed here.
149
+ # end
150
+ #
151
+ # If argument `read_only` is passed as `true`, only reading is allowed:
152
+ #
153
+ # store.transaction(true) do
154
+ # # Read-only transaction:
155
+ # # Calls to #transaction, #[]=, and #delete are not allowed here.
156
+ # end
157
+ #
158
+ # ## Hierarchical Values
159
+ #
160
+ # The value for an entry may be a simple object (as seen above). It may also be
161
+ # a hierarchy of objects nested to any depth:
162
+ #
163
+ # deep_store = PStore.new('deep.store')
164
+ # deep_store.transaction do
165
+ # array_of_hashes = [{}, {}, {}]
166
+ # deep_store[:array_of_hashes] = array_of_hashes
167
+ # deep_store[:array_of_hashes] # => [{}, {}, {}]
168
+ # hash_of_arrays = {foo: [], bar: [], baz: []}
169
+ # deep_store[:hash_of_arrays] = hash_of_arrays
170
+ # deep_store[:hash_of_arrays] # => {:foo=>[], :bar=>[], :baz=>[]}
171
+ # deep_store[:hash_of_arrays][:foo].push(:bat)
172
+ # deep_store[:hash_of_arrays] # => {:foo=>[:bat], :bar=>[], :baz=>[]}
173
+ # end
174
+ #
175
+ # And recall that you can use [dig methods](rdoc-ref:dig_methods.rdoc) in a
176
+ # returned hierarchy of objects.
177
+ #
178
+ # ## Working with the Store
179
+ #
180
+ # ### Creating a Store
181
+ #
182
+ # Use method PStore.new to create a store. The new store creates or opens its
183
+ # containing file:
184
+ #
185
+ # store = PStore.new('t.store')
186
+ #
187
+ # ### Modifying the Store
188
+ #
189
+ # Use method #[]= to update or create an entry:
190
+ #
191
+ # example_store do |store|
192
+ # store.transaction do
193
+ # store[:foo] = 1 # Update.
194
+ # store[:bam] = 1 # Create.
195
+ # end
196
+ # end
197
+ #
198
+ # Use method #delete to remove an entry:
199
+ #
200
+ # example_store do |store|
201
+ # store.transaction do
202
+ # store.delete(:foo)
203
+ # store[:foo] # => nil
204
+ # end
205
+ # end
206
+ #
207
+ # ### Retrieving Values
208
+ #
209
+ # Use method #fetch (allows default) or #[] (defaults to `nil`) to retrieve an
210
+ # entry:
211
+ #
212
+ # example_store do |store|
213
+ # store.transaction do
214
+ # store[:foo] # => 0
215
+ # store[:nope] # => nil
216
+ # store.fetch(:baz) # => 2
217
+ # store.fetch(:nope, nil) # => nil
218
+ # store.fetch(:nope) # Raises exception.
219
+ # end
220
+ # end
221
+ #
222
+ # ### Querying the Store
223
+ #
224
+ # Use method #key? to determine whether a given key exists:
225
+ #
226
+ # example_store do |store|
227
+ # store.transaction do
228
+ # store.key?(:foo) # => true
229
+ # end
230
+ # end
231
+ #
232
+ # Use method #keys to retrieve keys:
233
+ #
234
+ # example_store do |store|
235
+ # store.transaction do
236
+ # store.keys # => [:foo, :bar, :baz]
237
+ # end
238
+ # end
239
+ #
240
+ # Use method #path to retrieve the path to the store's underlying file; this
241
+ # method may be called from outside a transaction block:
242
+ #
243
+ # store = PStore.new('t.store')
244
+ # store.path # => "t.store"
245
+ #
246
+ # ## Transaction Safety
247
+ #
248
+ # For transaction safety, see:
249
+ #
250
+ # * Optional argument `thread_safe` at method PStore.new.
251
+ # * Attribute #ultra_safe.
252
+ #
253
+ #
254
+ # Needless to say, if you're storing valuable data with PStore, then you should
255
+ # backup the PStore file from time to time.
256
+ #
257
+ # ## An Example Store
16
258
  #
17
259
  # require "pstore"
18
260
  #
19
- # # a mock wiki object...
261
+ # # A mock wiki object.
20
262
  # class WikiPage
21
- # def initialize( page_name, author, contents )
263
+ #
264
+ # attr_reader :page_name
265
+ #
266
+ # def initialize(page_name, author, contents)
22
267
  # @page_name = page_name
23
268
  # @revisions = Array.new
24
- #
25
269
  # add_revision(author, contents)
26
270
  # end
27
271
  #
28
- # attr_reader :page_name
29
- #
30
- # def add_revision( author, contents )
31
- # @revisions << { :created => Time.now,
32
- # :author => author,
33
- # :contents => contents }
272
+ # def add_revision(author, contents)
273
+ # @revisions << {created: Time.now,
274
+ # author: author,
275
+ # contents: contents}
34
276
  # end
35
277
  #
36
278
  # def wiki_page_references
37
279
  # [@page_name] + @revisions.last[:contents].scan(/\b(?:[A-Z]+[a-z]+){2,}/)
38
280
  # end
39
281
  #
40
- # # ...
41
282
  # end
42
283
  #
43
- # # create a new page...
44
- # home_page = WikiPage.new( "HomePage", "James Edward Gray II",
45
- # "A page about the JoysOfDocumentation..." )
284
+ # # Create a new wiki page.
285
+ # home_page = WikiPage.new("HomePage", "James Edward Gray II",
286
+ # "A page about the JoysOfDocumentation..." )
46
287
  #
47
- # # then we want to update page data and the index together, or not at all...
48
288
  # wiki = PStore.new("wiki_pages.pstore")
49
- # wiki.transaction do # begin transaction; do all of this or none of it
50
- # # store page...
289
+ # # Update page data and the index together, or not at all.
290
+ # wiki.transaction do
291
+ # # Store page.
51
292
  # wiki[home_page.page_name] = home_page
52
- # # ensure that an index has been created...
293
+ # # Create page index.
53
294
  # wiki[:wiki_index] ||= Array.new
54
- # # update wiki index...
295
+ # # Update wiki index.
55
296
  # wiki[:wiki_index].push(*home_page.wiki_page_references)
56
- # end # commit changes to wiki data store file
57
- #
58
- # ### Some time later... ###
297
+ # end
59
298
  #
60
- # # read wiki data...
61
- # wiki.transaction(true) do # begin read-only transaction, no changes allowed
62
- # wiki.roots.each do |data_root_name|
63
- # p data_root_name
64
- # p wiki[data_root_name]
299
+ # # Read wiki data, setting argument read_only to true.
300
+ # wiki.transaction(true) do
301
+ # wiki.keys.each do |key|
302
+ # puts key
303
+ # puts wiki[key]
65
304
  # end
66
305
  # end
67
306
  #
68
- # ## Transaction modes
69
- #
70
- # By default, file integrity is only ensured as long as the operating system
71
- # (and the underlying hardware) doesn't raise any unexpected I/O errors. If an
72
- # I/O error occurs while PStore is writing to its file, then the file will
73
- # become corrupted.
74
- #
75
- # You can prevent this by setting *pstore.ultra_safe = true*. However, this
76
- # results in a minor performance loss, and only works on platforms that support
77
- # atomic file renames. Please consult the documentation for `ultra_safe` for
78
- # details.
79
- #
80
- # Needless to say, if you're storing valuable data with PStore, then you should
81
- # backup the PStore files from time to time.
82
- #
83
307
  class PStore
84
308
  public
85
309
 
86
310
  # <!--
87
311
  # rdoc-file=lib/pstore.rb
88
- # - [](name)
312
+ # - [](key)
89
313
  # -->
90
- # Retrieves a value from the PStore file data, by *name*. The hierarchy of Ruby
91
- # objects stored under that root *name* will be returned.
314
+ # Returns the value for the given `key` if the key exists. `nil` otherwise; if
315
+ # not `nil`, the returned value is an object or a hierarchy of objects:
316
+ #
317
+ # example_store do |store|
318
+ # store.transaction do
319
+ # store[:foo] # => 0
320
+ # store[:nope] # => nil
321
+ # end
322
+ # end
323
+ #
324
+ # Returns `nil` if there is no such key.
92
325
  #
93
- # **WARNING**: This method is only valid in a PStore#transaction. It will
94
- # raise PStore::Error if called at any other time.
326
+ # See also [Hierarchical Values](rdoc-ref:PStore@Hierarchical+Values).
327
+ #
328
+ # Raises an exception if called outside a transaction block.
95
329
  #
96
330
  def []: (untyped name) -> untyped
97
331
 
98
332
  # <!--
99
333
  # rdoc-file=lib/pstore.rb
100
- # - []=(name, value)
334
+ # - []=(key, value)
101
335
  # -->
102
- # Stores an individual Ruby object or a hierarchy of Ruby objects in the data
103
- # store file under the root *name*. Assigning to a *name* already in the data
104
- # store clobbers the old data.
105
- #
106
- # ## Example:
336
+ # Creates or replaces the value for the given `key`:
107
337
  #
108
- # require "pstore"
338
+ # example_store do |store|
339
+ # temp.transaction do
340
+ # temp[:bat] = 3
341
+ # end
342
+ # end
109
343
  #
110
- # store = PStore.new("data_file.pstore")
111
- # store.transaction do # begin transaction
112
- # # load some data into the store...
113
- # store[:single_object] = "My data..."
114
- # store[:obj_hierarchy] = { "Kev Jackson" => ["rational.rb", "pstore.rb"],
115
- # "James Gray" => ["erb.rb", "pstore.rb"] }
116
- # end # commit changes to data store file
344
+ # See also [Hierarchical Values](rdoc-ref:PStore@Hierarchical+Values).
117
345
  #
118
- # **WARNING**: This method is only valid in a PStore#transaction and it cannot
119
- # be read-only. It will raise PStore::Error if called at any other time.
346
+ # Raises an exception if called outside a transaction block.
120
347
  #
121
348
  def []=: (untyped name, untyped value) -> untyped
122
349
 
@@ -124,24 +351,11 @@ class PStore
124
351
  # rdoc-file=lib/pstore.rb
125
352
  # - abort()
126
353
  # -->
127
- # Ends the current PStore#transaction, discarding any changes to the data store.
128
- #
129
- # ## Example:
130
- #
131
- # require "pstore"
132
- #
133
- # store = PStore.new("data_file.pstore")
134
- # store.transaction do # begin transaction
135
- # store[:one] = 1 # this change is not applied, see below...
136
- # store[:two] = 2 # this change is not applied, see below...
354
+ # Exits the current transaction block, discarding any changes specified in the
355
+ # transaction block. See [Committing or
356
+ # Aborting](rdoc-ref:PStore@Committing+or+Aborting).
137
357
  #
138
- # store.abort # end transaction here, discard all changes
139
- #
140
- # store[:three] = 3 # this change is never reached
141
- # end
142
- #
143
- # **WARNING**: This method is only valid in a PStore#transaction. It will
144
- # raise PStore::Error if called at any other time.
358
+ # Raises an exception if called outside a transaction block.
145
359
  #
146
360
  def abort: () -> untyped
147
361
 
@@ -149,51 +363,52 @@ class PStore
149
363
  # rdoc-file=lib/pstore.rb
150
364
  # - commit()
151
365
  # -->
152
- # Ends the current PStore#transaction, committing any changes to the data store
153
- # immediately.
154
- #
155
- # ## Example:
366
+ # Exits the current transaction block, committing any changes specified in the
367
+ # transaction block. See [Committing or
368
+ # Aborting](rdoc-ref:PStore@Committing+or+Aborting).
156
369
  #
157
- # require "pstore"
158
- #
159
- # store = PStore.new("data_file.pstore")
160
- # store.transaction do # begin transaction
161
- # # load some data into the store...
162
- # store[:one] = 1
163
- # store[:two] = 2
164
- #
165
- # store.commit # end transaction here, committing changes
166
- #
167
- # store[:three] = 3 # this change is never reached
168
- # end
169
- #
170
- # **WARNING**: This method is only valid in a PStore#transaction. It will
171
- # raise PStore::Error if called at any other time.
370
+ # Raises an exception if called outside a transaction block.
172
371
  #
173
372
  def commit: () -> nil
174
373
 
175
374
  # <!--
176
375
  # rdoc-file=lib/pstore.rb
177
- # - delete(name)
376
+ # - delete(key)
178
377
  # -->
179
- # Removes an object hierarchy from the data store, by *name*.
378
+ # Removes and returns the value at `key` if it exists:
379
+ #
380
+ # example_store do |store|
381
+ # store.transaction do
382
+ # store[:bat] = 3
383
+ # store.delete(:bat)
384
+ # end
385
+ # end
386
+ #
387
+ # Returns `nil` if there is no such key.
180
388
  #
181
- # **WARNING**: This method is only valid in a PStore#transaction and it cannot
182
- # be read-only. It will raise PStore::Error if called at any other time.
389
+ # Raises an exception if called outside a transaction block.
183
390
  #
184
391
  def delete: (untyped name) -> untyped
185
392
 
186
393
  # <!--
187
394
  # rdoc-file=lib/pstore.rb
188
- # - fetch(name, default=PStore::Error)
395
+ # - fetch(key, default=PStore::Error)
189
396
  # -->
190
- # This method is just like PStore#[], save that you may also provide a *default*
191
- # value for the object. In the event the specified *name* is not found in the
192
- # data store, your *default* will be returned instead. If you do not specify a
193
- # default, PStore::Error will be raised if the object is not found.
397
+ # Like #[], except that it accepts a default value for the store. If the `key`
398
+ # does not exist:
194
399
  #
195
- # **WARNING**: This method is only valid in a PStore#transaction. It will
196
- # raise PStore::Error if called at any other time.
400
+ # * Raises an exception if `default` is `PStore::Error`.
401
+ # * Returns the value of `default` otherwise:
402
+ #
403
+ # example_store do |store|
404
+ # store.transaction do
405
+ # store.fetch(:nope, nil) # => nil
406
+ # store.fetch(:nope) # Raises an exception.
407
+ # end
408
+ # end
409
+ #
410
+ #
411
+ # Raises an exception if called outside a transaction block.
197
412
  #
198
413
  def fetch: (untyped name, ?untyped default) -> untyped
199
414
 
@@ -201,18 +416,16 @@ class PStore
201
416
  # rdoc-file=lib/pstore.rb
202
417
  # - path()
203
418
  # -->
204
- # Returns the path to the data store file.
419
+ # Returns the string file path used to create the store:
420
+ #
421
+ # store.path # => "flat.store"
205
422
  #
206
423
  def path: () -> untyped
207
424
 
208
425
  # <!--
209
426
  # rdoc-file=lib/pstore.rb
210
- # - root?(name)
427
+ # - root?(key)
211
428
  # -->
212
- # Returns true if the supplied *name* is currently in the data store.
213
- #
214
- # **WARNING**: This method is only valid in a PStore#transaction. It will
215
- # raise PStore::Error if called at any other time.
216
429
  #
217
430
  def root?: (untyped name) -> bool
218
431
 
@@ -220,10 +433,6 @@ class PStore
220
433
  # rdoc-file=lib/pstore.rb
221
434
  # - roots()
222
435
  # -->
223
- # Returns the names of all object hierarchies currently in the store.
224
- #
225
- # **WARNING**: This method is only valid in a PStore#transaction. It will
226
- # raise PStore::Error if called at any other time.
227
436
  #
228
437
  def roots: () -> Array[untyped]
229
438
 
@@ -231,44 +440,50 @@ class PStore
231
440
  # rdoc-file=lib/pstore.rb
232
441
  # - transaction(read_only = false) { |pstore| ... }
233
442
  # -->
234
- # Opens a new transaction for the data store. Code executed inside a block
235
- # passed to this method may read and write data to and from the data store file.
443
+ # Opens a transaction block for the store. See
444
+ # [Transactions](rdoc-ref:PStore@Transactions).
236
445
  #
237
- # At the end of the block, changes are committed to the data store
238
- # automatically. You may exit the transaction early with a call to either
239
- # PStore#commit or PStore#abort. See those methods for details about how
240
- # changes are handled. Raising an uncaught Exception in the block is equivalent
241
- # to calling PStore#abort.
446
+ # With argument `read_only` as `false`, the block may both read from and write
447
+ # to the store.
242
448
  #
243
- # If *read_only* is set to `true`, you will only be allowed to read from the
244
- # data store during the transaction and any attempts to change the data will
245
- # raise a PStore::Error.
449
+ # With argument `read_only` as `true`, the block may not include calls to
450
+ # #transaction, #[]=, or #delete.
246
451
  #
247
- # Note that PStore does not support nested transactions.
452
+ # Raises an exception if called within a transaction block.
248
453
  #
249
454
  def transaction: (?untyped read_only) -> untyped
250
455
 
251
456
  # <!-- rdoc-file=lib/pstore.rb -->
252
- # Whether PStore should do its best to prevent file corruptions, even when under
253
- # unlikely-to-occur error conditions such as out-of-space conditions and other
254
- # unusual OS filesystem errors. Setting this flag comes at the price in the form
255
- # of a performance loss.
457
+ # Whether PStore should do its best to prevent file corruptions, even when an
458
+ # unlikely error (such as memory-error or filesystem error) occurs:
256
459
  #
257
- # This flag only has effect on platforms on which file renames are atomic (e.g.
258
- # all POSIX platforms: Linux, MacOS X, FreeBSD, etc). The default value is
259
- # false.
460
+ # * `true`: changes are posted by creating a temporary file, writing the
461
+ # updated data to it, then renaming the file to the given #path. File
462
+ # integrity is maintained. Note: has effect only if the filesystem has
463
+ # atomic file rename (as do POSIX platforms Linux, MacOS, FreeBSD and
464
+ # others).
465
+ #
466
+ # * `false` (the default): changes are posted by rewinding the open file and
467
+ # writing the updated data. File integrity is maintained if the filesystem
468
+ # raises no unexpected I/O error; if such an error occurs during a write to
469
+ # the store, the file may become corrupted.
260
470
  #
261
471
  def ultra_safe: () -> untyped
262
472
 
263
473
  # <!-- rdoc-file=lib/pstore.rb -->
264
- # Whether PStore should do its best to prevent file corruptions, even when under
265
- # unlikely-to-occur error conditions such as out-of-space conditions and other
266
- # unusual OS filesystem errors. Setting this flag comes at the price in the form
267
- # of a performance loss.
474
+ # Whether PStore should do its best to prevent file corruptions, even when an
475
+ # unlikely error (such as memory-error or filesystem error) occurs:
476
+ #
477
+ # * `true`: changes are posted by creating a temporary file, writing the
478
+ # updated data to it, then renaming the file to the given #path. File
479
+ # integrity is maintained. Note: has effect only if the filesystem has
480
+ # atomic file rename (as do POSIX platforms Linux, MacOS, FreeBSD and
481
+ # others).
268
482
  #
269
- # This flag only has effect on platforms on which file renames are atomic (e.g.
270
- # all POSIX platforms: Linux, MacOS X, FreeBSD, etc). The default value is
271
- # false.
483
+ # * `false` (the default): changes are posted by rewinding the open file and
484
+ # writing the updated data. File integrity is maintained if the filesystem
485
+ # raises no unexpected I/O error; if such an error occurs during a write to
486
+ # the store, the file may become corrupted.
272
487
  #
273
488
  def ultra_safe=: (untyped) -> untyped
274
489
 
@@ -311,11 +526,20 @@ class PStore
311
526
  # rdoc-file=lib/pstore.rb
312
527
  # - new(file, thread_safe = false)
313
528
  # -->
314
- # To construct a PStore object, pass in the *file* path where you would like the
315
- # data to be stored.
529
+ # Returns a new PStore object.
530
+ #
531
+ # Argument `file` is the path to the file in which objects are to be stored; if
532
+ # the file exists, it should be one that was written by PStore.
533
+ #
534
+ # path = 't.store'
535
+ # store = PStore.new(path)
536
+ #
537
+ # A PStore object is
538
+ # [reentrant](https://en.wikipedia.org/wiki/Reentrancy_(computing)). If argument
539
+ # `thread_safe` is given as `true`, the object is also thread-safe (at the cost
540
+ # of a small performance penalty):
316
541
  #
317
- # PStore objects are always reentrant. But if *thread_safe* is set to true, then
318
- # it will become thread-safe at the cost of a minor performance hit.
542
+ # store = PStore.new(path, true)
319
543
  #
320
544
  def initialize: (untyped file, ?boolish thread_safe) -> untyped
321
545