censive 0.19 → 0.20
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.
- checksums.yaml +4 -4
- data/censive.gemspec +1 -1
- data/diagram/NFA to Regex.pdf +0 -0
- data/diagram/censive@ce9d51d.png +0 -0
- data/diagram/csv-ragel.dot +24 -0
- data/diagram/csv.dot +57 -0
- data/diagram/csv.png +0 -0
- data/diagram/csv.rl +45 -0
- data/diagram/csv.svg +270 -0
- data/diagram/diagram.dot +26 -0
- data/diagram/diagram.rl +50 -0
- data/lib/censive.rb +124 -91
- data/lib/censive.rb-20230208182732 +266 -0
- data/lib/censive.rb-20230208195221 +276 -0
- data/lib/censive.rb-20230209050227 +282 -0
- data/lib/flay.rb +227 -0
- data/lib/test-censive.rb +12 -0
- data/lib/test-csv.rb +12 -0
- metadata +17 -2
data/lib/flay.rb
ADDED
@@ -0,0 +1,227 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# ============================================================================
|
4
|
+
# flay - A quick and lightweight benchmarking tool for Ruby
|
5
|
+
#
|
6
|
+
# Author: Steve Shreeve (steve.shreeve@gmail.com)
|
7
|
+
# Date: Feb 9, 2023
|
8
|
+
# ============================================================================
|
9
|
+
# GOALS:
|
10
|
+
# 1. Provide a simple way to benchmark various code
|
11
|
+
# 2. Easy to configure and start comparing results
|
12
|
+
#
|
13
|
+
# TODO:
|
14
|
+
# 1. Everything
|
15
|
+
# ============================================================================
|
16
|
+
|
17
|
+
class Hash
|
18
|
+
alias_method :default_lookup, :[]
|
19
|
+
|
20
|
+
def [](key, miss=nil)
|
21
|
+
key?(sym = key.to_sym) and return default_lookup(sym) || miss
|
22
|
+
ary = key.to_s.split(/(?:[.\/\[]|\][.\/]?)/)
|
23
|
+
val = ary.inject(self) do |obj, sub|
|
24
|
+
if obj == self then default_lookup(sub.to_sym)
|
25
|
+
elsif obj == nil then break
|
26
|
+
elsif sub =~ /\A-?\d*\z/ then obj[sub.to_i]
|
27
|
+
else obj[sub.to_sym]
|
28
|
+
end
|
29
|
+
end or miss
|
30
|
+
end
|
31
|
+
|
32
|
+
def method_missing(name, *args)
|
33
|
+
name !~ /=$/ ? self[name, *args] : self[$`.to_sym] = args.first
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
config = {
|
38
|
+
environments: [
|
39
|
+
{
|
40
|
+
name: "Environment 1",
|
41
|
+
before: <<~"|",
|
42
|
+
# Environment 1 before
|
43
|
+
|
|
44
|
+
after: <<~"|",
|
45
|
+
# Environment 1 after
|
46
|
+
|
|
47
|
+
},
|
48
|
+
{
|
49
|
+
name: "Environment 2",
|
50
|
+
before: <<~"|",
|
51
|
+
# Environment 1 before
|
52
|
+
|
|
53
|
+
after: <<~"|",
|
54
|
+
# Environment 1 after
|
55
|
+
|
|
56
|
+
},
|
57
|
+
],
|
58
|
+
|
59
|
+
contexts: [
|
60
|
+
{
|
61
|
+
name: "Context 1",
|
62
|
+
before: <<~"|",
|
63
|
+
# context 1 before
|
64
|
+
|
|
65
|
+
script: <<~"|",
|
66
|
+
a = [*1..1e5]
|
67
|
+
a.sum
|
68
|
+
|
|
69
|
+
after: <<~"|",
|
70
|
+
# context 1 after
|
71
|
+
|
|
72
|
+
},
|
73
|
+
{
|
74
|
+
name: "Context 2",
|
75
|
+
before: <<~"|",
|
76
|
+
# context 2 before
|
77
|
+
|
|
78
|
+
after: <<~"|",
|
79
|
+
# context 2 after
|
80
|
+
|
|
81
|
+
},
|
82
|
+
],
|
83
|
+
|
84
|
+
tasks: [
|
85
|
+
{
|
86
|
+
name: "Task 1",
|
87
|
+
runs: 35,
|
88
|
+
before: <<~"|",
|
89
|
+
# Task 1 before
|
90
|
+
|
|
91
|
+
after: <<~"|",
|
92
|
+
# Task 1 after
|
93
|
+
|
|
94
|
+
},
|
95
|
+
{
|
96
|
+
name: "Task 2",
|
97
|
+
secs: 30,
|
98
|
+
before: <<~"|",
|
99
|
+
# Task 2 before
|
100
|
+
|
|
101
|
+
after: <<~"|",
|
102
|
+
# Task 2 after
|
103
|
+
|
|
104
|
+
},
|
105
|
+
],
|
106
|
+
}
|
107
|
+
|
108
|
+
# ==[ Helpers ]==
|
109
|
+
|
110
|
+
def wrapper(object, type=nil)
|
111
|
+
puts case type
|
112
|
+
when :environment then template_for_environment object
|
113
|
+
when :context then template_for_context object
|
114
|
+
when :task then template_for_task object
|
115
|
+
else section object
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def wrap(list, type=nil, **opts)
|
120
|
+
list.each do |item|
|
121
|
+
wrapper(item, type)
|
122
|
+
yield item
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def section(text, wide=78, left=0)
|
127
|
+
[
|
128
|
+
"# ".ljust(wide, "="),
|
129
|
+
"# #{text}",
|
130
|
+
"# ".ljust(wide, "="),
|
131
|
+
].join("\n")
|
132
|
+
end
|
133
|
+
|
134
|
+
def hr(text, wide=78, left=0)
|
135
|
+
[ " " * left, "# ==[ ", text, " ]" ].join.ljust(wide, "=")
|
136
|
+
end
|
137
|
+
|
138
|
+
# ==[ Templates ]==
|
139
|
+
|
140
|
+
def template_for_environment(environment)
|
141
|
+
<<~"|"
|
142
|
+
#{ section "Environment: #{environment.name} " }
|
143
|
+
|
144
|
+
# ==[ Code before environment ]==
|
145
|
+
|
146
|
+
#{ environment.before }
|
147
|
+
|
|
148
|
+
end
|
149
|
+
|
150
|
+
def template_for_context(context)
|
151
|
+
<<~"|"
|
152
|
+
#{ section "Context: #{context.name} " }
|
153
|
+
|
154
|
+
# ==[ Code before context ]==
|
155
|
+
|
156
|
+
#{ context.before }
|
157
|
+
|
|
158
|
+
end
|
159
|
+
|
160
|
+
def template_for_task(task)
|
161
|
+
<<~"|"
|
162
|
+
#{ section "Task: #{task.name} " }
|
163
|
+
|
164
|
+
# ==[ Code before task ]==
|
165
|
+
|
166
|
+
#{ task.before }
|
167
|
+
|
168
|
+
# ==[ Calculate the duration of a loop of empty runs ]==
|
169
|
+
|
170
|
+
if #{ task.runs } == 1
|
171
|
+
__flay_before_empty = 0
|
172
|
+
__flay_after_empty = 0
|
173
|
+
else
|
174
|
+
__flay_before_empty = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
175
|
+
__flay_runs = 0
|
176
|
+
while __flay_runs < #{ task.runs } # this empty loop improves accuracy
|
177
|
+
__flay_runs += 1
|
178
|
+
end
|
179
|
+
__flay_after_empty = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
180
|
+
end
|
181
|
+
|
182
|
+
# ==[ Calculate the duration of a loop of script runs ]==
|
183
|
+
|
184
|
+
if #{ task.runs } == 1
|
185
|
+
__flay_before_script = 0
|
186
|
+
__flay_after_script = 0
|
187
|
+
else
|
188
|
+
__flay_before_script = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
189
|
+
__flay_runs = 0
|
190
|
+
while __flay_runs < #{ task.runs }
|
191
|
+
|
192
|
+
# ==[ Before script ]==
|
193
|
+
|
194
|
+
#{ task.script }
|
195
|
+
|
196
|
+
# ==[ After script ]==
|
197
|
+
|
198
|
+
__flay_runs += 1
|
199
|
+
end
|
200
|
+
__flay_after_script = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
201
|
+
end
|
202
|
+
|
203
|
+
# ==[ Code after task ]==
|
204
|
+
|
205
|
+
#{ task.after }
|
206
|
+
|
207
|
+
# ==[ Write out timestamps ]==
|
208
|
+
|
209
|
+
__flay_duration = (__flay_after_script - __flay_before_script) -
|
210
|
+
(__flay_after_empty - __flay_before_empty )
|
211
|
+
|
212
|
+
File.write("/dev/null", __flay_duration.inspect)
|
213
|
+
|
|
214
|
+
end
|
215
|
+
|
216
|
+
# ==[ Workflow ]==
|
217
|
+
|
218
|
+
environments = config.environments
|
219
|
+
contexts = config.contexts
|
220
|
+
tasks = config.tasks
|
221
|
+
|
222
|
+
wrap(environments, :environment) do |environment|
|
223
|
+
wrap(tasks, :task) do |task|
|
224
|
+
wrap(contexts, :context) do |context|
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
data/lib/test-censive.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "./censive"
|
4
|
+
require "digest/md5"
|
5
|
+
|
6
|
+
path = ARGV[0] || "KEN_ALL.CSV"
|
7
|
+
mode = path =~ /^ken/i ? "r:cp932" : "r"
|
8
|
+
|
9
|
+
data = File.open(path, mode).read
|
10
|
+
rows = Censive.parse(data)
|
11
|
+
|
12
|
+
puts "%s %s (%d size)" % [Digest::MD5.hexdigest(rows.join), path, File.stat(path).size], ""
|
data/lib/test-csv.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "csv"
|
4
|
+
require "digest/md5"
|
5
|
+
|
6
|
+
path = ARGV[0] || "KEN_ALL.CSV"
|
7
|
+
mode = path =~ /^ken/i ? "r:cp932" : "r"
|
8
|
+
|
9
|
+
data = File.open(path, mode).read
|
10
|
+
rows = CSV.parse(data)
|
11
|
+
|
12
|
+
puts "%s %s (%d size)" % [Digest::MD5.hexdigest(rows.join), path, File.stat(path).size], ""
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: censive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.20'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Shreeve
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-02-
|
11
|
+
date: 2023-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A quick and lightweight CSV handling library for Ruby
|
14
14
|
email: steve.shreeve@gmail.com
|
@@ -19,7 +19,22 @@ files:
|
|
19
19
|
- LICENSE
|
20
20
|
- README.md
|
21
21
|
- censive.gemspec
|
22
|
+
- diagram/NFA to Regex.pdf
|
23
|
+
- diagram/censive@ce9d51d.png
|
24
|
+
- diagram/csv-ragel.dot
|
25
|
+
- diagram/csv.dot
|
26
|
+
- diagram/csv.png
|
27
|
+
- diagram/csv.rl
|
28
|
+
- diagram/csv.svg
|
29
|
+
- diagram/diagram.dot
|
30
|
+
- diagram/diagram.rl
|
22
31
|
- lib/censive.rb
|
32
|
+
- lib/censive.rb-20230208182732
|
33
|
+
- lib/censive.rb-20230208195221
|
34
|
+
- lib/censive.rb-20230209050227
|
35
|
+
- lib/flay.rb
|
36
|
+
- lib/test-censive.rb
|
37
|
+
- lib/test-csv.rb
|
23
38
|
- test/a-uses-tabs-and-single-quotes-and-no-trailing-newline.tsv
|
24
39
|
homepage: https://github.com/shreeve/censive
|
25
40
|
licenses:
|