file_writer 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7b5007d923c6efea42dcf1bcd1baa5ec8025c5df79f1e91b8bbf1b8414c50342
4
- data.tar.gz: 34ad34c8575345920f18c3c797cf96cfe0a4e3d912166307bc4af87e09d09e1e
3
+ metadata.gz: 50aeafa6cca7a75defbdc12934fd5e453d30dc3cdc6e53fa0484efab3045a6be
4
+ data.tar.gz: 4956aa84d50d48bd3bf71bb982e0509cfbec74126003e8c3db278b0029179834
5
5
  SHA512:
6
- metadata.gz: f7d549bf34857b17560480b9f8be8936fb35ead31af0f80a5ee5c0004633119447972504073290e5419c846206e1180099f7c60d65bedd631a90a0d38412180c
7
- data.tar.gz: a6d50156cfd955084dfb67f2481da2af8255a74885a7e028b6d13987afd9782e0b414e2634008710763a8086e7533aad7d0e195349299aef8944b0a633169848
6
+ metadata.gz: c20d348d7bb7db67efc89b2ecebafe075c99e53cc6209f9105ea58c6b7e824fca9f071c8e67b0146e3f1ce3eadd387748c431e1d02021e06269c4293d75413c9
7
+ data.tar.gz: 944b96bb826fd877c943a5b2d2e623c9ee3c6cab2e5664aa1d782df049597e01c14e77a9f0042a41faaa9ecfa52668eab09d0abb5dbe37653c8035d7f94e976c
data/file_writer.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.13"
24
+ spec.add_development_dependency "bundler", "~> 2.1.4"
25
25
  spec.add_development_dependency "rake", "~> 10.0"
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
27
  end
@@ -1,3 +1,3 @@
1
1
  class FileWriter
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
data/lib/file_writer.rb CHANGED
@@ -15,6 +15,8 @@ class FileWriter
15
15
  @fname = fname
16
16
  end
17
17
 
18
+ SPLIT_SIZE = 65536
19
+
18
20
  # Overwrite the file
19
21
  #
20
22
  # @param String contents The new contents for the file.
@@ -25,19 +27,43 @@ class FileWriter
25
27
  existing = File.exists?(fname)
26
28
 
27
29
  if existing
28
- mode = File.stat(fname).mode
30
+ fmode = File.stat(fname).mode
29
31
  begin
30
32
  File.rename(fname, backup)
31
33
  rescue SystemCallError
32
34
  FileUtils.cp(fname,fname+"~")
33
35
  end
34
36
  else
35
- mode = nil
37
+ fmode = nil
36
38
  end
37
39
 
38
- File.open(fname, "wb+", mode) do |f|
39
- if f.syswrite(contents) != contents.bytesize
40
- raise SystemCallError.new("FileWriter#write: syswrite returned unexpected length")
40
+ File.open(fname, "wb+", fmode) do |f|
41
+ size = contents.bytesize
42
+
43
+ #
44
+ #We do this rather than f.write or f.syswrite as it
45
+ # gives substantially better latency in a threaded
46
+ # environment as of MRI 2.7.2 than a single write,
47
+ # at the cost of throughput
48
+ #
49
+ # See tests/latency.rb for a test case, and try
50
+ # replacing the below with
51
+ #
52
+ # ```
53
+ # written = File.write(contents)
54
+ # ```
55
+ #
56
+ written = 0
57
+ while (size - written) > SPLIT_SIZE
58
+ if (w = f.write(contents[written .. (written+SPLIT_SIZE-1)])) != SPLIT_SIZE
59
+ raise SystemCallError.new("FileWriter#write: write returned unexpected length (#{w.inspect})")
60
+ end
61
+ written += w
62
+ end
63
+ written += f.write(contents[written .. -1])
64
+
65
+ if written != size
66
+ raise SystemCallError.new("FileWriter#write: write returned unexpected length")
41
67
  end
42
68
  f.flush
43
69
  f.fsync
data/tests/latency.rb ADDED
@@ -0,0 +1,33 @@
1
+ #
2
+ # To test latency on writing large chunks of data in one go
3
+ #
4
+
5
+ $: << "../lib"
6
+
7
+ require 'benchmark'
8
+ require 'file_writer'
9
+
10
+ data = " " * (16_777_216*100 + 42)
11
+ t1 = Thread.new do
12
+ loop do
13
+ FileWriter.write("./test", data)
14
+ end
15
+ end
16
+
17
+ accum = []
18
+ t2 = Thread.new do
19
+ loop do
20
+ b = Benchmark.measure do
21
+ 100000.times do
22
+ " "*1024
23
+ end
24
+ end
25
+ accum << b.total
26
+ break if accum.length > 1000
27
+ end
28
+
29
+ p accum.sum / accum.size
30
+ end
31
+
32
+ t1.join
33
+ t2.join
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: file_writer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vidar Hokstad
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-31 00:00:00.000000000 Z
11
+ date: 2022-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.13'
19
+ version: 2.1.4
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.13'
26
+ version: 2.1.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -71,6 +71,7 @@ files:
71
71
  - file_writer.gemspec
72
72
  - lib/file_writer.rb
73
73
  - lib/file_writer/version.rb
74
+ - tests/latency.rb
74
75
  homepage: https://github.com/vidarh/file_writer
75
76
  licenses:
76
77
  - MIT
@@ -90,8 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
91
  - !ruby/object:Gem::Version
91
92
  version: '0'
92
93
  requirements: []
93
- rubyforge_project:
94
- rubygems_version: 2.7.6
94
+ rubygems_version: 3.1.4
95
95
  signing_key:
96
96
  specification_version: 4
97
97
  summary: Overwrite/replace files in a safe way with backups