-
Notifications
You must be signed in to change notification settings - Fork 0
/
Rakefile
140 lines (109 loc) · 2.55 KB
/
Rakefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# encoding: UTF-8
# frozen_string_literal: true
require 'bundler/gem_tasks'
require 'benchmark'
require 'rake/clean'
require 'rake/testtask'
require 'yard'
require 'attr_bool/version'
CLEAN.exclude('{.git,stock}/**/*')
CLOBBER.include('doc/')
task default: [:test]
desc 'Generate doc'
task :doc,%i[] => %i[yard] do |task|
# pass
end
desc 'Generate doc for tests too'
task :doc_test do |task|
ENV['doctest'] = 'y'
doc_task = Rake::Task[:doc]
doc_task.reenable
doc_task.invoke
end
Rake::TestTask.new do |task|
task.deps << :doc_test
task.libs = ['lib','test']
task.pattern = File.join('test','**','*_test.rb')
task.description += ": '#{task.pattern}'"
task.verbose = false
task.warning = true
end
YARD::Rake::YardocTask.new do |task|
task.files = [File.join('lib','**','*.{rb}')]
#task.options += ['--template-path',File.join('yard','templates')]
task.options += ['--title',"AttrBool v#{AttrBool::VERSION} doc"]
task.before = proc do
task.files << File.join('test','**','*.{rb}') if ENV['doctest'].to_s.casecmp?('y')
end
end
desc 'Benchmark define_method vs module_eval and ?: vs bangbang'
task :benchmark do |task|
# rubocop:disable all
N0 = 100_000
N1 = 20_000_000
module ModuleExt
def do_class_eval(name)
0.upto(N0) do |i|
n = "#{name}#{i}"
class_eval("def #{n}?(); @#{n}; end")
end
end
def do_define_method(name)
0.upto(N0) do |i|
n = "#{name}#{i}"
define_method(:"#{n}?") do
instance_variable_get(:"@#{n}")
end
end
end
def do_module_eval(name)
0.upto(N0) do |i|
n = "#{name}#{i}"
module_eval("def #{n}?(); @#{n}; end")
end
end
end
Module.prepend ModuleExt
puts
Benchmark.bmbm do |bm|
bm.report('class_eval ') do
class ClassEvalTest
do_class_eval :ce
end
end
bm.report('define_method') do
class DefineMethodTest
do_define_method :dm
end
end
bm.report('module_eval ') do
class ModuleEvalTest
do_module_eval :me
end
end
end
str = 'str' # Warning workaround
puts
Benchmark.bmbm do |bm|
bm.report('?:') do
0.upto(N1) do |i|
x = str ? true : false
x = nil ? true : false
x = true ? true : false
x = false ? true : false
x = x ? true : false
end
end
bm.report('!!') do
0.upto(N1) do |i|
y = !!str
y = !!nil
y = !!true
y = !!false
y = !!y
end
end
end
puts
# rubocop:enable all
end