drain 0.3.0 → 0.4
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/Rakefile +7 -10
- data/lib/dr/base/delegate.rb +28 -0
- data/lib/dr/base/graph.rb +14 -5
- data/lib/dr/base/uri.rb +3 -1
- data/lib/dr/base/utils.rb +31 -4
- data/lib/dr/parse/simple_keywords.rb +1 -1
- data/lib/dr/parse/time_parse.rb +28 -22
- data/lib/dr/ruby_ext/core_modules.rb +5 -3
- data/lib/dr/version.rb +1 -1
- data/test/test_core_ext.rb +2 -2
- data/test/test_date_parse.rb +4 -0
- data/test/test_time_parse.rb +43 -0
- data/test/test_uri.rb +35 -0
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 879680e62956b55119d14b0c5c334c1836c26b8922db6eaf12539c21fd1ccd76
|
4
|
+
data.tar.gz: 00134a0c8b8cb4e79aa8e2be089244864e46084c338917890caed1ae1e9abfc7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a9f6e1b457a54666f1fc2441d2104322811fc8c87f1857079092fdea94c1d819aadd63ee839b6a55c1ecb2c90a4260f53b3f6c3ecfd9e98a017a85c698e2107
|
7
|
+
data.tar.gz: c01a56879bf4e5558f461ad5c1a35582db768d6d62421cb62142061774a3bfbf8e8c3460fbdee6c0c26b816d7effd864b1cd0ab3be01bf3b541b4d2e6dc093bd
|
data/Rakefile
CHANGED
@@ -1,15 +1,5 @@
|
|
1
1
|
require 'rake'
|
2
2
|
|
3
|
-
begin
|
4
|
-
require 'rubygems/tasks'
|
5
|
-
Gem::Tasks.new(sign: {checksum: true, pgp: true},
|
6
|
-
scm: {status: true}) do |tasks|
|
7
|
-
tasks.console.command = 'pry'
|
8
|
-
end
|
9
|
-
rescue LoadError => e
|
10
|
-
warn e.message
|
11
|
-
end
|
12
|
-
|
13
3
|
require 'rake/testtask'
|
14
4
|
Rake::TestTask.new do |test|
|
15
5
|
test.libs << 'test'
|
@@ -27,3 +17,10 @@ rescue LoadError => e
|
|
27
17
|
end
|
28
18
|
task :doc => :yard
|
29
19
|
|
20
|
+
begin
|
21
|
+
require 'dr/rake_gems'
|
22
|
+
Gem::MyTasks.new
|
23
|
+
rescue LoadError => e
|
24
|
+
warn e.message
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module DR
|
2
|
+
module Delegator
|
3
|
+
extend self
|
4
|
+
def delegate_h(klass, var)
|
5
|
+
require 'forwardable'
|
6
|
+
# put in a Module so that they are easier to distinguish from the
|
7
|
+
# 'real' functions
|
8
|
+
m=Module.new do
|
9
|
+
extend(Forwardable)
|
10
|
+
methods=[:[], :[]=, :any?, :assoc, :clear, :compact, :compact!, :delete, :delete_if, :dig, :each, :each_key, :each_pair, :each_value, :empty?, :fetch, :fetch_values, :has_key?, :has_value?, :include?, :index, :invert, :keep_if, :key, :key?, :keys, :length, :member?, :merge, :merge!, :rassoc, :reject, :reject!, :select, :select!, :shift, :size, :slice, :store, :to_a, :to_h, :to_s, :transform_keys, :transform_keys!, :transform_values, :transform_values!, :update, :value?, :values, :values_at]
|
11
|
+
include(Enumerable)
|
12
|
+
def_delegators var, *methods
|
13
|
+
end
|
14
|
+
klass.include(m)
|
15
|
+
end
|
16
|
+
|
17
|
+
def access_methods(klass, var, *methods)
|
18
|
+
methods.each do |k|
|
19
|
+
klass.define_method k do
|
20
|
+
instance_variable_get(var)[k]
|
21
|
+
end
|
22
|
+
klass.defined_method :"#{k}=" do |*args|
|
23
|
+
instance_variable_get(var).send(:[]=, k, *args)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/dr/base/graph.rb
CHANGED
@@ -7,7 +7,7 @@ module DR
|
|
7
7
|
attr_reader :graph
|
8
8
|
attr_accessor :name, :attributes, :parents, :children
|
9
9
|
def initialize(name, attributes: {}, graph: nil)
|
10
|
-
@name = name
|
10
|
+
@name = name
|
11
11
|
@children = []
|
12
12
|
@parents = []
|
13
13
|
@attributes = attributes
|
@@ -78,7 +78,7 @@ module DR
|
|
78
78
|
|
79
79
|
STEP = 4
|
80
80
|
def to_s(show_attr: true)
|
81
|
-
@name + (show_attr && ! attributes.empty? ? " #{attributes}" : "")
|
81
|
+
@name.to_s + (show_attr && ! attributes.empty? ? " #{attributes}" : "")
|
82
82
|
end
|
83
83
|
def inspect
|
84
84
|
"#{self.class}: #{to_s(show_attr: true)}"+(graph.nil? ? "" : " (#{graph})")
|
@@ -107,10 +107,12 @@ module DR
|
|
107
107
|
class Graph
|
108
108
|
attr_accessor :nodes
|
109
109
|
include Enumerable
|
110
|
+
# note: passing a graph won't work
|
110
111
|
def initialize(*nodes, attributes: {}, infos: nil)
|
111
112
|
@nodes=[]
|
112
113
|
# a node can be a Hash or a Node
|
113
|
-
|
114
|
+
# so nodes really is a list of subgraphs
|
115
|
+
build(*nodes, attributes: attributes, infos: infos)
|
114
116
|
end
|
115
117
|
def each(&b)
|
116
118
|
@nodes.each(&b)
|
@@ -123,6 +125,10 @@ module DR
|
|
123
125
|
def to_a
|
124
126
|
return @nodes
|
125
127
|
end
|
128
|
+
def names
|
129
|
+
@nodes.map(&:name)
|
130
|
+
end
|
131
|
+
|
126
132
|
def to_hash(methods: [:children,:parents,:attributes], compact: true, recursive: true)
|
127
133
|
require 'dr/base/converter'
|
128
134
|
Converter.to_hash(@nodes, methods: methods, recursive: recursive, compact: compact)
|
@@ -142,7 +148,7 @@ module DR
|
|
142
148
|
h=to_hash(methods: [:children])
|
143
149
|
Hash[h.map {|k,v| [k.name, v.map(&:name)]}]
|
144
150
|
end
|
145
|
-
alias to_children to_h
|
151
|
+
#alias to_children to_h
|
146
152
|
|
147
153
|
def to_children
|
148
154
|
require 'dr/base/converter'
|
@@ -150,8 +156,11 @@ module DR
|
|
150
156
|
end
|
151
157
|
|
152
158
|
def inspect
|
153
|
-
"#{self.class}: #{map {|x| x.to_s}}"
|
159
|
+
"#{self.class}: #{map {|x| x.to_s(show_attr: false)}}"
|
154
160
|
end
|
161
|
+
# def to_s
|
162
|
+
# "#{self.class}: #{map {|x| x.to_s(show_attr: false)}}"
|
163
|
+
# end
|
155
164
|
|
156
165
|
#construct a node (without edges)
|
157
166
|
def new_node(node,**attributes)
|
data/lib/dr/base/uri.rb
CHANGED
data/lib/dr/base/utils.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module DR
|
2
2
|
module Utils
|
3
3
|
extend self
|
4
|
-
def pretty_print(string, format: nil, pretty:
|
4
|
+
def pretty_print(string, format: nil, pretty: nil)
|
5
5
|
case format.to_s
|
6
6
|
when "json"
|
7
7
|
require 'json'
|
@@ -10,14 +10,23 @@ module DR
|
|
10
10
|
require "yaml"
|
11
11
|
return pretty_print(string.to_yaml, pretty: pretty)
|
12
12
|
end
|
13
|
-
if pretty
|
13
|
+
pretty = "color" if pretty == nil or pretty == true #default
|
14
|
+
case pretty.to_s
|
15
|
+
when "ap"
|
14
16
|
begin
|
15
17
|
require 'ap'
|
16
18
|
ap string
|
17
19
|
rescue LoadError,NameError
|
18
|
-
pretty_print(string,pretty:
|
20
|
+
pretty_print(string,pretty: :pp)
|
19
21
|
end
|
20
|
-
|
22
|
+
when "color", "pp_color"
|
23
|
+
begin
|
24
|
+
require 'pry'
|
25
|
+
Pry::ColorPrinter.pp string
|
26
|
+
rescue LoadError,NameError
|
27
|
+
pretty_print(string,pretty: :pp)
|
28
|
+
end
|
29
|
+
when "pp"
|
21
30
|
require 'pp'
|
22
31
|
pp string
|
23
32
|
else
|
@@ -49,4 +58,22 @@ module DR
|
|
49
58
|
end
|
50
59
|
end
|
51
60
|
end
|
61
|
+
|
62
|
+
# Include this to get less output from pp
|
63
|
+
module PPHelper
|
64
|
+
# less verbose for pretty_print
|
65
|
+
def pretty_print(pp)
|
66
|
+
info = respond_to?(:to_pp) ? to_pp : to_s
|
67
|
+
pp.object_address_group(self) { pp.text " "+info }
|
68
|
+
end
|
69
|
+
|
70
|
+
#since we hide the pp value of self, allow to inspect it
|
71
|
+
def export
|
72
|
+
r={}
|
73
|
+
instance_variables.sort.each do |var|
|
74
|
+
r[var]=instance_variable_get(var)
|
75
|
+
end
|
76
|
+
r
|
77
|
+
end
|
78
|
+
end
|
52
79
|
end
|
@@ -20,7 +20,7 @@ module DR
|
|
20
20
|
edelim= delims[1] || bdelim
|
21
21
|
keywords=@keywords.keys
|
22
22
|
keywords_r="(?:"+keywords.map {|k| "(?:"+k+")"}.join("|")+")"
|
23
|
-
reg = %r{(?<kw>#{keywords_r})(?<re>#{'\\'+bdelim}(?:(?>[^#{'\\'+bdelim}#{'\\'+edelim}]+)|\g<re>)*#{'\\'+edelim})}
|
23
|
+
reg = %r{(?<kw>#{keywords_r})(?<re>#{'\\'+bdelim}(?:(?>[^#{'\\'+bdelim}#{edelim == bdelim ? '' : '\\'+edelim}]+)|\g<re>)*#{'\\'+edelim})}
|
24
24
|
if (m=reg.match(msg))
|
25
25
|
arg=m[:re][1...m[:re].length-1]
|
26
26
|
arg=parse(arg, **opts)
|
data/lib/dr/parse/time_parse.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'chronic'
|
2
2
|
require 'chronic_duration'
|
3
|
-
require 'active_support/time'
|
3
|
+
# require 'active_support/time'
|
4
4
|
|
5
5
|
module DR
|
6
6
|
module TimeParse
|
@@ -8,17 +8,17 @@ module DR
|
|
8
8
|
def time_to_day_range(t)
|
9
9
|
return Chronic.parse(t.to_date, guess:false)
|
10
10
|
end
|
11
|
-
def parse(s, opt
|
11
|
+
def parse(s, **opt)
|
12
12
|
return s if Date===s or Time===s
|
13
13
|
|
14
|
-
|
15
|
-
first
|
16
|
-
second
|
14
|
+
!opt[:norange] and s.match(/(.*)\.\.(.*)/) do |m|
|
15
|
+
first=m[1]
|
16
|
+
second=m[2]
|
17
17
|
opt[:norange]=true
|
18
18
|
return Chronic::Span.new(self.parse(first, opt),self.parse(second,opt))
|
19
19
|
end
|
20
20
|
|
21
|
-
if
|
21
|
+
if s.match(/\A[[:space:]]*\z/) # blank
|
22
22
|
t=Time.now
|
23
23
|
elsif s[0] =~ /[+-]/
|
24
24
|
#if s=+3.years-1.minutes
|
@@ -53,19 +53,25 @@ module DR
|
|
53
53
|
|
54
54
|
end
|
55
55
|
end
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
56
|
+
|
57
|
+
=begin Examples:
|
58
|
+
|
59
|
+
DR::TimeParse.parse("+100..tomorrow") #first: +100, second: tomorrow
|
60
|
+
=> 2014-08-22 11:20:31 +0200..2014-08-23 12:00:00 +0200
|
61
|
+
|
62
|
+
DR::TimeParse.parse("now..in seven days") #first: now, second: in seven days
|
63
|
+
=> 2014-08-22 11:20:25 +0200..2014-08-29 11:20:25 +0200
|
64
|
+
|
65
|
+
DR::TimeParse.parse("today")
|
66
|
+
=> 2014-08-22 17:30:00 +0200
|
67
|
+
|
68
|
+
DR::TimeParse.parse("today",range: true)
|
69
|
+
=> 2014-08-22 11:00:00 +0200..2014-08-23 00:00:00 +0200
|
70
|
+
|
71
|
+
DR::TimeParse.parse("-3 years 2 minutes") #-94672920
|
72
|
+
=> 2011-08-22 20:01:34 +0200
|
73
|
+
|
74
|
+
require 'active_support/time'
|
75
|
+
DR::TimeParse.parse("+3.years+2.days")
|
76
|
+
=> 2017-08-24 14:04:08 +0200
|
77
|
+
=end
|
@@ -2,9 +2,9 @@ module DR
|
|
2
2
|
module CoreExt
|
3
3
|
#[Hash, Array].each {|m| m.include(Enumerable)} #to reinclude
|
4
4
|
module Enumerable
|
5
|
-
#Ex: [1,2,3,4].
|
5
|
+
#Ex: [1,2,3,4].classify({odd: [1,3], default: :even})
|
6
6
|
#=> {:odd=>[1, 3], :even=>[2, 4]}
|
7
|
-
def
|
7
|
+
def classify(h)
|
8
8
|
invh=h.inverse
|
9
9
|
default=h[:default]
|
10
10
|
r={}
|
@@ -36,7 +36,7 @@ module DR
|
|
36
36
|
|
37
37
|
# Same as +deep_merge+, but modifies +self+.
|
38
38
|
def deep_merge!(other_hash, append: :auto, &block)
|
39
|
-
return unless other_hash
|
39
|
+
return self unless other_hash
|
40
40
|
other_hash.each_pair do |k,v|
|
41
41
|
tv = self[k]
|
42
42
|
case
|
@@ -301,6 +301,8 @@ module DR
|
|
301
301
|
end
|
302
302
|
|
303
303
|
module CoreRef
|
304
|
+
# warning, this only works for methods that don't need to call other
|
305
|
+
# refined methods
|
304
306
|
CoreExt.constants.select {|c| const_get("::#{c}").is_a?(Class)}.each do |c|
|
305
307
|
refine const_get("::#{c}") do
|
306
308
|
include CoreExt.const_get(c)
|
data/lib/dr/version.rb
CHANGED
data/test/test_core_ext.rb
CHANGED
@@ -10,8 +10,8 @@ module TestCoreExt
|
|
10
10
|
require 'dr/ruby_ext/core_ext'
|
11
11
|
describe DR::CoreExt do
|
12
12
|
describe Enumerable do
|
13
|
-
it "Can
|
14
|
-
[1,2,3,4].
|
13
|
+
it "Can classify enumerable" do
|
14
|
+
[1,2,3,4].classify({odd: [1,3], default: :even}).must_equal({:odd=>[1, 3], :even=>[2, 4]})
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
data/test/test_date_parse.rb
CHANGED
@@ -3,9 +3,13 @@ require 'dr/parse/date_parse'
|
|
3
3
|
|
4
4
|
describe DR::DateRange do
|
5
5
|
before do
|
6
|
+
@tz=ENV['TZ']
|
6
7
|
ENV['TZ']='GMT'
|
7
8
|
@daterange=DR::DateRange.parse("2014-01-02 -> 2014-01-03, 2014-01-05, 2014-02 -> :now")
|
8
9
|
end
|
10
|
+
after do
|
11
|
+
ENV['TZ']=@tz
|
12
|
+
end
|
9
13
|
|
10
14
|
it "Can parse dates" do
|
11
15
|
@daterange.d.must_equal [["2014-01-02", "2014-01-03"], ["2014-01-05"], ["2014-02", :now]]
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'dr/parse/time_parse'
|
3
|
+
|
4
|
+
describe DR::TimeParse do
|
5
|
+
before do
|
6
|
+
@tz=ENV['TZ']
|
7
|
+
ENV['TZ']='GMT'
|
8
|
+
class << Time
|
9
|
+
alias _original_now now
|
10
|
+
def now
|
11
|
+
Time.new(2000)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
after do
|
16
|
+
ENV['TZ']=@tz
|
17
|
+
class << Time
|
18
|
+
alias now _original_now
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "Can parse a range" do
|
23
|
+
DR::TimeParse.parse("+100..tomorrow").must_equal(
|
24
|
+
Time.parse("2000-01-01 00:01:40")..Time.parse("2000-01-02 12:00:00")
|
25
|
+
)
|
26
|
+
DR::TimeParse.parse("now..in seven days").must_equal(
|
27
|
+
Time.parse("2000-01-01 00:00:00")..Time.parse("2000-01-08 00:00:00")
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "Can parse a date" do
|
32
|
+
DR::TimeParse.parse("today").must_equal(Time.parse("2000-01-01-12:00:00"))
|
33
|
+
end
|
34
|
+
|
35
|
+
it "Can put a date in a range" do
|
36
|
+
DR::TimeParse.parse("today", range: true).must_equal(
|
37
|
+
Time.parse("2000-01-01-00:00:00")..Time.parse("2000-01-02-00:00:00")
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
#with active_support: DR::TimeParse.parse("-3 years 2 minutes")
|
43
|
+
#=> 2011-08-22 20:01:34 +0200
|
data/test/test_uri.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'dr/base/uri'
|
3
|
+
|
4
|
+
describe DR::URIWrapper do
|
5
|
+
before do
|
6
|
+
@uri=DR::URIWrapper.new(URI.escape("http://ploum:secret@plam:443/foo bar"))
|
7
|
+
end
|
8
|
+
it "Wraps an uri element" do
|
9
|
+
@uri.scheme.must_equal "http"
|
10
|
+
end
|
11
|
+
it "Auto escapes attribute" do
|
12
|
+
@uri.path.must_equal "/foo bar"
|
13
|
+
end
|
14
|
+
it "Auto escape setting elements" do
|
15
|
+
@uri.user="ploum plam"
|
16
|
+
@uri.user.must_equal "ploum plam"
|
17
|
+
end
|
18
|
+
it "Can convert to a hash" do
|
19
|
+
@uri.to_h[:user].must_equal("ploum")
|
20
|
+
end
|
21
|
+
it "Can convert to json" do
|
22
|
+
require 'json'
|
23
|
+
@uri.to_json.must_equal("{\"uri\":\"http://ploum:secret@plam:443/foo%20bar\",\"scheme\":\"http\",\"userinfo\":\"ploum:secret\",\"host\":\"plam\",\"port\":443,\"path\":\"/foo bar\",\"user\":\"ploum\",\"password\":\"secret\"}")
|
24
|
+
end
|
25
|
+
it "Can remove password" do
|
26
|
+
@uri.to_public.must_equal("http://ploum@plam:443/foo%20bar")
|
27
|
+
end
|
28
|
+
it "Can be merged" do
|
29
|
+
@uri.soft_merge("foo://plim@").to_s.must_equal("foo://plim:secret@plam:443/foo%20bar")
|
30
|
+
end
|
31
|
+
it "Can be reverse merged" do
|
32
|
+
DR::URIWrapper.parse("//user@server").reverse_merge(@uri).to_s.must_equal("http://user:secret@server:443/foo%20bar")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: drain
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.4'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Damien Robert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -68,7 +68,7 @@ dependencies:
|
|
68
68
|
version: '0.8'
|
69
69
|
description: 'Drain is a small set of libraries that I use in my other gems.
|
70
70
|
|
71
|
-
'
|
71
|
+
'
|
72
72
|
email: Damien.Olivier.Robert+gems@gmail.com
|
73
73
|
executables: []
|
74
74
|
extensions: []
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- lib/dr/base.rb
|
92
92
|
- lib/dr/base/bool.rb
|
93
93
|
- lib/dr/base/converter.rb
|
94
|
+
- lib/dr/base/delegate.rb
|
94
95
|
- lib/dr/base/encoding.rb
|
95
96
|
- lib/dr/base/eruby.rb
|
96
97
|
- lib/dr/base/functional.rb
|
@@ -120,6 +121,8 @@ files:
|
|
120
121
|
- test/test_meta.rb
|
121
122
|
- test/test_simple_keywords.rb
|
122
123
|
- test/test_simple_parser.rb
|
124
|
+
- test/test_time_parse.rb
|
125
|
+
- test/test_uri.rb
|
123
126
|
homepage: https://github.com/DamienRobert/drain#readme
|
124
127
|
licenses:
|
125
128
|
- MIT
|
@@ -140,8 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
143
|
- !ruby/object:Gem::Version
|
141
144
|
version: '0'
|
142
145
|
requirements: []
|
143
|
-
|
144
|
-
rubygems_version: 2.7.7
|
146
|
+
rubygems_version: 3.0.6
|
145
147
|
signing_key:
|
146
148
|
specification_version: 4
|
147
149
|
summary: Use a drain for a dryer ruby!
|