cant_even 2016.04.01
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +13 -0
- data/README.md +21 -0
- data/Rakefile +14 -0
- data/cant_even.gemspec +16 -0
- data/lib/cant_even.rb +49 -0
- data/lib/cant_even/version.rb +3 -0
- data/spec/cant_even_spec.rb +8 -0
- metadata +51 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 12c0c508188ce7063d82a17b6e66c1b54581a7c4
|
4
|
+
data.tar.gz: fd8aa02a4e8e9326ec526961d459985f75c51c04
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cacf2e808971302c0c833ca973ada1d007470ba9976deea9e17ef93a45f68dc444f54f8de86afd08ca8452eec34817e4d0b5bd77516a541c07c5604c6a1f675b
|
7
|
+
data.tar.gz: 759b1900c13d1ab2bfd037c46d0b8e56a8c0904d70fe00ecc630c184050e2e89d31c8a7cabc448698cd229fff3d18cd554dbd249438772b16f6e0c9ef945ee18
|
data/LICENSE
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
2
|
+
Version 2, December 2004
|
3
|
+
|
4
|
+
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
5
|
+
|
6
|
+
Everyone is permitted to copy and distribute verbatim or modified
|
7
|
+
copies of this license document, and changing it is allowed as long
|
8
|
+
as the name is changed.
|
9
|
+
|
10
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
11
|
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION, AND MODIFICATION
|
12
|
+
|
13
|
+
0. You just DO WHAT THE FUCK YOU WANT TO.
|
data/README.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# cant_even
|
2
|
+
|
3
|
+
Once loaded, **cant_even** makes it considerably more difficult to introduce dis[parity](https://en.wikipedia.org/wiki/Parity_(mathematics)) into your program.
|
4
|
+
|
5
|
+
### "Usage"
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
17 + 25
|
9
|
+
# => 42
|
10
|
+
|
11
|
+
require 'cant_even'
|
12
|
+
|
13
|
+
17 + 25
|
14
|
+
# => Do you even return value? No, `42', you don't. (CantEven::ParityError)
|
15
|
+
|
16
|
+
19 * 84
|
17
|
+
# => argument `84' has insufficient oddity.
|
18
|
+
|
19
|
+
2016 / 12
|
20
|
+
# => `2016' is an inappropriately even receiver.
|
21
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
|
3
|
+
Rake::TestTask.new :spec do |t|
|
4
|
+
t.test_files = ['spec/cant_even_spec.rb']
|
5
|
+
end
|
6
|
+
|
7
|
+
task :default do
|
8
|
+
launcher = case RUBY_PLATFORM
|
9
|
+
when /darwin/i ; 'open'
|
10
|
+
when /win/i ; 'start'
|
11
|
+
else ; 'xdg-open'
|
12
|
+
end
|
13
|
+
`#{launcher} https://www.youtube.com/watch?v=dQw4w9WgXcQ`
|
14
|
+
end
|
data/cant_even.gemspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
$:.unshift File.expand_path '../lib', __FILE__
|
2
|
+
require 'cant_even/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'cant_even'
|
6
|
+
s.version = CantEven::VERSION
|
7
|
+
s.author = 'D.E. Akers'
|
8
|
+
s.email = '0x0dea@gmail.com'
|
9
|
+
|
10
|
+
s.summary = 'A library for reducing disparity.'
|
11
|
+
s.homepage = 'https://github.com/0x0dea/cant_even'
|
12
|
+
s.license = 'WTFPL'
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split
|
15
|
+
s.extensions = %w[Rakefile]
|
16
|
+
end
|
data/lib/cant_even.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
module CantEven
|
2
|
+
ParityError = Class.new Exception
|
3
|
+
EscapeHatch = :i_suck_and_my_program_really_needs_to_even
|
4
|
+
|
5
|
+
# TODO: Moar!
|
6
|
+
NOPES = [
|
7
|
+
"%<kind>s `%<obj>d' has insufficient oddity.",
|
8
|
+
"`%<obj>d' is an inappropriately even %<kind>s.",
|
9
|
+
"Do you even %<kind>s? No, `%<obj>d', you don't.",
|
10
|
+
]
|
11
|
+
|
12
|
+
def self.check obj, kind
|
13
|
+
if Integer === obj && obj.even?
|
14
|
+
raise ParityError,
|
15
|
+
NOPES.sample % {obj: obj, kind: kind},
|
16
|
+
# Scrub implementation details from the backtrace.
|
17
|
+
caller.grep_v(/Deoptimizer/).drop(kind == 'argument' ? 3 : 1)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Trace calls and returns, and explode if any evens are involved.
|
22
|
+
# Unexported and immediately enabled for maximal topkeks.
|
23
|
+
tracer = TracePoint.new(:call, :c_call, :return, :c_return) { |tp|
|
24
|
+
case tp.event
|
25
|
+
when :call, :c_call
|
26
|
+
check tp.self, 'receiver'
|
27
|
+
tp.binding.local_variables.each do |lv|
|
28
|
+
check tp.binding.local_variable_get(lv), 'argument'
|
29
|
+
end
|
30
|
+
when :return, :c_return
|
31
|
+
check tp.return_value, 'return value'
|
32
|
+
end
|
33
|
+
}.tap(&:enable)
|
34
|
+
|
35
|
+
# Close over ^ to provide an escape hatch for dire circumstances.
|
36
|
+
define_singleton_method(EscapeHatch) { |&block|
|
37
|
+
tracer.disable and block.call and tracer.enable
|
38
|
+
}
|
39
|
+
|
40
|
+
# `1 + 1` compiles to `opt_plus` and won't be seen by TracePoint
|
41
|
+
# as long as Fixnum#+ has its original definition.
|
42
|
+
module Deoptimizer
|
43
|
+
%i[+ - * / % < <= > >= ==].each do |op|
|
44
|
+
define_method(op) { |o| super o }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
Fixnum.prepend CantEven::Deoptimizer
|
metadata
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cant_even
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2016.04.01
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- D.E. Akers
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-01 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email: 0x0dea@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions:
|
17
|
+
- Rakefile
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- LICENSE
|
21
|
+
- README.md
|
22
|
+
- Rakefile
|
23
|
+
- cant_even.gemspec
|
24
|
+
- lib/cant_even.rb
|
25
|
+
- lib/cant_even/version.rb
|
26
|
+
- spec/cant_even_spec.rb
|
27
|
+
homepage: https://github.com/0x0dea/cant_even
|
28
|
+
licenses:
|
29
|
+
- WTFPL
|
30
|
+
metadata: {}
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
requirements: []
|
46
|
+
rubyforge_project:
|
47
|
+
rubygems_version: 2.6.2
|
48
|
+
signing_key:
|
49
|
+
specification_version: 4
|
50
|
+
summary: A library for reducing disparity.
|
51
|
+
test_files: []
|