nuggets 1.4.0 → 1.6.1

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.
Files changed (38) hide show
  1. checksums.yaml +5 -5
  2. data/ChangeLog +14 -0
  3. data/README +4 -4
  4. data/lib/nuggets/array/format.rb +1 -1
  5. data/lib/nuggets/array/histogram_mixin.rb +4 -4
  6. data/lib/nuggets/file/sub_mixin.rb +8 -8
  7. data/lib/nuggets/hash/in_order.rb +2 -2
  8. data/lib/nuggets/hash/nest_mixin.rb +5 -9
  9. data/lib/nuggets/hash/unroll_mixin.rb +4 -4
  10. data/lib/nuggets/io/modes.rb +15 -15
  11. data/lib/nuggets/io/redirect_mixin.rb +2 -4
  12. data/lib/nuggets/json/canonical.rb +5 -0
  13. data/lib/nuggets/{io/null_mixin.rb → json/canonical_mixin.rb} +31 -12
  14. data/lib/nuggets/json/multi.rb +5 -0
  15. data/lib/nuggets/json/multi_mixin.rb +71 -0
  16. data/lib/nuggets/log_parser/rails.rb +18 -18
  17. data/lib/nuggets/string/format.rb +5 -0
  18. data/lib/nuggets/string/format_mixin.rb +59 -0
  19. data/lib/nuggets/string/highlight.rb +5 -0
  20. data/lib/nuggets/string/highlight_mixin.rb +62 -0
  21. data/lib/nuggets/version.rb +2 -2
  22. data/spec/nuggets/array/format_spec.rb +2 -1
  23. data/spec/nuggets/enumerable/minmax_spec.rb +2 -2
  24. data/spec/nuggets/env/set_spec.rb +2 -2
  25. data/spec/nuggets/env/user_home_spec.rb +1 -21
  26. data/spec/nuggets/hash/at_spec.rb +1 -1
  27. data/spec/nuggets/hash/deep_fetch_spec.rb +1 -1
  28. data/spec/nuggets/hash/deep_merge_spec.rb +16 -16
  29. data/spec/nuggets/hash/seen_spec.rb +1 -1
  30. data/spec/nuggets/hash/unroll_spec.rb +6 -18
  31. data/spec/nuggets/json/canonical_spec.rb +74 -0
  32. data/spec/nuggets/json/multi_spec.rb +67 -0
  33. data/spec/nuggets/object/blank_spec.rb +2 -2
  34. data/spec/nuggets/object/singleton_class_spec.rb +3 -2
  35. data/spec/nuggets/string/format_spec.rb +85 -0
  36. data/spec/nuggets/string/highlight_spec.rb +47 -0
  37. metadata +25 -16
  38. data/lib/nuggets/io/null.rb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b8bc4223cf7e497022aa29613c8fddce9a757b69
4
- data.tar.gz: 3f1f0159203157d4fbcded7cf3dc5aeb25972df2
2
+ SHA256:
3
+ metadata.gz: 1918bdc23725b5833549da651c379edda6a6e070753571e0037e7a7147be67ca
4
+ data.tar.gz: e48e2395d1366f14bfba167be73e36a4f2050ea64419918eca3b1f095d0fb37c
5
5
  SHA512:
6
- metadata.gz: aedaaac17d00e186d8219ba67495fc1b5f73033251cff451b8f38e5e454cee49a4eac56922c2ae2b34c2ff3d87ba1bf922285a512f879e197552ea7219084733
7
- data.tar.gz: 99ed4373f5c96cd6a0f42a0ee55e4ee5a8d99f166245fb2ff6f54330dfbeac503f021868bda9569bf8149b05aea31cb3ec7c6855c30a5509fbbabeff9a03678d
6
+ metadata.gz: 6719bf7667073a9bb9eb8c6f667a1715ebce7dff48b4cc4d514dbfbb6a245fafbfe3101a4f6426cb96e9820b072c8431d5b88c8f51a8201c143166eb65be4daf
7
+ data.tar.gz: de3a4dad5dcd6e5d238c92ea95ee4d4964c79c10df4b634c0b533e2e7f93e7107516c3d147c856dccb40f556911791b11b515c4ce427c6dd8f256036b5bd7c91
data/ChangeLog CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  = Revision history for nuggets
4
4
 
5
+ == 1.6.1 [2022-05-18]
6
+
7
+ * Ruby 3.1 compatibility.
8
+
9
+ == 1.6.0 [2018-07-12]
10
+
11
+ * Added <tt>JSON.*_{multi,canonical}</tt>.
12
+
13
+ == 1.5.0 [2016-04-19]
14
+
15
+ * Added String#format.
16
+ * Added String#highlight.
17
+ * Dropped IO::NULL, available as File::NULL since Ruby 1.9.3.
18
+
5
19
  == 1.4.0 [2015-10-02]
6
20
 
7
21
  * Added File.open_file.
data/README CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  == VERSION
4
4
 
5
- This documentation refers to nuggets version 1.4.0.
5
+ This documentation refers to nuggets version 1.6.1.
6
6
 
7
7
 
8
8
  == DESCRIPTION
9
9
 
10
10
  Nuggets provides a collection of extensions to Ruby classes.
11
- It's similar to projects like Facets[http://rubyworks.github.com/facets]
11
+ It's similar to projects like Facets[https://rubyworks.github.io/facets]
12
12
  and Extensions[http://extensions.rubyforge.org] (or even
13
13
  Labrador[http://labrador.rubyforge.org]).
14
14
 
@@ -45,7 +45,7 @@ expected or cause other libraries to misbehave. Use at your own risk!
45
45
 
46
46
  == LINKS
47
47
 
48
- Documentation:: https://blackwinter.github.com/nuggets
48
+ Documentation:: https://blackwinter.github.io/nuggets
49
49
  Source code:: https://github.com/blackwinter/nuggets
50
50
  RubyGem:: https://rubygems.org/gems/nuggets
51
51
  Travis CI:: https://travis-ci.org/blackwinter/nuggets
@@ -58,7 +58,7 @@ Travis CI:: https://travis-ci.org/blackwinter/nuggets
58
58
 
59
59
  == LICENSE AND COPYRIGHT
60
60
 
61
- Copyright (C) 2007-2015 Jens Wille
61
+ Copyright (C) 2007-2022 Jens Wille
62
62
 
63
63
  nuggets is free software: you can redistribute it and/or modify it
64
64
  under the terms of the GNU Affero General Public License as published by
@@ -40,7 +40,7 @@ class Array
40
40
  # Applies to string argument accordingly: First string in _array_ applied to
41
41
  # _str_; empty string if _str_ is empty.
42
42
  def %(args)
43
- opts = { :sep => ', ' }
43
+ opts = { sep: ', ' }
44
44
  opts.update(pop) if last.is_a?(::Hash)
45
45
 
46
46
  default = lambda { |n| ['%s'] * n * opts[:sep] }
@@ -39,10 +39,10 @@ module Nuggets
39
39
  #
40
40
  # The "numeric" variants format the item as a (decimal) number.
41
41
  FORMATS = {
42
- :default => '%-*s [%s]%*s %*d',
43
- :percent => '%-*s [%s]%*s %*d (%.2f%%)',
44
- :numeric => '%*d [%s]%*s %*d',
45
- :numeric_percent => '%*d [%s]%*s %*d (%.2f%%)'
42
+ default: '%-*s [%s]%*s %*d',
43
+ percent: '%-*s [%s]%*s %*d (%.2f%%)',
44
+ numeric: '%*d [%s]%*s %*d',
45
+ numeric_percent: '%*d [%s]%*s %*d (%.2f%%)'
46
46
  }
47
47
 
48
48
  # Encapsulates a #histogram item and provides the following attributes (see
@@ -39,9 +39,9 @@ module Nuggets
39
39
  #
40
40
  # Calls String#sub! on file +name+'s contents with +args+ and (optional)
41
41
  # +block+ and returns the new content.
42
- def sub(name, *args)
42
+ def sub(name, *args, &block)
43
43
  content = read(name)
44
- content.sub!(*args, &block_given? ? ::Proc.new : nil)
44
+ content.sub!(*args, &block)
45
45
  content
46
46
  end
47
47
 
@@ -51,11 +51,11 @@ module Nuggets
51
51
  # Calls String#sub! on file +name+'s contents with +args+ and (optional)
52
52
  # +block+ and replaces the file with the new content. Returns the result
53
53
  # of the String#sub! call.
54
- def sub!(name, *args)
54
+ def sub!(name, *args, &block)
55
55
  res = nil
56
56
 
57
57
  replace(name) { |content|
58
- res = content.sub!(*args, &block_given? ? ::Proc.new : nil)
58
+ res = content.sub!(*args, &block)
59
59
  content
60
60
  }
61
61
 
@@ -67,9 +67,9 @@ module Nuggets
67
67
  #
68
68
  # Calls String#gsub! on file +name+'s contents with +args+ and (optional)
69
69
  # +block+ and returns the new content.
70
- def gsub(name, *args)
70
+ def gsub(name, *args, &block)
71
71
  content = read(name)
72
- content.gsub!(*args, &block_given? ? ::Proc.new : nil)
72
+ content.gsub!(*args, &block)
73
73
  content
74
74
  end
75
75
 
@@ -79,11 +79,11 @@ module Nuggets
79
79
  # Calls String#gsub! on file +name+'s contents with +args+ and (optional)
80
80
  # +block+ and replaces the file with the new content. Returns the result
81
81
  # of the String#gsub! call.
82
- def gsub!(name, *args)
82
+ def gsub!(name, *args, &block)
83
83
  res = nil
84
84
 
85
85
  replace(name) { |content|
86
- res = content.gsub!(*args, &block_given? ? ::Proc.new : nil)
86
+ res = content.gsub!(*args, &block)
87
87
  content
88
88
  }
89
89
 
@@ -34,8 +34,8 @@ class Hash
34
34
  # Returns <tt>hash#to_a</tt>, in forced order (cf. Array#in_order).
35
35
  #
36
36
  # Examples:
37
- # { :a => 1, :b => 2, :c => 3 }.in_order(:b, :c) #=> [[:b, 2], [:c, 3], [:a, 1]]
38
- # { :a => 1, :b => 2, :c => 3 }.in_order(:b, :d) #=> [[:b, 2], [:a, 1], [:c, 3]]
37
+ # { a: 1, b: 2, c: 3 }.in_order(:b, :c) #=> [[:b, 2], [:c, 3], [:a, 1]]
38
+ # { a: 1, b: 2, c: 3 }.in_order(:b, :d) #=> [[:b, 2], [:a, 1], [:c, 3]]
39
39
  def in_order(*ordered)
40
40
  keys.in_order(*ordered).map { |key| [key, self[key]] }
41
41
  end
@@ -45,15 +45,15 @@ module Nuggets
45
45
  # Example:
46
46
  #
47
47
  # hash = Hash.nest(2)
48
- # hash[:foo][:bar][:a] = { :x => 1, :y => 2 }
49
- # hash[:foo][:bar][:b] = { :x => 0, :y => 3 }
48
+ # hash[:foo][:bar][:a] = { x: 1, y: 2 }
49
+ # hash[:foo][:bar][:b] = { x: 0, y: 3 }
50
50
  # hash
51
51
  # #=> {:foo=>{:bar=>{:b=>{:y=>3, :x=>0}, :a=>{:y=>2, :x=>1}}}}
52
- def nest(depth = 0, value = default = true)
52
+ def nest(depth = 0, value = default = true, &block)
53
53
  if depth.zero?
54
54
  if default
55
55
  if block_given?
56
- new { |hash, key| hash[key] = yield(key) }
56
+ new { |hash, key| hash[key] = block[key] }
57
57
  else
58
58
  new { |hash, key| hash[key] = hash.default }
59
59
  end
@@ -62,11 +62,7 @@ module Nuggets
62
62
  end
63
63
  else
64
64
  if default
65
- if block_given?
66
- new { |hash, key| hash[key] = nest(depth - 1, &::Proc.new) }
67
- else
68
- new { |hash, key| hash[key] = nest(depth - 1) }
69
- end
65
+ new { |hash, key| hash[key] = nest(depth - 1, &block) }
70
66
  else
71
67
  new { |hash, key| hash[key] = nest(depth - 1, value) }
72
68
  end
@@ -30,7 +30,7 @@ module Nuggets
30
30
 
31
31
  # call-seq:
32
32
  # hash.unroll(*value_keys) => anArray
33
- # hash.unroll(*value_keys, :sort_by => ...) => anArray
33
+ # hash.unroll(*value_keys, sort_by: ...) => anArray
34
34
  # hash.unroll(*value_keys) { |value_hash| ... } => anArray
35
35
  #
36
36
  # "Unrolls" a nested hash, so that each path through _hash_ results in a
@@ -46,13 +46,13 @@ module Nuggets
46
46
  #
47
47
  # Examples:
48
48
  #
49
- # { :foo => { :bar => { :a => { :x => 1, :y => 2 }, :b => { :x => 0, :y => 3 } } } }.unroll
49
+ # { foo: { bar: { a: { x: 1, y: 2 }, b: { x: 0, y: 3 } } } }.unroll
50
50
  # #=> [[:foo, :bar, :b, 3, 0], [:foo, :bar, :a, 2, 1]]
51
51
  #
52
- # { :foo => { :bar => { :a => { :x => 1, :y => 2 }, :b => { :x => 0, :y => 3 } } } }.unroll(:sort_by => :to_s)
52
+ # { foo: { bar: { a: { x: 1, y: 2 }, b: { x: 0, y: 3 } } } }.unroll(sort_by: :to_s)
53
53
  # #=> [[:foo, :bar, :a, 1, 2], [:foo, :bar, :b, 0, 3]]
54
54
  #
55
- # { :foo => { :bar => { :a => { :x => 1, :y => 2 }, :b => { :x => 0, :y => 3 } } } }.unroll { |data| data[:x] = nil; data[:y] *= 2 }
55
+ # { foo: { bar: { a: { x: 1, y: 2 }, b: { x: 0, y: 3 } } } }.unroll { |data| data[:x] = nil; data[:y] *= 2 }
56
56
  # #=> [[:foo, :bar, :b, 6, nil], [:foo, :bar, :a, 4, nil]]
57
57
  def unroll(*value_keys, &block)
58
58
  args = value_keys.dup
@@ -38,8 +38,8 @@ class IO
38
38
  #
39
39
  # Opens +name+ with mode +r+. NOTE: With no associated block,
40
40
  # acts like the original IO::read, not like IO::new.
41
- def read(name, *args)
42
- return _nuggets_original_read(name, *args) unless block_given?
41
+ def read(name, *args, **opts, &block)
42
+ return _nuggets_original_read(name, *args, **opts) unless block_given?
43
43
 
44
44
  case args.size
45
45
  when 0
@@ -55,7 +55,7 @@ class IO
55
55
  raise ::ArgumentError, "wrong number of arguments (#{args.size + 1} for 1-2)"
56
56
  end
57
57
 
58
- open_with_mode(name, 'r', binary, &::Proc.new)
58
+ open_with_mode(name, 'r', binary, &block)
59
59
  end
60
60
 
61
61
  # call-seq:
@@ -63,8 +63,8 @@ class IO
63
63
  # IO.write(name[, binary]) { |io| ... } => anObject
64
64
  #
65
65
  # Opens +name+ with mode +w+.
66
- def write(name, binary = false)
67
- open_with_mode(name, 'w', binary, &block_given? ? ::Proc.new : nil)
66
+ def write(name, binary = false, &block)
67
+ open_with_mode(name, 'w', binary, &block)
68
68
  end
69
69
 
70
70
  # call-seq:
@@ -72,8 +72,8 @@ class IO
72
72
  # IO.append(name[, binary]) { |io| ... } => anObject
73
73
  #
74
74
  # Opens +name+ with mode +a+.
75
- def append(name, binary = false)
76
- open_with_mode(name, 'a', binary, &block_given? ? ::Proc.new : nil)
75
+ def append(name, binary = false, &block)
76
+ open_with_mode(name, 'a', binary, &block)
77
77
  end
78
78
 
79
79
  # call-seq:
@@ -81,8 +81,8 @@ class IO
81
81
  # IO.read_write(name[, binary]) { |io| ... } => anObject
82
82
  #
83
83
  # Opens +name+ with mode <tt>r+</tt>.
84
- def read_write(name, binary = false)
85
- open_with_mode(name, 'r+', binary, &block_given? ? ::Proc.new : nil)
84
+ def read_write(name, binary = false, &block)
85
+ open_with_mode(name, 'r+', binary, &block)
86
86
  end
87
87
 
88
88
  # call-seq:
@@ -90,8 +90,8 @@ class IO
90
90
  # IO.write_read(name[, binary]) { |io| ... } => anObject
91
91
  #
92
92
  # Opens +name+ with mode <tt>w+</tt>.
93
- def write_read(name, binary = false)
94
- open_with_mode(name, 'w+', binary, &block_given? ? ::Proc.new : nil)
93
+ def write_read(name, binary = false, &block)
94
+ open_with_mode(name, 'w+', binary, &block)
95
95
  end
96
96
 
97
97
  # call-seq:
@@ -99,15 +99,15 @@ class IO
99
99
  # IO.append_read(name[, binary]) { |io| ... } => anObject
100
100
  #
101
101
  # Opens +name+ with mode <tt>a+</tt>.
102
- def append_read(name, binary = false)
103
- open_with_mode(name, 'a+', binary, &block_given? ? ::Proc.new : nil)
102
+ def append_read(name, binary = false, &block)
103
+ open_with_mode(name, 'a+', binary, &block)
104
104
  end
105
105
 
106
106
  private
107
107
 
108
108
  # Just a helper to DRY things up.
109
- def open_with_mode(name, mode, binary = false)
110
- open(name, "#{mode}#{'b' if binary}", &block_given? ? ::Proc.new : nil)
109
+ def open_with_mode(name, mode, binary = false, &block)
110
+ open(name, "#{mode}#{'b' if binary}", &block)
111
111
  end
112
112
 
113
113
  end
@@ -3,7 +3,7 @@
3
3
  # #
4
4
  # nuggets -- Extending Ruby #
5
5
  # #
6
- # Copyright (C) 2007-2012 Jens Wille #
6
+ # Copyright (C) 2007-2016 Jens Wille #
7
7
  # #
8
8
  # Authors: #
9
9
  # Jens Wille <jens.wille@gmail.com> #
@@ -24,13 +24,11 @@
24
24
  ###############################################################################
25
25
  #++
26
26
 
27
- require 'nuggets/io/null_mixin'
28
-
29
27
  module Nuggets
30
28
  class IO
31
29
  module RedirectMixin
32
30
 
33
- def redirect(target = NullMixin::NULL, mode = 'w')
31
+ def redirect(target = ::File::NULL, mode = 'w')
34
32
  unless target.is_a?(self.class)
35
33
  target = ::File.open(target, mode)
36
34
  close_target = true
@@ -0,0 +1,5 @@
1
+ require 'json'
2
+
3
+ require_relative 'canonical_mixin'
4
+
5
+ JSON.extend(Nuggets::JSON::CanonicalMixin)
@@ -3,7 +3,7 @@
3
3
  # #
4
4
  # nuggets -- Extending Ruby #
5
5
  # #
6
- # Copyright (C) 2007-2014 Jens Wille #
6
+ # Copyright (C) 2007-2018 Jens Wille #
7
7
  # #
8
8
  # Authors: #
9
9
  # Jens Wille <jens.wille@gmail.com> #
@@ -24,18 +24,37 @@
24
24
  ###############################################################################
25
25
  #++
26
26
 
27
- require 'nuggets/ruby_mixin'
28
-
29
27
  module Nuggets
30
- class IO
31
- module NullMixin
32
-
33
- NULL = case RubyMixin::RUBY_PLATFORM
34
- when /mswin|mingw/i then 'NUL'
35
- when /openvms/i then 'NL:'
36
- when /amiga/i then 'NIL:'
37
- else '/dev/null'
38
- end.freeze
28
+ module JSON
29
+ module CanonicalMixin
30
+
31
+ def generate_canonical(obj, opts = {})
32
+ generate(_nuggets_json_canonical(obj), opts)
33
+ end
34
+
35
+ def pretty_generate_canonical(obj, opts = {})
36
+ pretty_generate(_nuggets_json_canonical(obj), opts)
37
+ end
38
+
39
+ def pretty_print_canonical(source, opts = {})
40
+ pretty_generate_canonical(parse_multi(source, opts), opts)
41
+ end
42
+
43
+ alias_method :pc, :pretty_print_canonical
44
+
45
+ private
46
+
47
+ def _nuggets_json_canonical(obj)
48
+ case obj
49
+ when ::Hash
50
+ obj.class.new.tap { |res|
51
+ obj.keys.sort.each { |k| res[k] = send(__method__, obj[k]) } }
52
+ when ::Array
53
+ obj.map { |v| send(__method__, v) }.sort_by(&:to_s)
54
+ else
55
+ obj
56
+ end
57
+ end
39
58
 
40
59
  end
41
60
  end
@@ -0,0 +1,5 @@
1
+ require 'json'
2
+
3
+ require_relative 'multi_mixin'
4
+
5
+ JSON.extend(Nuggets::JSON::MultiMixin)
@@ -0,0 +1,71 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # nuggets -- Extending Ruby #
5
+ # #
6
+ # Copyright (C) 2007-2018 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # nuggets is free software; you can redistribute it and/or modify it under #
12
+ # the terms of the GNU Affero General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
17
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
18
+ # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ module Nuggets
28
+ module JSON
29
+ module MultiMixin
30
+
31
+ # Preserves multiple (non-unique) names in
32
+ # {"non-interoperable"}[https://tools.ietf.org/html/rfc7159#section-4] JSON objects.
33
+ def parse_multi(source, opts = {})
34
+ parse(source, opts.merge(object_class: MULTI_OBJECT))
35
+ end
36
+
37
+ def pretty_print_multi(source, opts = {})
38
+ pretty_generate(parse_multi(source, opts), opts)
39
+ end
40
+
41
+ alias_method :pp, :pretty_print_multi
42
+
43
+ private
44
+
45
+ class MULTI_OBJECT < ::Hash
46
+
47
+ def []=(k, v)
48
+ super(MULTI_KEY.new(k), v)
49
+ end
50
+
51
+ def each_multi(k)
52
+ block_given? ? each { |l, v| yield v if k == l } : enum_for(__method__, k)
53
+ end
54
+
55
+ def fetch_multi(k)
56
+ each_multi(k).to_a
57
+ end
58
+
59
+ end
60
+
61
+ class MULTI_KEY < ::String
62
+
63
+ def eql?(*)
64
+ false
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -54,7 +54,7 @@ module Nuggets
54
54
  # Log line patterns
55
55
  ITEMS = [
56
56
  [:processing, {
57
- :re => %r{
57
+ re: %r{
58
58
  #{PREFIX_RE} # pid, host
59
59
  Processing\s+
60
60
  (\w+) # controller
@@ -72,23 +72,23 @@ module Nuggets
72
72
  (\w+) # request_method
73
73
  \]
74
74
  }xo,
75
- :keys => [:controller, :action, :ip, :datetime, :request_method]
75
+ keys: [:controller, :action, :ip, :datetime, :request_method]
76
76
  }],
77
77
  [:session_id, {
78
- :re => %r{
78
+ re: %r{
79
79
  #{PREFIX_RE} # pid, host
80
80
  Session\sID:\s+
81
81
  (\S+) # sid
82
82
  }xo,
83
- :keys => [:sid]
83
+ keys: [:sid]
84
84
  }],
85
85
  [:parameters, {
86
- :re => %r{
86
+ re: %r{
87
87
  #{PREFIX_RE} # pid, host
88
88
  Parameters:\s+
89
89
  (\{.*\}) # params
90
90
  }xo, #}
91
- :proc => lambda { |entry, md|
91
+ proc: lambda { |entry, md|
92
92
  entry[:params_hash] = md[3].hash
93
93
  entry[:params] = begin
94
94
  eval("$SAFE = 3\n#{md[3].gsub(/#<.*?>/, '%q{\&}')}", nil, __FILE__, __LINE__) # !!!
@@ -98,7 +98,7 @@ module Nuggets
98
98
  }
99
99
  }],
100
100
  [:client_info, {
101
- :re => %r{
101
+ re: %r{
102
102
  #{PREFIX_RE} # pid, host
103
103
  Client\sinfo:\s+
104
104
  UA\s+=\s+
@@ -107,18 +107,18 @@ module Nuggets
107
107
  LANG\s+=\s+
108
108
  (.*) # accept_language
109
109
  }xo,
110
- :keys => [:user_agent, :accept_language]
110
+ keys: [:user_agent, :accept_language]
111
111
  }],
112
112
  [:referer, {
113
- :re => %r{
113
+ re: %r{
114
114
  #{PREFIX_RE} # pid, host
115
115
  Referer:\s+
116
116
  (.*) # referer
117
117
  }xo,
118
- :keys => [:referer]
118
+ keys: [:referer]
119
119
  }],
120
120
  [:meta, {
121
- :re => %r{
121
+ re: %r{
122
122
  #{PREFIX_RE} # pid, host
123
123
  Meta:\s+
124
124
  User\s+=\s+
@@ -127,20 +127,20 @@ module Nuggets
127
127
  Institution\s+=\s+
128
128
  (.*) # institution_id
129
129
  }xo,
130
- :keys => [:user_id, :institution_id]
130
+ keys: [:user_id, :institution_id]
131
131
  }],
132
132
  [:stats, {
133
- :re => %r{
133
+ re: %r{
134
134
  #{PREFIX_RE} # pid, host
135
135
  Stats:\s+
136
136
  (.*) # flags
137
137
  }xo,
138
- :proc => lambda { |entry, md|
138
+ proc: lambda { |entry, md|
139
139
  entry[:flags] = md[3].split(SEPARATOR_RE)
140
140
  }
141
141
  }],
142
142
  [:oauth, {
143
- :re => %r{
143
+ re: %r{
144
144
  #{PREFIX_RE} # pid, host
145
145
  OAuth:\s+
146
146
  Token\s+=\s+
@@ -152,10 +152,10 @@ module Nuggets
152
152
  Client\s+=\s+
153
153
  (.*) # client_id
154
154
  }xo,
155
- :keys => [:token_type, :token, :user_id, :client_id]
155
+ keys: [:token_type, :token, :user_id, :client_id]
156
156
  }],
157
157
  [:benchmark, {
158
- :re => %r{
158
+ re: %r{
159
159
  #{PREFIX_RE} # pid, host
160
160
  Completed\sin\s+
161
161
  (\S+) # runtime
@@ -185,7 +185,7 @@ module Nuggets
185
185
  (.*) # request_uri
186
186
  \]
187
187
  }xo,
188
- :keys => [:runtime, :rendering_runtime, :db_runtime, :status, :request_uri]
188
+ keys: [:runtime, :rendering_runtime, :db_runtime, :status, :request_uri]
189
189
  }]
190
190
  ]
191
191
 
@@ -0,0 +1,5 @@
1
+ require 'nuggets/string/format_mixin'
2
+
3
+ class String
4
+ include Nuggets::String::FormatMixin
5
+ end
@@ -0,0 +1,59 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # nuggets -- Extending Ruby #
5
+ # #
6
+ # Copyright (C) 2007-2016 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # nuggets is free software; you can redistribute it and/or modify it under #
12
+ # the terms of the GNU Affero General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
17
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
18
+ # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ module Nuggets
28
+ class String
29
+ module FormatMixin
30
+
31
+ PREFIX = '%'
32
+
33
+ FORMAT_RE = %r{#{PREFIX}(?:\{(.*?)\}|(.))}o
34
+
35
+ # call-seq:
36
+ # str.format(hash) => aString
37
+ # str.format { |directive| ... } => aString
38
+ #
39
+ # Replace format directives in _str_.
40
+ #
41
+ # If +hash+ given, uses value of directive key (String or Symbol)
42
+ # as replacement value. Raises KeyError if directive key not found.
43
+ #
44
+ # If block given, uses result of +directive+ yielded to block as
45
+ # replacement value. Raises ArgumentError if block returns no value.
46
+ def format(hash = nil)
47
+ replace = lambda { |&b| gsub(FORMAT_RE) {
48
+ (k = $1 || $2) == PREFIX ? k : b[k] } }
49
+
50
+ hash ? replace.() { |k| hash.fetch(k) {
51
+ hash.fetch(k.to_sym) { raise(KeyError, "key not found: #{k}") } } } :
52
+ block_given? ? replace.() { |k| yield k or
53
+ raise(ArgumentError, "malformed format string - #{$&}") } :
54
+ raise(ArgumentError, 'wrong number of arguments (given 0, expected 1)')
55
+ end
56
+
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,5 @@
1
+ require 'nuggets/string/highlight_mixin'
2
+
3
+ class String
4
+ include Nuggets::String::HighlightMixin
5
+ end