xlsxrb 0.1.8 → 0.1.9

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.
@@ -27,6 +27,15 @@ module Xlsxrb
27
27
  class ZipError < Error
28
28
  end
29
29
 
30
+ class EncryptedFileError < Error
31
+ end
32
+
33
+ class InvalidPasswordError < EncryptedFileError
34
+ end
35
+
36
+ class DecryptionError < EncryptedFileError
37
+ end
38
+
30
39
  TRACER: untyped
31
40
 
32
41
  def self.in_span: (untyped name, ?attributes: untyped) ?{ (?) -> untyped } -> untyped
@@ -290,34 +299,38 @@ module Xlsxrb
290
299
  # puts doc_sheet["A1"].value # coordinate random access
291
300
  #
292
301
  # @param source [String, IO] File path, binary content string (starting with PK..), or IO object.
302
+ # @param password [String, nil] Optional password to decrypt password-protected XLSX files.
293
303
  # @yield [sheet] Yields each streaming sheet.
294
304
  # @yieldparam sheet [StreamSheet] The streaming worksheet object.
295
305
  # @return [Elements::Workbook, void] Returns Elements::Workbook when no block is given.
296
306
  # @api public
297
- # : (String | IO source) { (StreamSheet) -> void } -> void
298
- # : (String | IO source) -> Elements::Workbook
299
- def self.read: (String | IO source) { (StreamSheet) -> void } -> void
300
- | (String | IO source) -> Elements::Workbook
307
+ # : (untyped source, ?password: String?) { (StreamSheet) -> void } -> void
308
+ # : (untyped source, ?password: String?) -> Elements::Workbook
309
+ def self.read: (untyped source, ?password: String?) { (StreamSheet) -> void } -> void
310
+ | (untyped source, ?password: String?) -> Elements::Workbook
301
311
 
302
312
  # Writes an XLSX file or IO stream (streaming or in-memory), or returns a binary string.
303
313
  #
304
- # @overload write(target, strict_excel_mode: true, &block)
314
+ # @overload write(target, password: nil, strict_excel_mode: true, &block)
305
315
  # Streaming write: yields a StreamWriter context for high-speed, zero-allocation XLSX generation.
306
316
  # @param target [String, IO] Destination file path or writable IO object.
317
+ # @param password [String, nil] Optional password to encrypt the generated XLSX file.
307
318
  # @param strict_excel_mode [Boolean] Whether to enforce Excel specifications.
308
319
  # @yield [stream_writer]
309
320
  # @yieldparam stream_writer [Xlsxrb::StreamWriter]
310
321
  # @return [void]
311
322
  #
312
- # @overload write(workbook)
323
+ # @overload write(workbook, password: nil)
313
324
  # In-memory write: exports the workbook to an in-memory binary String.
314
325
  # @param workbook [Elements::Workbook] The workbook to write.
326
+ # @param password [String, nil] Optional password to encrypt the binary string.
315
327
  # @return [String] Binary data representing the XLSX file.
316
328
  #
317
- # @overload write(target, workbook)
329
+ # @overload write(target, workbook, password: nil)
318
330
  # In-memory write: writes the workbook to a file path or IO stream.
319
331
  # @param target [String, IO] Destination file path or writable IO object.
320
332
  # @param workbook [Elements::Workbook] The workbook to write.
333
+ # @param password [String, nil] Optional password to encrypt the output file.
321
334
  # @return [void]
322
335
  #
323
336
  # @example Streaming write to file
@@ -325,6 +338,11 @@ module Xlsxrb
325
338
  # writer.sheet("Sheet1") { |s| s.row(["Hello", "World"]) }
326
339
  # end
327
340
  #
341
+ # @example Password-protected streaming write
342
+ # Xlsxrb.write("protected.xlsx", password: "secret_password") do |writer|
343
+ # writer.sheet("Confidential") { |s| s.row(["Private Data", 100]) }
344
+ # end
345
+ #
328
346
  # @example In-memory export to binary string
329
347
  # binary_data = Xlsxrb.write(workbook)
330
348
  #
@@ -332,12 +350,12 @@ module Xlsxrb
332
350
  # Xlsxrb.write("output.xlsx", workbook)
333
351
  #
334
352
  # @api public
335
- # : (Elements::Workbook workbook) -> String
336
- # : (String | IO target, Elements::Workbook workbook) -> void
337
- # : (String | IO target, ?strict_excel_mode: bool) ?{ (StreamWriter) -> void } -> void
338
- def self.write: (Elements::Workbook workbook) -> String
339
- | (String | IO target, Elements::Workbook workbook) -> void
340
- | (String | IO target, ?strict_excel_mode: bool) ?{ (StreamWriter) -> void } -> void
353
+ # : (Elements::Workbook workbook, ?password: String?, ?encryption_mode: Symbol) -> String
354
+ # : (untyped target, Elements::Workbook | untyped workbook, ?password: String?, ?encryption_mode: Symbol) -> void
355
+ # : (untyped target_or_workbook, ?Elements::Workbook | untyped workbook_or_nil, ?password: String?, ?encryption_mode: Symbol, ?strict_excel_mode: bool) ?{ (StreamWriter) -> void } -> untyped
356
+ def self.write: (Elements::Workbook workbook, ?password: String?, ?encryption_mode: Symbol) -> String
357
+ | (untyped target, Elements::Workbook | untyped workbook, ?password: String?, ?encryption_mode: Symbol) -> void
358
+ | (untyped target_or_workbook, ?Elements::Workbook | untyped workbook_or_nil, ?password: String?, ?encryption_mode: Symbol, ?strict_excel_mode: bool) ?{ (StreamWriter) -> void } -> untyped
341
359
 
342
360
  # Modifies an existing XLSX file.
343
361
  # Reads the workbook, passes it to the block, and writes the result.
@@ -354,13 +372,14 @@ module Xlsxrb
354
372
  #
355
373
  # @param source [String, IO] The source file path or IO object.
356
374
  # @param target [String, IO, nil] The target file path or IO object. If nil, overwrites source.
375
+ # @param password [String, nil] Optional password for reading and writing protected files.
357
376
  # @yield [workbook] Yields the parsed workbook.
358
377
  # @yieldparam workbook [Elements::Workbook] The parsed workbook.
359
378
  # @yieldreturn [Elements::Workbook] The modified workbook.
360
379
  # @return [void]
361
380
  # @api public
362
- # : (untyped source, ?untyped target) ?{ (Elements::Workbook) -> untyped } -> void
363
- def self.modify: (untyped source, ?untyped target) ?{ (Elements::Workbook) -> untyped } -> void
381
+ # : (untyped source, ?untyped target, ?password: String?) ?{ (Elements::Workbook) -> untyped } -> void
382
+ def self.modify: (untyped source, ?untyped target, ?password: String?) ?{ (Elements::Workbook) -> untyped } -> void
364
383
 
365
384
  # Represents a sheet being streamed sequentially from an XLSX file.
366
385
  # Provides O(1) constant-memory streaming over rows and cells.
@@ -401,8 +420,9 @@ module Xlsxrb
401
420
  # @return [Enumerator, void]
402
421
  # @api public
403
422
  # : () { (StreamRow | Elements::Row) -> void } -> void
404
- # : | () -> Enumerator[StreamRow | Elements::Row, void]
423
+ # : () -> Enumerator[StreamRow | Elements::Row, void]
405
424
  def each_row: () { (StreamRow | Elements::Row) -> void } -> void
425
+ | () -> Enumerator[StreamRow | Elements::Row, void]
406
426
 
407
427
  # Iterate over all cells across rows continuously (O(1) memory).
408
428
  #
@@ -411,8 +431,9 @@ module Xlsxrb
411
431
  # @return [Enumerator, void]
412
432
  # @api public
413
433
  # : () { (Elements::Cell) -> void } -> void
414
- # : | () -> Enumerator[Elements::Cell, void]
434
+ # : () -> Enumerator[Elements::Cell, void]
415
435
  def each_cell: () { (Elements::Cell) -> void } -> void
436
+ | () -> Enumerator[Elements::Cell, void]
416
437
 
417
438
  # Default Enumerable iteration iterates rows in the streaming sheet.
418
439
  #
@@ -421,8 +442,9 @@ module Xlsxrb
421
442
  # @return [Enumerator, void]
422
443
  # @api public
423
444
  # : () { (StreamRow | Elements::Row) -> void } -> void
424
- # : | () -> Enumerator[StreamRow | Elements::Row, void]
445
+ # : () -> Enumerator[StreamRow | Elements::Row, void]
425
446
  def each: () { (StreamRow | Elements::Row) -> void } -> void
447
+ | () -> Enumerator[StreamRow | Elements::Row, void]
426
448
 
427
449
  # Loads this sheet completely into an in-memory Elements::Worksheet,
428
450
  # enabling coordinate random access (sheet["A1"]), row lookups (row_at),
@@ -46,13 +46,15 @@ async Task<ScenarioExecResult> RunScenario(string code, string xlsxPath)
46
46
  typeof(Enumerable).Assembly,
47
47
  typeof(Console).Assembly,
48
48
  typeof(SpreadsheetDocument).Assembly,
49
- typeof(OpenXmlValidator).Assembly
49
+ typeof(OpenXmlValidator).Assembly,
50
+ typeof(System.Security.Cryptography.Aes).Assembly
50
51
  )
51
52
  .AddImports(
52
53
  "System",
53
54
  "System.IO",
54
55
  "System.Linq",
55
56
  "System.Collections.Generic",
57
+ "System.Security.Cryptography",
56
58
  "DocumentFormat.OpenXml",
57
59
  "DocumentFormat.OpenXml.Packaging",
58
60
  "DocumentFormat.OpenXml.Spreadsheet",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xlsxrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - niku
@@ -190,6 +190,10 @@ files:
190
190
  - lib/xlsxrb/elements/workbook.rb
191
191
  - lib/xlsxrb/elements/worksheet.rb
192
192
  - lib/xlsxrb/ooxml.rb
193
+ - lib/xlsxrb/ooxml/cfb.rb
194
+ - lib/xlsxrb/ooxml/crypto.rb
195
+ - lib/xlsxrb/ooxml/crypto/agile.rb
196
+ - lib/xlsxrb/ooxml/crypto/standard.rb
193
197
  - lib/xlsxrb/ooxml/reader.rb
194
198
  - lib/xlsxrb/ooxml/shared_strings_parser.rb
195
199
  - lib/xlsxrb/ooxml/styles_parser.rb
@@ -219,6 +223,10 @@ files:
219
223
  - sig/generated/xlsxrb/elements/workbook.rbs
220
224
  - sig/generated/xlsxrb/elements/worksheet.rbs
221
225
  - sig/generated/xlsxrb/ooxml.rbs
226
+ - sig/generated/xlsxrb/ooxml/cfb.rbs
227
+ - sig/generated/xlsxrb/ooxml/crypto.rbs
228
+ - sig/generated/xlsxrb/ooxml/crypto/agile.rbs
229
+ - sig/generated/xlsxrb/ooxml/crypto/standard.rbs
222
230
  - sig/generated/xlsxrb/ooxml/reader.rbs
223
231
  - sig/generated/xlsxrb/ooxml/shared_strings_parser.rbs
224
232
  - sig/generated/xlsxrb/ooxml/styles_parser.rbs