fmt 0.1.2 → 0.1.3

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: a4bafcbfda352b24f4203057c8ae8c8df4ddc109727fd610250d54c1db02ea2a
4
- data.tar.gz: 1e672363e323f01757e1590441d8f836bba9b03936b4551189cd040a942936f2
3
+ metadata.gz: 7aded878eeff57ab27f37b6e76bc34281d94000c95c5d0ae77dde2bee5ab5989
4
+ data.tar.gz: 0d6390579afbfa629f0e53a127c25b60c04548b831e8ec13b9ebd8ed0880a238
5
5
  SHA512:
6
- metadata.gz: 39a4f811f2a9ee86e82fd0e7ce557aa6f22971cd31bde8c5a717b47f74b35119c8d7616580dac5de18851329edd304a72549ecd8239c2104caea3f41d4a3da7e
7
- data.tar.gz: 75fe78f4908b6b94eb7fe37ba0d76819562d7005405d72d3c14ccb93b55d465da95e890becd9794b53eb7c3d44970a6f14ba3d62d45c1eb78e1cf31810e4885f
6
+ metadata.gz: 1235f7508b608760ce2f984cdcb321c01ac2a1cd3d7d5b9d1b586b45614e3b79c38bf900264b569fa469c17e34d2b6e1999984715a9b51c8caa792ee7d080aa9
7
+ data.tar.gz: '012095a10cbeac34f3457bf18ebe9135513a774984139cd1c7c300cd00d774590eff1826f7af137adbb32acd77f2eb8bffa1d52b48c579422fe43a2e7c3769cf'
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <p align="center">
2
2
  <a href="http://blog.codinghorror.com/the-best-code-is-no-code-at-all/">
3
- <img alt="Lines of Code" src="https://img.shields.io/badge/loc-316-47d299.svg" />
3
+ <img alt="Lines of Code" src="https://img.shields.io/badge/loc-347-47d299.svg" />
4
4
  </a>
5
5
  <a href="https://github.com/testdouble/standard">
6
6
  <img alt="Ruby Style" src="https://img.shields.io/badge/style-standard-168AFE?logo=ruby&logoColor=FE1616" />
@@ -38,7 +38,7 @@ I'm currenly using this to help build beautiful CLI applications with Ruby. Plus
38
38
  ## Setup
39
39
 
40
40
  ```
41
- bundle add rainbow # optional
41
+ bundle add rainbow # <- optional
42
42
  bundle add fmt
43
43
  ```
44
44
 
@@ -72,6 +72,8 @@ Basic example:
72
72
  require "rainbow"
73
73
  require "fmt"
74
74
 
75
+ Fmt.add_rainbow_filters
76
+
75
77
  template = "Hello %{name}cyan|bold"
76
78
  Fmt template, name: "World"
77
79
 
@@ -86,6 +88,8 @@ Mix and match native formatting with Rainbow formatting:
86
88
  require "rainbow"
87
89
  require "fmt"
88
90
 
91
+ Fmt.add_rainbow_filters
92
+
89
93
  template = "Date: %{date}.10s|magenta"
90
94
  Fmt template, date: Time.now
91
95
 
@@ -100,6 +104,8 @@ Multiline example:
100
104
  require "rainbow"
101
105
  require "fmt"
102
106
 
107
+ Fmt.add_rainbow_filters
108
+
103
109
  template = <<~T
104
110
  Date: %{date}.10s|underline
105
111
 
@@ -124,6 +130,7 @@ The block accepts a string and should return a replacement string.
124
130
  require "rainbow"
125
131
  require "fmt"
126
132
 
133
+ Fmt.add_rainbow_filters
127
134
  Fmt.add_filter(:ljust) { |val| "".ljust 14, val.to_s }
128
135
 
129
136
  template = <<~T
@@ -148,6 +155,8 @@ Just wrap the embedded template in double curly braces: `{{EMBEDDED TEMPLATE HER
148
155
  require "rainbow"
149
156
  require "fmt"
150
157
 
158
+ Fmt.add_rainbow_filters
159
+
151
160
  template = "%{value}lime {{%{embed_value}red|bold|underline}}"
152
161
  Fmt template, value: "Outer", embed_value: "Inner"
153
162
 
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "monitor"
4
+ require_relative "../filter"
5
+
6
+ module Fmt
7
+ class FilterGroup
8
+ include Enumerable
9
+ include MonitorMixin
10
+
11
+ def initialize
12
+ super
13
+ @data = {}
14
+ end
15
+
16
+ def [](name)
17
+ synchronize { data[name.to_sym] }
18
+ end
19
+
20
+ def add(name, filter_proc = nil, &block)
21
+ raise ArgumentError, "filter_proc and block are mutually exclusive" if filter_proc && block
22
+ raise ArgumentError, "filter_proc must be a Proc" unless block || filter_proc.is_a?(Proc)
23
+ synchronize do
24
+ data[name.to_sym] = Fmt::Filter.new(name.to_sym, filter_proc || block)
25
+ end
26
+ end
27
+
28
+ def each(&block)
29
+ synchronize { data.each(&block) }
30
+ end
31
+
32
+ def fetch(name, default = nil)
33
+ synchronize { data.fetch name.to_sym, default }
34
+ end
35
+
36
+ def key?(name)
37
+ synchronize { data.key? name.to_sym }
38
+ end
39
+
40
+ alias_method :added?, :key?
41
+ alias_method :include?, :key?
42
+
43
+ def merge!(other)
44
+ synchronize { data.merge! other.to_h }
45
+ self
46
+ end
47
+
48
+ def to_h
49
+ data.dup
50
+ end
51
+
52
+ protected
53
+
54
+ attr_reader :data
55
+ end
56
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "filter_group"
4
+
5
+ module Fmt
6
+ class RainbowFilterGroup < FilterGroup
7
+ def initialize
8
+ super
9
+
10
+ if defined? Rainbow
11
+ methods = Rainbow::Presenter.public_instance_methods(false).select do |method|
12
+ Rainbow::Presenter.public_instance_method(method).arity == 0
13
+ end
14
+
15
+ method_names = methods
16
+ .map { |m| m.name.to_sym }
17
+ .concat(Rainbow::X11ColorNames::NAMES.keys)
18
+
19
+ method_names.each do |name|
20
+ add(name) { |string| Rainbow(string).public_send name }
21
+ end
22
+ end
23
+ rescue => error
24
+ puts "Error adding Rainbow filters! #{error.inspect}"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "filter_group"
4
+
5
+ module Fmt
6
+ class StringFilterGroup < FilterGroup
7
+ def initialize
8
+ super
9
+
10
+ # rubocop:disable Layout/ExtraSpacing AllowForAlignment
11
+ add :capitalize, ->(s) { s.capitalize }
12
+ add :chomp, ->(s) { s.chomp }
13
+ add :chop, ->(s) { s.chop }
14
+ add :downcase, ->(s) { s.downcase }
15
+ add :lstrip, ->(s) { s.lstrip }
16
+ add :reverse, ->(s) { s.reverse }
17
+ add :rstrip, ->(s) { s.rstrip }
18
+ add :shellescape, ->(s) { s.shellescape }
19
+ add :strip, ->(s) { s.strip }
20
+ add :succ, ->(s) { s.succ }
21
+ add :swapcase, ->(s) { s.swapcase }
22
+ add :undump, ->(s) { s.undump }
23
+ add :unicode_normalize, ->(s) { s.unicode_normalize }
24
+ add :upcase, ->(s) { s.upcase }
25
+ # rubocop:enable Layout/ExtraSpacing AllowForAlignment
26
+ end
27
+ end
28
+ end
data/lib/fmt/formatter.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "singleton"
4
- require_relative "filters"
4
+ require_relative "filter_groups/filter_group"
5
+ require_relative "filter_groups/rainbow_filter_group"
6
+ require_relative "filter_groups/string_filter_group"
5
7
  require_relative "scanners"
6
8
  require_relative "transformer"
7
9
 
@@ -11,6 +13,14 @@ module Fmt
11
13
 
12
14
  attr_reader :filters
13
15
 
16
+ def add_rainbow_filters
17
+ filters.merge! Fmt::RainbowFilterGroup.new.to_h
18
+ end
19
+
20
+ def add_filter(...)
21
+ filters.add(...)
22
+ end
23
+
14
24
  def format(string, **locals)
15
25
  result = string.to_s
16
26
  transformer = next_transformer(result)
@@ -27,7 +37,7 @@ module Fmt
27
37
 
28
38
  def initialize
29
39
  super
30
- @filters = Fmt::Filters.new
40
+ @filters = Fmt::FilterGroup.new.merge!(Fmt::StringFilterGroup.new)
31
41
  end
32
42
 
33
43
  def next_transformer(string)
@@ -22,26 +22,20 @@ module Fmt
22
22
  if filter.string?
23
23
  begin
24
24
  replacement = sprintf("%#{filter.value}", replacement)
25
- rescue => error
26
- message = <<~MSG
27
- Invalid filter!
28
- #{filter.inspect}
29
- Verify it's either a valid native filter or is registered with Fmt.
30
- Example: Fmt.add_filter(:#{filter.name}, &block)
31
- #{error.message}
25
+ rescue
26
+ raise Fmt::Error, <<~MSG
27
+ Invalid filter! #{filter.inspect}
28
+ Verify it has been properly registered. SEE: Fmt.add_filter(:#{filter.name}, &block)
32
29
  MSG
33
- raise Fmt::Error, message
34
30
  end
35
31
  elsif filter.proc?
36
32
  begin
37
33
  replacement = filter.value.call(replacement)
38
34
  rescue => error
39
- message = <<~MSG
40
- Error in filter!
41
- #{filter.inspect}
35
+ raise Fmt::Error, <<~MSG
36
+ Error in filter! #{filter.inspect}
42
37
  #{error.message}
43
38
  MSG
44
- raise Fmt::Error, message
45
39
  end
46
40
  end
47
41
  end
data/lib/fmt/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Fmt
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
data/lib/fmt.rb CHANGED
@@ -15,11 +15,13 @@ module Fmt
15
15
  formatter.filters
16
16
  end
17
17
 
18
- def add_filter(...)
19
- formatter.filters.add(...)
18
+ def add_rainbow_filters
19
+ formatter.add_rainbow_filters
20
20
  end
21
21
 
22
- alias_method :add, :add_filter
22
+ def add_filter(...)
23
+ formatter.add_filter(...)
24
+ end
23
25
  end
24
26
  end
25
27
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fmt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nate Hopkins (hopsoft)
@@ -161,7 +161,9 @@ files:
161
161
  - lib/fmt.rb
162
162
  - lib/fmt/embed.rb
163
163
  - lib/fmt/filter.rb
164
- - lib/fmt/filters.rb
164
+ - lib/fmt/filter_groups/filter_group.rb
165
+ - lib/fmt/filter_groups/rainbow_filter_group.rb
166
+ - lib/fmt/filter_groups/string_filter_group.rb
165
167
  - lib/fmt/formatter.rb
166
168
  - lib/fmt/scanners.rb
167
169
  - lib/fmt/scanners/base_scanner.rb
data/lib/fmt/filters.rb DELETED
@@ -1,76 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "monitor"
4
- require_relative "filter"
5
-
6
- module Fmt
7
- class Filters
8
- include Enumerable
9
- include MonitorMixin
10
-
11
- NATIVE_FILTERS = %i[
12
- capitalize
13
- chomp
14
- chop
15
- downcase
16
- lstrip
17
- reverse
18
- rstrip
19
- shellescape
20
- strip
21
- succ
22
- swapcase
23
- undump
24
- unicode_normalize
25
- upcase
26
- ]
27
-
28
- def initialize
29
- super
30
- @entries = {}
31
-
32
- NATIVE_FILTERS.each do |name|
33
- add(name) { |str| str.then(&:"#{name}") }
34
- end
35
-
36
- if defined? Rainbow
37
- begin
38
- Rainbow::Presenter.public_instance_methods(false).each do |name|
39
- next unless Rainbow::Presenter.public_instance_method(name).arity == 0
40
- add(name) { |str| Rainbow(str).public_send(name) }
41
- end
42
-
43
- Rainbow::X11ColorNames::NAMES.keys.each do |name|
44
- add(name) { |str| Rainbow(str).public_send(name) }
45
- end
46
- rescue => error
47
- puts "Error adding Rainbow filters! #{error.inspect}"
48
- end
49
- end
50
- end
51
-
52
- def each(&block)
53
- entries.each(&block)
54
- end
55
-
56
- def add(name, filter = nil, &block)
57
- raise ArgumentError, "filter and block are mutually exclusive" if filter && block
58
- raise ArgumentError, "filter must be a Proc" unless block || filter.is_a?(Proc)
59
- entries[name.to_sym] = Filter.new(name, filter || block)
60
- end
61
-
62
- alias_method :<<, :add
63
-
64
- def [](name)
65
- synchronize { entries[name.to_sym] }
66
- end
67
-
68
- def fetch(name, default = nil)
69
- synchronize { entries.fetch name.to_sym, default }
70
- end
71
-
72
- private
73
-
74
- attr_reader :entries
75
- end
76
- end