muflax 0.1.34
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +1 -0
- data.tar.gz.sig +1 -0
- data/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +47 -0
- data/LICENSE +674 -0
- data/README +39 -0
- data/Rakefile +23 -0
- data/lib/muflax.rb +34 -0
- data/lib/muflax/array.rb +59 -0
- data/lib/muflax/debug.rb +31 -0
- data/lib/muflax/dir.rb +16 -0
- data/lib/muflax/enumerable.rb +67 -0
- data/lib/muflax/file.rb +39 -0
- data/lib/muflax/hash.rb +14 -0
- data/lib/muflax/kernel.rb +21 -0
- data/lib/muflax/library.rb +16 -0
- data/lib/muflax/objects.rb +51 -0
- data/lib/muflax/regex.rb +25 -0
- data/lib/muflax/string.rb +21 -0
- data/muflax.gemspec +26 -0
- metadata +196 -0
- metadata.gz.sig +1 -0
data/README
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
Convenience library that pulls in all standard libraries and hacks I use in quick scripts.
|
2
|
+
|
3
|
+
[ TODO
|
4
|
+
|
5
|
+
- shortcut for "@var = var" initializations; I think Rails ships it even?
|
6
|
+
- .to_i!, .max!
|
7
|
+
- a few more extensions to range_math, notably "pass method call to numbers"
|
8
|
+
|
9
|
+
]
|
10
|
+
[ Memoization
|
11
|
+
|
12
|
+
Should work like this:
|
13
|
+
|
14
|
+
- get file and body of the method to be memoized (via method_source gem)
|
15
|
+
- hash that as the method signature
|
16
|
+
- take arguments, hash them (via Ruby) (you shouldn't pass fancy arguments, only trivially hashable ones, like strings or symbols, not arrays or some custom object shit)
|
17
|
+
- save/retrieve result in/from hash (as simple pickle)
|
18
|
+
- initialize hash from database, "checkpoint.cache" and save results
|
19
|
+
|
20
|
+
- annotate all methods that can be memoized? memoize everything by default? not sure yet, but opt-in is probably the most predictable behavior
|
21
|
+
|
22
|
+
This enables checkpoint-esque behavior: any method that hasn't changed (same signature) and takes the same arguments just loads the result from a big hash instead of re-generating it every time, but any actual change will be taken into account.
|
23
|
+
|
24
|
+
The database can simply be regularly cleaned / deleted, or just discard old signatures (when initializing, look up method name -> test signature -> different? discard cache for this method)
|
25
|
+
|
26
|
+
Like:
|
27
|
+
|
28
|
+
~~~
|
29
|
+
require "muflax/checkpoint"
|
30
|
+
|
31
|
+
+Checkpoint
|
32
|
+
def method args
|
33
|
+
...
|
34
|
+
end
|
35
|
+
|
36
|
+
method(42)
|
37
|
+
~~~
|
38
|
+
|
39
|
+
]
|
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
desc "open a pry session preloaded with this library"
|
2
|
+
task :pry do
|
3
|
+
sh "pry -Ilib -rmuflax"
|
4
|
+
end
|
5
|
+
|
6
|
+
desc "build a gem from the gemspec"
|
7
|
+
task :build do
|
8
|
+
sh "mkdir -p pkg"
|
9
|
+
sh "gem build muflax.gemspec"
|
10
|
+
sh "mv muflax-*.gem pkg/"
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "clean pkg"
|
14
|
+
task :clean do
|
15
|
+
sh "rm -f pkg/*"
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "install a gem"
|
19
|
+
task :install => [:clean, :build] do
|
20
|
+
sh "gem install -l --no-format-executable pkg/muflax-*.gem"
|
21
|
+
end
|
22
|
+
|
23
|
+
task :default => :install
|
data/lib/muflax.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# coding: utf-8
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2013
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
# ruby libs
|
7
|
+
require "csv"
|
8
|
+
require "date"
|
9
|
+
require "fileutils"
|
10
|
+
require "set"
|
11
|
+
require "yaml"
|
12
|
+
require "zlib"
|
13
|
+
|
14
|
+
# external libs
|
15
|
+
require "awesome_print"
|
16
|
+
require "highline/import"
|
17
|
+
require "range_math"
|
18
|
+
require "trollop"
|
19
|
+
|
20
|
+
# rails
|
21
|
+
require "active_support"
|
22
|
+
require "active_support/all"
|
23
|
+
|
24
|
+
# avoid rails deprecation warning
|
25
|
+
I18n.enforce_available_locales = false
|
26
|
+
|
27
|
+
def require_local_libs path, location=__FILE__
|
28
|
+
Dir["#{File.join(File.dirname(location), path)}/*.rb"].each do |lib|
|
29
|
+
require lib
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# gem libs
|
34
|
+
require_local_libs "muflax"
|
data/lib/muflax/array.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2013
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
class Array
|
7
|
+
def align str=" ", alignment: :left
|
8
|
+
lines = []
|
9
|
+
columns = 0
|
10
|
+
|
11
|
+
# split all lines
|
12
|
+
self.each do |line|
|
13
|
+
line = line.split(str, -1)
|
14
|
+
lines << line
|
15
|
+
columns = [columns, line.size - 1].max
|
16
|
+
end
|
17
|
+
|
18
|
+
just_function = case alignment
|
19
|
+
when :left ; :ljust
|
20
|
+
when :right ; :rjust
|
21
|
+
when :center ; :center
|
22
|
+
else
|
23
|
+
raise "invalid alignment: #{alignment}"
|
24
|
+
end
|
25
|
+
|
26
|
+
# justify all columns
|
27
|
+
(0..columns).each do |column|
|
28
|
+
length = lines.map{|line| line[column]}.length_of_longest
|
29
|
+
|
30
|
+
lines.each do |line|
|
31
|
+
elem = line[column]
|
32
|
+
unless elem.nil?
|
33
|
+
# how much the element is internally longer than it appears
|
34
|
+
elem_diff = elem.to_s.length - elem.str_length
|
35
|
+
|
36
|
+
line[column] = elem.send(just_function, length + elem_diff)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# join lines back together
|
42
|
+
lines.map{|line| line.join(str)}
|
43
|
+
end
|
44
|
+
|
45
|
+
def align! str=" ", alignment: :left
|
46
|
+
self.replace(self.align(str, alignment: alignment))
|
47
|
+
end
|
48
|
+
|
49
|
+
def triangle
|
50
|
+
return to_enum(:triangle) unless block_given?
|
51
|
+
|
52
|
+
self.each.with_index do |a, ai|
|
53
|
+
self.each.with_index do |b, bi|
|
54
|
+
next if bi < ai
|
55
|
+
yield [a, b]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/muflax/debug.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2013
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
# This is very stupid and shouldn't be used in real code, which is why I will use it in real code.
|
7
|
+
|
8
|
+
def bp
|
9
|
+
require "debug_inspector"
|
10
|
+
require "pry"
|
11
|
+
RubyVM::DebugInspector.open do |inspector|
|
12
|
+
eval("binding.pry", inspector.frame_binding(2))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def bpe
|
17
|
+
require "debug_inspector"
|
18
|
+
require "pry"
|
19
|
+
RubyVM::DebugInspector.open do |inspector|
|
20
|
+
eval("binding.pry; exit", inspector.frame_binding(2))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def v *variables
|
25
|
+
require "debug_inspector"
|
26
|
+
RubyVM::DebugInspector.open do |inspector|
|
27
|
+
variables.each do |variable|
|
28
|
+
eval("print '#{variable}: '; ap #{variable}", inspector.frame_binding(2))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/muflax/dir.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2014
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
class Dir
|
7
|
+
class << self
|
8
|
+
alias_method :"_[]", :"[]"
|
9
|
+
|
10
|
+
# make glob sort by default
|
11
|
+
def [] *args
|
12
|
+
|
13
|
+
self.send(:"_[]", *(args.map{|a| File.expand_path(a)})).sort
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2013
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
module Enumerable
|
7
|
+
# find shortest element
|
8
|
+
def shortest
|
9
|
+
self.min_by{|s| s.str_length}
|
10
|
+
end
|
11
|
+
|
12
|
+
# find longest element
|
13
|
+
def longest
|
14
|
+
self.max_by{|s| s.str_length}
|
15
|
+
end
|
16
|
+
|
17
|
+
def length_of_longest
|
18
|
+
self.longest.str_length
|
19
|
+
end
|
20
|
+
|
21
|
+
def length_of_shortest
|
22
|
+
self.shortest.str_length
|
23
|
+
end
|
24
|
+
|
25
|
+
def average
|
26
|
+
self.sum.to_f / self.size.to_f
|
27
|
+
end
|
28
|
+
alias :mean :average
|
29
|
+
alias :avg :average
|
30
|
+
|
31
|
+
def geometric_mean
|
32
|
+
self.reduce(:*).to_f ** (1.0 / self.size.to_f)
|
33
|
+
end
|
34
|
+
|
35
|
+
def median
|
36
|
+
self.percentile 0.5
|
37
|
+
end
|
38
|
+
|
39
|
+
def median_by &block
|
40
|
+
self.percentile_by 0.5, &block
|
41
|
+
end
|
42
|
+
|
43
|
+
def percentile percent
|
44
|
+
self.sort[(self.size * percent).round]
|
45
|
+
end
|
46
|
+
|
47
|
+
def percentile_by percent, &block
|
48
|
+
self.sort_by(&block)[(self.size * percent).round]
|
49
|
+
end
|
50
|
+
|
51
|
+
def triangle
|
52
|
+
self.to_a.triangle
|
53
|
+
end
|
54
|
+
|
55
|
+
def histogram &block
|
56
|
+
histo = vivaHash 0
|
57
|
+
self.each do |el|
|
58
|
+
histo[block.call(el)] += 1
|
59
|
+
end
|
60
|
+
|
61
|
+
histo
|
62
|
+
end
|
63
|
+
|
64
|
+
def count_by &block
|
65
|
+
self.histogram(&block).sort_by(&:second).to_h
|
66
|
+
end
|
67
|
+
end
|
data/lib/muflax/file.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2013
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
class File
|
7
|
+
def self.save name, as: :text, &blk
|
8
|
+
name = File.expand_path(name)
|
9
|
+
|
10
|
+
# make sure directory exists
|
11
|
+
dir = File.dirname(name)
|
12
|
+
FileUtils.mkdir_p dir if not Dir.exists? dir
|
13
|
+
|
14
|
+
# now open it
|
15
|
+
case as
|
16
|
+
when :anki
|
17
|
+
f = CSV.open(name, "w", :col_sep => "\t", &blk)
|
18
|
+
when :text
|
19
|
+
f = File.open(name, "w", &blk)
|
20
|
+
else
|
21
|
+
raise "unsupported file format: #{as}"
|
22
|
+
end
|
23
|
+
|
24
|
+
f
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.load name
|
28
|
+
name = File.expand_path(name)
|
29
|
+
|
30
|
+
file = case name
|
31
|
+
when /\.gz$/
|
32
|
+
Zlib::GzipReader.open(name)
|
33
|
+
else
|
34
|
+
File.open(name)
|
35
|
+
end
|
36
|
+
|
37
|
+
file
|
38
|
+
end
|
39
|
+
end
|
data/lib/muflax/hash.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2013
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
# simple auto-vivifying hash
|
7
|
+
# TODO support nested hashes
|
8
|
+
def vivaHash default=[]
|
9
|
+
hash = Hash.new do |h, k|
|
10
|
+
h[k] = default.duplicable? ? default.dup : default
|
11
|
+
end
|
12
|
+
|
13
|
+
hash
|
14
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2014
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
module Kernel
|
7
|
+
def hr
|
8
|
+
width, height = HighLine::SystemExtensions.terminal_size
|
9
|
+
linewidth = [(width || 0) - 1, 1].max
|
10
|
+
|
11
|
+
puts "-" * (linewidth)
|
12
|
+
end
|
13
|
+
|
14
|
+
def zsh command
|
15
|
+
system "zsh", "-l", "-c", command
|
16
|
+
end
|
17
|
+
|
18
|
+
def fish command
|
19
|
+
system "fish", "-l", "-c", command
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2013
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
def require_local lib_name, location=__FILE__
|
7
|
+
file = File.symlink?(location) ? File.readlink(location) : location
|
8
|
+
lib = File.join File.dirname(file), "/../lib/#{lib_name}.rb"
|
9
|
+
|
10
|
+
if File.exists? lib
|
11
|
+
# using local version
|
12
|
+
require lib
|
13
|
+
else
|
14
|
+
require lib_name
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2013
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
# make it possible to track data in attributes
|
7
|
+
class Class
|
8
|
+
alias_method :attr_reader_without_tracking, :attr_reader
|
9
|
+
def attr_reader(*names)
|
10
|
+
attr_readers.concat(names)
|
11
|
+
attr_reader_without_tracking(*names)
|
12
|
+
end
|
13
|
+
|
14
|
+
def attr_readers
|
15
|
+
@attr_readers ||= [ ]
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :attr_writer_without_tracking, :attr_writer
|
19
|
+
def attr_writer(*names)
|
20
|
+
attr_writers.concat(names)
|
21
|
+
attr_writer_without_tracking(*names)
|
22
|
+
end
|
23
|
+
|
24
|
+
def attr_writers
|
25
|
+
@attr_writers ||= [ ]
|
26
|
+
end
|
27
|
+
|
28
|
+
alias_method :attr_accessor_without_tracking, :attr_accessor
|
29
|
+
def attr_accessor(*names)
|
30
|
+
attr_readers.concat(names)
|
31
|
+
attr_writers.concat(names)
|
32
|
+
attr_accessor_without_tracking(*names)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Object
|
37
|
+
def differences_with(other)
|
38
|
+
# get list of all attributes
|
39
|
+
attrs = (self.class.attr_readers + self.class.attr_writers).uniq.sort
|
40
|
+
|
41
|
+
# pick all attributes that they disagree about
|
42
|
+
attrs.reject do |attr|
|
43
|
+
self.respond_to? attr and other.respond_to? attr and self.send(attr) == other.send(attr)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# consistent string length
|
48
|
+
def str_length
|
49
|
+
HighLine.uncolor(self.to_s).length
|
50
|
+
end
|
51
|
+
end
|
data/lib/muflax/regex.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
# Copyright muflax <mail@muflax.com>, 2013
|
4
|
+
# License: GNU GPL 3 <http://www.gnu.org/copyleft/gpl.html>
|
5
|
+
|
6
|
+
class String
|
7
|
+
def mgsub replacements={}
|
8
|
+
str = self.dup
|
9
|
+
|
10
|
+
str.mgsub! replacements
|
11
|
+
|
12
|
+
str
|
13
|
+
end
|
14
|
+
alias :gsub_all :mgsub
|
15
|
+
|
16
|
+
def mgsub! replacements={}
|
17
|
+
replacements.each do |a, b|
|
18
|
+
self.gsub! a, b
|
19
|
+
end
|
20
|
+
|
21
|
+
self
|
22
|
+
end
|
23
|
+
alias :gsub_all! :mgsub!
|
24
|
+
end
|
25
|
+
|