fmt 0.3.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c91008418cc9c29be346581fda313f6a498203899c932480187bb9f70bf4fb3f
4
- data.tar.gz: 77925da927d90b09fdba3edcd595dc392f43286d4e8468792038bd1f57242cd7
3
+ metadata.gz: 67c0fef310f41def1104325bdcf64e0e74c00be1c491bde56e8dd18f93121711
4
+ data.tar.gz: fa7af34e9c94c03ebbd28d4843a0c268fe63304cd95bfde0c0b7cbca7d550916
5
5
  SHA512:
6
- metadata.gz: 7c440974ee5dcf7a3ef53cbbccf021f4011890f9f2d279e91aa9affb08f9032b034d9e39e3385b40a7e3988c399d0a96dff074581b8ac2ea037f081b6877fe0c
7
- data.tar.gz: f45953ec9a6095cdf98106ca5582a24631ff2262efef979c7e5cacbd0abaf686cd59a814aa217428e87d2064060e8b5af1aa5ec97b8d40124fab65e124841a84
6
+ metadata.gz: b04858bb8cab7de025a11ecf941e175a698559b231c1878bbdf9f5762dcb3eb05cd822ee50b11a0739aa21ee5077ea9a448ef75a0e790e0587c39403e33ca303
7
+ data.tar.gz: eb55994dbd819d698b626ea170b56dec4177c02742f8b50da3e1d182704c7ff78043e31aece819ec47762cf6ab4297236d0698e2d80c6b5a974e19632817bccd
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-1039-47d299.svg" />
3
+ <img alt="Lines of Code" src="https://img.shields.io/badge/loc-1042-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" />
@@ -13,66 +13,59 @@
13
13
  </a>
14
14
  </p>
15
15
 
16
- # Fmt: Your Friendly String Formatter
16
+ # CLI Templating System and String Formatter
17
17
 
18
- Welcome to Fmt, your go-to companion for Ruby string templating simple, versatile, and surprisingly powerful!
18
+ **Fmt** is a powerful and flexible templating system and string formatter for Ruby, designed to streamline the creation of command-line interfaces and enhance general-purpose string formatting.
19
19
 
20
20
  <!-- Tocer[start]: Auto-generated, don't remove. -->
21
21
 
22
22
  ## Table of Contents
23
23
 
24
- - [What's Fmt, and why should you care?](#whats-fmt-and-why-should-you-care)
25
- - [Getting Started: It's a Breeze!](#getting-started-its-a-breeze)
26
- - [Usage: Your Formatting Adventure Begins](#usage-your-formatting-adventure-begins)
27
- - [Macros: The Secret Sauce](#macros-the-secret-sauce)
28
- - [Pipelines: Unleashing the Power of Chained Macros](#pipelines-unleashing-the-power-of-chained-macros)
29
- - [Supported Methods: The Ultimate Answer to Formatting](#supported-methods-the-ultimate-answer-to-formatting)
30
- - [Rainbow GEM: The Color of Magic](#rainbow-gem-the-color-of-magic)
31
- - [Composition: The Art of the Template](#composition-the-art-of-the-template)
32
- - [Embedded Templates: Nesting with Infinite Possibilities](#embedded-templates-nesting-with-infinite-possibilities)
33
- - [Customizing Fmt: Create Your Own Extensions](#customizing-fmt-create-your-own-extensions)
34
- - [Performance: Fast Formatting](#performance-fast-formatting)
35
- - [Sponsors: Our Awesome Supporters](#sponsors-our-awesome-supporters)
24
+ - [Getting Started](#getting-started)
25
+ - [Usage](#usage)
26
+ - [Macros](#macros)
27
+ - [Pipelines](#pipelines)
28
+ - [Supported Methods](#supported-methods)
29
+ - [Rainbow GEM](#rainbow-gem)
30
+ - [Composition](#composition)
31
+ - [Embedded Templates](#embedded-templates)
32
+ - [Customizing Fmt](#customizing-fmt)
33
+ - [Kernel Refinement](#kernel-refinement)
34
+ - [`fmt(object, *pipeline)`](#fmtobject-pipeline)
35
+ - [`fmt_print(object, *pipeline)`](#fmt_printobject-pipeline)
36
+ - [`fmt_puts(object, *pipeline)`](#fmt_putsobject-pipeline)
37
+ - [Performance](#performance)
38
+ - [Sponsors](#sponsors)
36
39
 
37
40
  <!-- Tocer[finish]: Auto-generated, don't remove. -->
38
41
 
39
- ## What's Fmt, and why should you care?
42
+ ## Getting Started
40
43
 
41
- Fmt is a template engine that harnesses the raw power of Ruby's native string formatting mechanics. It's like having a universal translator for your strings, turning your formatting wishes into beautiful, functional output.
42
-
43
- - 🚀 Supercharge your general-purpose templating
44
- - 🎨 Craft CLI applications so beautiful, they'll make even the most stoic developer smile
45
- - 🧠 Intuitive enough for beginners, powerful enough for experts
46
-
47
- ## Getting Started: It's a Breeze!
48
-
49
- First, let's get you set up. It's easier than making a cup of coffee!
44
+ Install the required dependencies:
50
45
 
51
46
  ```sh
52
- bundle add rainbow # <- optional, but recommended for those who enjoy a splash of color
47
+ bundle add rainbow # <- optional, for color support
53
48
  bundle add fmt
54
49
  ```
55
50
 
56
- Then, in your Ruby file:
51
+ Then, require the necessary libraries in your Ruby file:
57
52
 
58
53
  ```ruby
59
- require "rainbow" # <- optional, but why not add some color to your life?
54
+ require "rainbow" # <- optional, for color support
60
55
  require "fmt"
61
56
  ```
62
57
 
63
- ## Usage: Your Formatting Adventure Begins
58
+ ## Usage
64
59
 
65
- Using Fmt is simpler than ordering takeout. Just create a string with Ruby's [format specifiers](https://ruby-doc.org/3.3.5/format_specifications_rdoc.html), much like you would for `sprintf`.
60
+ Fmt uses Ruby's native [format specifiers](https://ruby-doc.org/3.3.5/format_specifications_rdoc.html) to create templates:
66
61
 
67
- - `"%s"` - The classic
68
- - `"%{variable}"` - For when you're feeling descriptive
69
- - `"%<variable>s"` - When you want to be extra explicit
62
+ - `"%s"` - Standard format specifier
63
+ - `"%{variable}"` - Named format specifier
64
+ - `"%<variable>s"` - Named format specifier _(alternative syntax)_
70
65
 
71
- Remember, with Fmt, any string can be a template. It's like having a Swiss Army knife for text formatting!
66
+ ### Macros
72
67
 
73
- ### Macros: The Secret Sauce
74
-
75
- Formatting macros are what make Fmt special. Append them to your format specifiers like so:
68
+ Formatting macros are appended to format specifiers to modify the output:
76
69
 
77
70
  <!-- test_e798c3 -->
78
71
 
@@ -81,7 +74,7 @@ Fmt("%s|>capitalize", "hello world!") # => "Hello world!"
81
74
  Fmt("%{msg}|>capitalize", msg: "hello world!") # => "Hello world!"
82
75
  ```
83
76
 
84
- Macros can accept arguments.
77
+ Macros can accept arguments:
85
78
 
86
79
  <!-- test_1707d2 -->
87
80
 
@@ -90,9 +83,9 @@ Fmt("%s|>prepend('Hello ')", "world!") # => "Hello world!"
90
83
  Fmt("%{msg}|>prepend('Hello ')", msg: "world!") # => "Hello world!"
91
84
  ```
92
85
 
93
- ### Pipelines: Unleashing the Power of Chained Macros
86
+ ### Pipelines
94
87
 
95
- Macros can be chained to create a formatting pipeline.
88
+ Macros can be chained to create a formatting pipeline:
96
89
 
97
90
  <!-- test_425625 -->
98
91
 
@@ -101,10 +94,9 @@ Fmt("%s|>prepend('Hello ')|>ljust(32, '.')|>upcase", "world!") # => "HELLO WORLD
101
94
  Fmt("%{msg}|>prepend('Hello ')|>ljust(32, '.')|>upcase", msg: "world!") # => "HELLO WORLD!...................."
102
95
  ```
103
96
 
104
- > [!NOTE]
105
- > Pipelines are processed left to right. The return value from the preceeding macro is the starting value for the next macro.
97
+ Pipelines are processed left to right, with the return value from the preceding macro serving as the starting value for the next macro.
106
98
 
107
- Arguments and return values can be any type.
99
+ Arguments and return values can be of any type:
108
100
 
109
101
  <!-- test_f55ae2 -->
110
102
 
@@ -112,34 +104,17 @@ Arguments and return values can be any type.
112
104
  Fmt("%p|>partition(/:/)|>last|>delete_suffix('>')", Object.new) # => "0x000000011f33bc68"
113
105
  ```
114
106
 
115
- ### Supported Methods: The Ultimate Answer to Formatting
107
+ ### Supported Methods
116
108
 
117
- Most public instance methods on the following classes are supported.
109
+ Most public instance methods on the following classes are supported:
118
110
 
119
- - `Array`
120
- - `Date`
121
- - `DateTime`
122
- - `FalseClass`
123
- - `Float`
124
- - `Hash`
125
- - `Integer`
126
- - `NilClass`
127
- - `Range`
128
- - `Regexp`
129
- - `Set`
130
- - `StandardError`
131
- - `String`
132
- - `Struct`
133
- - `Symbol`
134
- - `Time`
135
- - `TrueClass`
111
+ `Array`, `Date`, `DateTime`, `FalseClass`, `Float`, `Hash`, `Integer`, `NilClass`, `Range`, `Regexp`, `Set`, `StandardError`, `String`, `Struct`, `Symbol`, `Time`, `TrueClass`
136
112
 
137
- > [!TIP]
138
- > If you're using libraries like ActiveSupport that extend these classes, extension methods will also available if the library is required before Fmt.
113
+ Extension methods from libraries like ActiveSupport will also be available if the library is required before Fmt.
139
114
 
140
- #### Rainbow GEM: The Color of Magic
115
+ #### Rainbow GEM
141
116
 
142
- Color and style support is available if your project includes the [Rainbow GEM](https://github.com/ku1ik/rainbow).
117
+ Color and style support is available if your project includes the [Rainbow GEM](https://github.com/ku1ik/rainbow):
143
118
 
144
119
  <!-- test_19c8ca -->
145
120
 
@@ -149,11 +124,9 @@ Fmt(template, msg: "Hello World!")
149
124
  #=> "\e[36m\e[1m\e[4mHello World!\e[0m"
150
125
  ```
151
126
 
152
- ### Composition: The Art of the Template
153
-
154
- You can mix and match macros that target any type within a pipeline.
127
+ ### Composition
155
128
 
156
- Templates can also include multiple format strings with their own distinct pipelines.
129
+ Templates can include multiple format strings with distinct pipelines:
157
130
 
158
131
  <!-- test_0dbfcd -->
159
132
 
@@ -163,9 +136,9 @@ Fmt(template, date: Time.now, msg: "this is cool")
163
136
  #=> "Date: \e[35m2024-09-20\e[0m \e[1mThis Is Cool\e[0m"
164
137
  ```
165
138
 
166
- #### Embedded Templates: Nesting with Infinite Possibilities
139
+ #### Embedded Templates
167
140
 
168
- Embedded templates can be nested within other templates... as deep as needed!
141
+ Embedded templates can be nested within other templates:
169
142
 
170
143
  <!-- test_efee7a -->
171
144
 
@@ -175,7 +148,7 @@ Fmt(template, msg: "Look Ma...", embed: "I'm embedded!")
175
148
  #=> "\e[2mLook Ma...\e[0m \e[1mI'm embedded!\e[0m"
176
149
  ```
177
150
 
178
- Embeds can also have their own distinct pipelines.
151
+ Embeds can have their own pipelines:
179
152
 
180
153
  <!-- test_abb7ea -->
181
154
 
@@ -185,7 +158,7 @@ Fmt(template, msg: "Look Ma...", embed: "I'm embedded!")
185
158
  #=> "\e[2mLook Ma...\e[0m \e[1m\e[4mI'm embedded!\e[0m"
186
159
  ```
187
160
 
188
- Embeds can be deeply nested.
161
+ Embeds can be deeply nested:
189
162
 
190
163
  <!-- test_79e924 -->
191
164
 
@@ -195,7 +168,7 @@ Fmt(template, msg: "Look Ma...", embed: "I'm embedded!", deep_embed: "And I'm de
195
168
  #=> "\e[2mLook Ma...\e[0m \e[1mI'm embedded!\e[0m \e[31m\e[1mAnd I'm deeply embedded!\e[0m"
196
169
  ```
197
170
 
198
- Embeds can also span multiple lines.
171
+ Embeds can also span multiple lines:
199
172
 
200
173
  <!-- test_054526 -->
201
174
 
@@ -212,9 +185,9 @@ Fmt(template, one: "Red", two: "Blue", three: "Green")
212
185
  #=> "Multiline:\n\e[31mRed\e[0m \e[1m\n \e[34mBlue\e[0m \n \e[32mGreen\e[0m"
213
186
  ```
214
187
 
215
- ### Customizing Fmt: Create Your Own Extensions
188
+ ### Customizing Fmt
216
189
 
217
- Want to add your own filters? It's easier than you might think:
190
+ Add custom filters by registering them with Fmt:
218
191
 
219
192
  <!-- test_2cacce -->
220
193
 
@@ -224,10 +197,7 @@ Fmt("%s|>shuffle", "This don't make no sense.")
224
197
  #=> "de.nnoTtsnh'oeek ssim a "
225
198
  ```
226
199
 
227
- You can also run a Ruby block with temporary filters if you don't want to officially register them.
228
-
229
- > [!TIP]
230
- > This also allows you to override existing filters for the duration of the block.
200
+ Run a Ruby block with temporary filters without officially registering them:
231
201
 
232
202
  <!-- test_7df4eb -->
233
203
 
@@ -241,20 +211,69 @@ Fmt("%s|>red", "This is original red!")
241
211
  #=> "\e[31mThis is original red!\e[0m"
242
212
  ```
243
213
 
244
- ## Performance: Fast Formatting
214
+ ## Kernel Refinement
215
+
216
+ Fmt provides a kernel refinement that adds convenient methods for formatting and outputting text directly. To use these methods, you need to enable the refinement in your code:
217
+
218
+ ```ruby
219
+ using Fmt::KernelRefinement
220
+ ```
221
+
222
+ Once enabled, you'll have access to the following methods:
223
+
224
+ ### `fmt(object, *pipeline)`
245
225
 
246
- Fmt isn't just pretty it's quick too!
226
+ This method formats an object using a different pipeline syntax:
227
+
228
+ ```ruby
229
+ fmt("Hello, World!", :bold) # => "\e[1mHello, World!\e[0m"
230
+ fmt(:hello, :underline) # => "\e[4mhello\e[0m"
231
+ fmt(Object.new, :red) # => "\e[31m#<Object:0x00007f9b8b0b0a08>\e[0m"
232
+ ```
233
+
234
+ ### `fmt_print(object, *pipeline)`
235
+
236
+ This method formats an object and prints it to STDOUT without a newline:
237
+
238
+ ```ruby
239
+ fmt_print("Hello, World!", :italic) # Prints: "\e[3mHello, World!\e[0m"
240
+ fmt_print(:hello, :green) # Prints: "\e[32mhello\e[0m"
241
+ ```
242
+
243
+ ### `fmt_puts(object, *pipeline)`
244
+
245
+ This method formats an object and prints it to STDOUT with a newline:
246
+
247
+ ```ruby
248
+ fmt_puts("Hello, World!", :bold, :underline) # Prints: "\e[1m\e[4mHello, World!\e[0m\n"
249
+ fmt_puts(:hello, :magenta) # Prints: "\e[35mhello\e[0m\n"
250
+ ```
251
+
252
+ These methods provide a convenient way to use Fmt's formatting capabilities directly in your code without explicitly calling the `Fmt` method.
253
+
254
+ You can pass any number of macros when using these methods:
255
+
256
+ ```ruby
257
+ fmt("Important!", :red, :bold, :underline)
258
+ # => "\e[31m\e[1m\e[4mImportant!\e[0m"
259
+
260
+ fmt_puts("Warning:", :yellow, :italic)
261
+ # Prints: "\e[33m\e[3mWarning:\e[0m\n"
262
+ ```
263
+
264
+ These kernel methods make it easy to integrate Fmt's powerful formatting capabilities into your command-line interfaces or any part of your Ruby application where you need to format and output text.
265
+
266
+ ## Performance
267
+
268
+ Fmt is optimized for performance:
247
269
 
248
270
  - Tokenization: Uses StringScanner and Ripper to parse and tokenize templates
249
271
  - Caching: Stores an Abstract Syntax Tree (AST) representation of each template, pipeline, and macro
250
- - Speed: Current benchmarks show an average pipeline execution time of **under <0.3 milliseconds**
251
-
252
- > [!NOTE]
253
- > While Fmt is optimized for performance, remember that complex pipelines might take a tad longer.
272
+ - Speed: Current benchmarks show an average pipeline execution time of under 0.3 milliseconds
254
273
 
255
- **Happy formatting!**
274
+ Complex pipelines may take slightly longer to execute.
256
275
 
257
- ## Sponsors: Our Awesome Supporters
276
+ ## Sponsors
258
277
 
259
278
  <p align="center">
260
279
  <em>Proudly sponsored by</em>
@@ -10,12 +10,7 @@ module Fmt
10
10
  # @rbs pipeline [Array[String | Symbol]] -- Fmt pipeline
11
11
  # @rbs return [String] -- formatted text
12
12
  def fmt(object, *pipeline)
13
- text = case object
14
- in String then object
15
- in Symbol then object.to_s
16
- else object.inspect
17
- end
18
- Fmt "%s|>to_s|>#{pipeline.join("|>")}", text
13
+ Fmt pipeline.prepend("%s").join(Sigils::PIPE_OPERATOR), object
19
14
  end
20
15
 
21
16
  # Formats an object with Fmt and prints to STDOUT
@@ -23,7 +18,7 @@ module Fmt
23
18
  # @rbs pipeline [Array[String | Symbol]] -- Fmt pipeline
24
19
  # @rbs return void
25
20
  def fmt_print(object, *pipeline)
26
- puts fmt(object, *pipeline)
21
+ print fmt(object, *pipeline)
27
22
  end
28
23
 
29
24
  # Formats an object with Fmt and puts to STDOUT
data/lib/fmt/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module Fmt
6
- VERSION = "0.3.0"
6
+ VERSION = "0.3.1"
7
7
  end
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.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nate Hopkins (hopsoft)
@@ -220,7 +220,7 @@ dependencies:
220
220
  - - ">="
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
- description: Pipeline driven template engine based on native Ruby String formatting
223
+ description: CLI Templating System and String Formatter
224
224
  email:
225
225
  - natehop@gmail.com
226
226
  executables: []
@@ -304,5 +304,5 @@ requirements: []
304
304
  rubygems_version: 3.5.16
305
305
  signing_key:
306
306
  specification_version: 4
307
- summary: Pipeline driven template engine based on native Ruby String formatting
307
+ summary: CLI Templating System and String Formatter
308
308
  test_files: []