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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5c577f08df5d0dd378a335824250d97008d3eb24896d101ecc1ed51a2281a1f0
4
- data.tar.gz: f35b4fd99afb4870ddb44991b776ef8e5621739d7d83d7ba4d9ae851b2713df1
3
+ metadata.gz: 879680e62956b55119d14b0c5c334c1836c26b8922db6eaf12539c21fd1ccd76
4
+ data.tar.gz: 00134a0c8b8cb4e79aa8e2be089244864e46084c338917890caed1ae1e9abfc7
5
5
  SHA512:
6
- metadata.gz: a889f20d3499a98ddc6da50f8cc14201881cf695271b250730ebc26024e657f2af2f7764f5e078979029559dd1dea3745a60a9df9c40ae8d5fc64f7903948a1e
7
- data.tar.gz: 1a95a1661230282f9339258e1b6a241bd4fe2e503fbb9f43ea20c220e220a093903356cd8e78fd36e62899189b919a5a4ee50a3261951fdfde1bceebb91cbae1
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
@@ -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.to_s
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
- build(*nodes, attributes: {}, infos: infos)
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)
@@ -96,7 +96,9 @@ module DR
96
96
  end
97
97
 
98
98
  def to_json(_state = nil)
99
- to_h.to_json
99
+ h=to_h
100
+ h[:uri]=h[:uri].to_s #h[:uri] is a URIWrapper, so convert it to string so json does not convert it again
101
+ h.to_json
100
102
  end
101
103
 
102
104
  def to_public
@@ -1,7 +1,7 @@
1
1
  module DR
2
2
  module Utils
3
3
  extend self
4
- def pretty_print(string, format: nil, pretty: false)
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.to_s=="color"
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:true)
20
+ pretty_print(string,pretty: :pp)
19
21
  end
20
- elsif pretty
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)
@@ -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
- if !opt[:norange] && s=~/(.*)\.\.(.*)/
15
- first=$1
16
- second=$2
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 not s.present?
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
- #Examples:
57
- #DR::TimeParse.parse("+100..tomorrow")
58
- #first: +100, second: tomorrow
59
- #=> 2014-08-22 11:20:31 +0200..2014-08-23 12:00:00 +0200
60
- #[74] pry(main)> DR::TimeParse.parse("now..in seven days")
61
- #first: now, second: in seven days
62
- #=> 2014-08-22 11:20:25 +0200..2014-08-29 11:20:25 +0200
63
- #[75] pry(main)> DR::TimeParse.parse("today")
64
- #=> 2014-08-22 17:30:00 +0200
65
- #[76] pry(main)> DR::TimeParse.parse("today",range: true)
66
- #=> 2014-08-22 11:00:00 +0200..2014-08-23 00:00:00 +0200
67
- #[181] pry(main)> DR::TimeParse.parse("-3 years 2 minutes")
68
- #-94672920
69
- #=> 2011-08-22 20:01:34 +0200
70
- #[182] pry(main)> DR::TimeParse.parse("+3.years+2.days")
71
- #=> 2017-08-24 14:04:08 +0200
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].filter({odd: [1,3], default: :even})
5
+ #Ex: [1,2,3,4].classify({odd: [1,3], default: :even})
6
6
  #=> {:odd=>[1, 3], :even=>[2, 4]}
7
- def filter(h)
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)
@@ -1,4 +1,4 @@
1
1
  module DR
2
2
  # drain version
3
- VERSION = "0.3.0"
3
+ VERSION = "0.4"
4
4
  end
@@ -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 filter enumerable" do
14
- [1,2,3,4].filter({odd: [1,3], default: :even}).must_equal({:odd=>[1, 3], :even=>[2, 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
 
@@ -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
@@ -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.3.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: 2018-09-07 00:00:00.000000000 Z
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
- rubyforge_project:
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!