fmt 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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: []