strings 0.1.5 → 0.2.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: 59762ac60270a0fa21a1989b6ec1bf8b98eac632fc9ff8c091ef7dd711a8baf8
4
- data.tar.gz: 43276937aaef5a75cb43e8e29a6ea9f5f09b4488d22a84a03fa128de07840afb
3
+ metadata.gz: 763d67f8c555aab9f45587b8596a66f75d751b965fcf2782b1920bf5d5b97f6b
4
+ data.tar.gz: a894e46873337664f6a35863a6bffdbaa1603d1f9ddcacf448de9841226a43e8
5
5
  SHA512:
6
- metadata.gz: 29244946de99fa208749f9ca7f88010b70b466f0d29583f76b9b982b9b299a69b14a1f76a43cd537f46e758f2f7e3e40f057d6506650b67fcd84d6e788f127c0
7
- data.tar.gz: 6d8b306a59eaafb78308e293739dadaaded471ef2a97daffc3cf31681a490df05067845600faed4b2fdcf390aa307016934f07751a7d3aa5c5fff49363162812
6
+ metadata.gz: eddc0eb59fcf78d5d5c9d84246821cbf9559387d6c94f090bea855ec4928bb8648b464832c97b3c442b3a51748d41a51fc304fc4d5a38440d3889b4924e5ad65
7
+ data.tar.gz: 711fe7e35fa2c893a5e94f98e47674a16fc5e814c67d941101bead1e03d076ac6bf38e8e17a579c3a3353a3b30518214537fea040b45d7a149cd597d6a31134b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,40 @@
1
1
  # Change log
2
2
 
3
+ ## [v0.2.1] - 2021-03-09
4
+
5
+ ### Changed
6
+ * Change to relax unicode-display_width version constraint to allow 2.0 release
7
+
8
+ ## [v0.2.0] - 2020-08-11
9
+
10
+ ### Changed
11
+ * Change String#wrap to preserve newline character breaks
12
+ * Change gemspec to remove test artefacts and bundler dev dependency
13
+ * Change gemspec to require Ruby >= 2.0.0
14
+
15
+ ## [v0.1.8] - 2019-11-24
16
+
17
+ ### Fixed
18
+ * Fix Ruby 2.7 warnings by Ryan Davis(@zenspider)
19
+
20
+ ## [v0.1.7] - 2019-11-14
21
+
22
+ ### Added
23
+ * Add metadata to gemspec
24
+
25
+ ### Fixed
26
+ * Fix Truncate#truncate to accept length of 1 by Katelyn Schiesser(@slowbro)
27
+
28
+ ## [v0.1.6] - 2019-08-28
29
+
30
+ ### Changed
31
+ * Change Wrap#wrap, Align#align & Pad#pad to handle different line endings
32
+ * Change Pad#pad to pad empty lines
33
+
34
+ ### Fixed
35
+ * Fix Wrap#wrap to handle adjacent ANSI codes
36
+ * Fix Wrap#insert_ansi to handle nested ANSI codes
37
+
3
38
  ## [v0.1.5] - 2019-03-29
4
39
 
5
40
  ### Changed
@@ -30,6 +65,11 @@
30
65
 
31
66
  * Initial implementation and release
32
67
 
68
+ [v0.2.1]: https://github.com/piotrmurach/strings/compare/v0.2.0...v0.2.1
69
+ [v0.2.0]: https://github.com/piotrmurach/strings/compare/v0.1.8...v0.2.0
70
+ [v0.1.8]: https://github.com/piotrmurach/strings/compare/v0.1.7...v0.1.8
71
+ [v0.1.7]: https://github.com/piotrmurach/strings/compare/v0.1.6...v0.1.7
72
+ [v0.1.6]: https://github.com/piotrmurach/strings/compare/v0.1.5...v0.1.6
33
73
  [v0.1.5]: https://github.com/piotrmurach/strings/compare/v0.1.4...v0.1.5
34
74
  [v0.1.4]: https://github.com/piotrmurach/strings/compare/v0.1.3...v0.1.4
35
75
  [v0.1.3]: https://github.com/piotrmurach/strings/compare/v0.1.2...v0.1.3
data/README.md CHANGED
@@ -1,24 +1,24 @@
1
1
  <div align="center">
2
- <img width="225" src="https://cdn.rawgit.com/piotrmurach/strings/master/assets/strings_logo.png" alt="strings logo" />
2
+ <img width="225" src="https://github.com/piotrmurach/strings/blob/master/assets/strings_logo.png" alt="strings logo" />
3
3
  </div>
4
4
 
5
5
  # Strings
6
6
 
7
7
  [![Gem Version](https://badge.fury.io/rb/strings.svg)][gem]
8
- [![Build Status](https://secure.travis-ci.org/piotrmurach/strings.svg?branch=master)][travis]
8
+ [![Actions CI](https://github.com/piotrmurach/strings/workflows/CI/badge.svg?branch=master)][gh_actions_ci]
9
9
  [![Build status](https://ci.appveyor.com/api/projects/status/e11tn1fgjwnfwp3r?svg=true)][appveyor]
10
10
  [![Maintainability](https://api.codeclimate.com/v1/badges/4ca50e480f42af80678e/maintainability)][codeclimate]
11
11
  [![Coverage Status](https://coveralls.io/repos/github/piotrmurach/strings/badge.svg?branch=master)][coverage]
12
12
  [![Inline docs](http://inch-ci.org/github/piotrmurach/strings.svg?branch=master)][inchpages]
13
13
 
14
14
  [gem]: http://badge.fury.io/rb/strings
15
- [travis]: http://travis-ci.org/piotrmurach/strings
15
+ [gh_actions_ci]: https://github.com/piotrmurach/strings/actions?query=workflow%3ACI
16
16
  [appveyor]: https://ci.appveyor.com/project/piotrmurach/strings
17
17
  [codeclimate]: https://codeclimate.com/github/piotrmurach/strings/maintainability
18
18
  [coverage]: https://coveralls.io/github/piotrmurach/strings?branch=master
19
19
  [inchpages]: http://inch-ci.org/github/piotrmurach/strings
20
20
 
21
- > The `Strings` is a set of useful functions such as fold, truncate, wrap, and many more for transforming strings.
21
+ > A set of useful methods for working with strings such as align, truncate, wrap, and many more.
22
22
 
23
23
  ## Installation
24
24
 
@@ -43,6 +43,7 @@ Or install it yourself as:
43
43
  * Supports multibyte character encodings such as UTF-8, EUC-JP
44
44
  * Handles languages without white-spaces between words (like Chinese and Japanese)
45
45
  * Supports ANSI escape codes
46
+ * Flexible by nature, split into [components](#4-components)
46
47
 
47
48
  ## Contents
48
49
 
@@ -56,7 +57,7 @@ Or install it yourself as:
56
57
  * [2.6 truncate](#26-truncate)
57
58
  * [2.7 wrap](#27-wrap)
58
59
  * [3. Extending String class](#3-extending-string-class)
59
- * [4. Utilities](#4-utilities)
60
+ * [4. Components](#4-components)
60
61
 
61
62
  ## 1. Usage
62
63
 
@@ -260,7 +261,7 @@ Strings::Truncate.truncate(text, 20) # => "for there is no fol…"
260
261
  If you want to split words on their boundaries use `:separator` option:
261
262
 
262
263
  ```ruby
263
- Strings.truncate(text, 20) # => "for there is no…"
264
+ Strings.truncate(text, 20, separator: ' ') # => "for there is no…"
264
265
  ```
265
266
 
266
267
  Use `:trailing` option (by default `…`) to provide omission characters:
@@ -292,7 +293,7 @@ To wrap text into lines no longer than `wrap_at` argument length, the `wrap` met
292
293
  Given the following text:
293
294
 
294
295
  ```ruby
295
- text "Think not, is my eleventh commandment; and sleep when you can, is my twelfth."
296
+ text = "Think not, is my eleventh commandment; and sleep when you can, is my twelfth."
296
297
  ```
297
298
 
298
299
  Then to wrap the text to given length do:
@@ -368,13 +369,17 @@ require 'strings/extensions'
368
369
  using Strings::Extensions
369
370
  ```
370
371
 
371
- ## 4. Utilities
372
+ ## 4. Components
372
373
 
373
- **Strings** aims to be flexible and allow you to choose only the utilities that you need. Currently you can choose from:
374
+ **Strings** aims to be flexible and allow you to choose only the components that you need. Currently you can choose from:
374
375
 
375
- | Utility | Description | API docs |
376
+ | Component | Description | API docs |
376
377
  | ------------ | ----------- | -------- |
377
- | [strings-ansi](https://github.com/piotrmurach/strings-ansi) | Handle ANSI escape codes in strings. | [docs](http://www.rubydoc.info/gems/strings-ansi) |
378
+ | [strings-ansi](https://github.com/piotrmurach/strings-ansi) | Handle ANSI escape codes in strings. | [docs](https://www.rubydoc.info/gems/strings-ansi) |
379
+ | [strings-case](https://github.com/piotrmurach/strings-case) | Handle case transformations in strings. | [docs](https://www.rubydoc.info/gems/strings-case) |
380
+ | [strings-inflection](https://github.com/piotrmurach/strings-inflection) | Inflects English nouns and verbs. | [docs](https://www.rubydoc.info/gems/strings-inflection) |
381
+ | [strings-numeral](https://github.com/piotrmurach/strings-numeral) | Express numbers as word numerals. | [docs](https://www.rubydoc.info/gems/strings-numeral) |
382
+ | [strings-truncation](https://github.com/piotrmurach/strings-truncation) | Truncate strings with fullwidth characters and ANSI codes. | [docs](https://www.rubydoc.info/gems/strings-truncation) |
378
383
 
379
384
  ## Development
380
385
 
@@ -386,7 +391,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
386
391
 
387
392
  Bug reports and pull requests are welcome on GitHub at https://github.com/piotrmurach/strings. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
388
393
 
389
- 1. Fork it ( https://github.com/piotrmurach/verse/fork )
394
+ 1. Fork it ( https://github.com/piotrmurach/strings/fork )
390
395
  2. Create your feature branch (`git checkout -b my-new-feature`)
391
396
  3. Commit your changes (`git commit -am 'Add some feature'`)
392
397
  4. Push to the branch (`git push origin my-new-feature`)
data/lib/strings.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'strings-ansi'
3
+ require "strings-ansi"
4
4
 
5
- require_relative 'strings/align'
6
- require_relative 'strings/fold'
7
- require_relative 'strings/pad'
8
- require_relative 'strings/truncate'
9
- require_relative 'strings/wrap'
10
- require_relative 'strings/version'
5
+ require_relative "strings/align"
6
+ require_relative "strings/fold"
7
+ require_relative "strings/pad"
8
+ require_relative "strings/truncate"
9
+ require_relative "strings/wrap"
10
+ require_relative "strings/version"
11
11
 
12
12
  module Strings
13
13
  # Align text within the width.
@@ -15,8 +15,8 @@ module Strings
15
15
  # @see Strings::Align#align
16
16
  #
17
17
  # @api public
18
- def align(*args)
19
- Align.align(*args)
18
+ def align(*args, **kws)
19
+ Align.align(*args, **kws)
20
20
  end
21
21
  module_function :align
22
22
 
data/lib/strings/align.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'strings-ansi'
4
- require 'unicode/display_width'
3
+ require "strings-ansi"
4
+ require "unicode/display_width"
5
5
 
6
6
  module Strings
7
7
  # Responsible for text alignment
8
8
  module Align
9
- NEWLINE = "\n".freeze
10
-
11
- SPACE = ' '.freeze
9
+ NEWLINE = "\n"
10
+ SPACE = " "
11
+ LINE_BREAK = %r{\r\n|\r|\n}.freeze
12
12
 
13
13
  # Aligns text within the width.
14
14
  #
@@ -23,23 +23,24 @@ module Strings
23
23
  # @example
24
24
  # text = "the madness of men"
25
25
  #
26
- # Strings::Align.align(22, :left)
26
+ # Strings::Align.align(text, 22, direction: :left)
27
27
  # # => "the madness of men "
28
28
  #
29
- # Strings::Align.align(22, :center)
29
+ # Strings::Align.align(text, 22, direction: :center)
30
30
  # # => " the madness of men "
31
31
  #
32
- # Strings::Align(22, :right)
32
+ # Strings::Align(text, 22, direction: :right)
33
33
  # # => " the madness of men"
34
34
  #
35
- # Strings::Align.align(22, :center, fill: '*)
35
+ # Strings::Align.align(text, 22, direction: :center, fill: "*")
36
36
  # # => "***the madness of men***"
37
37
  #
38
38
  # @api public
39
39
  def align(text, width, direction: :left, **options)
40
40
  return text if width.nil?
41
+
41
42
  method = to_alignment(direction)
42
- send(method, text, width, options)
43
+ send(method, text, width, **options)
43
44
  end
44
45
  module_function :align
45
46
 
@@ -62,9 +63,11 @@ module Strings
62
63
  # @return [String]
63
64
  #
64
65
  # @api public
65
- def align_left(text, width, fill: SPACE, separator: NEWLINE)
66
+ def align_left(text, width, fill: SPACE, separator: nil)
66
67
  return if width.nil?
67
- each_line(text, separator) do |line|
68
+ sep = separator || text[LINE_BREAK] || NEWLINE
69
+
70
+ each_line(text, sep) do |line|
68
71
  width_diff = width - display_width(line)
69
72
  if width_diff > 0
70
73
  line + fill * width_diff
@@ -80,9 +83,11 @@ module Strings
80
83
  # @return [String]
81
84
  #
82
85
  # @api public
83
- def align_center(text, width, fill: SPACE, separator: NEWLINE)
86
+ def align_center(text, width, fill: SPACE, separator: nil)
84
87
  return text if width.nil?
85
- each_line(text, separator) do |line|
88
+ sep = separator || text[LINE_BREAK] || NEWLINE
89
+
90
+ each_line(text, sep) do |line|
86
91
  width_diff = width - display_width(line)
87
92
  if width_diff > 0
88
93
  right_count = (width_diff.to_f / 2).ceil
@@ -100,9 +105,11 @@ module Strings
100
105
  # @return [String]
101
106
  #
102
107
  # @api public
103
- def align_right(text, width, fill: SPACE, separator: NEWLINE)
108
+ def align_right(text, width, fill: SPACE, separator: nil)
104
109
  return text if width.nil?
105
- each_line(text, separator) do |line|
110
+ sep = separator || text[LINE_BREAK] || NEWLINE
111
+
112
+ each_line(text, sep) do |line|
106
113
  width_diff = width - display_width(line)
107
114
  if width_diff > 0
108
115
  fill * width_diff + line
@@ -1,20 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../strings'
3
+ require_relative "../strings"
4
4
 
5
5
  module Strings
6
6
  module Extensions
7
7
  refine String do
8
- def align(*args)
9
- Align.align(self, *args)
8
+ def align(*args, **kws)
9
+ Align.align(self, *args, **kws)
10
10
  end
11
11
 
12
- def align_left(*args)
13
- Align.align_left(self, *args)
12
+ def align_left(*args, **kws)
13
+ Align.align_left(self, *args, **kws)
14
14
  end
15
15
 
16
- def align_right(*args)
17
- Align.align_right(self, *args)
16
+ def align_center(*args, **kws)
17
+ Align.align_center(self, *args, **kws)
18
+ end
19
+
20
+ def align_right(*args, **kws)
21
+ Align.align_right(self, *args, **kws)
18
22
  end
19
23
 
20
24
  def ansi?
@@ -25,8 +29,8 @@ module Strings
25
29
  Fold.fold(self, *args)
26
30
  end
27
31
 
28
- def pad(*args)
29
- Pad.pad(self, *args)
32
+ def pad(*args, **kws)
33
+ Pad.pad(self, *args, **kws)
30
34
  end
31
35
 
32
36
  def sanitize
@@ -37,8 +41,8 @@ module Strings
37
41
  Truncate.truncate(self, *args)
38
42
  end
39
43
 
40
- def wrap(*args)
41
- Wrap.wrap(self, *args)
44
+ def wrap(*args, **kws)
45
+ Wrap.wrap(self, *args, **kws)
42
46
  end
43
47
  end
44
48
  end # Extensions
data/lib/strings/fold.rb CHANGED
@@ -7,7 +7,7 @@ module Strings
7
7
  # Fold a multiline text into a single line string
8
8
  #
9
9
  # @example
10
- # fold("\tfoo \r\n\n bar") # => "foo bar"
10
+ # fold("\tfoo \r\n\n bar") # => " foo bar"
11
11
  #
12
12
  # @param [String] text
13
13
  #
@@ -20,7 +20,7 @@ module Strings
20
20
  def fold(text, separator = LINE_BREAK)
21
21
  text.gsub(/([ ]+)#{separator}/, "\\1")
22
22
  .gsub(/#{separator}(?<space>[ ]+)/, "\\k<space>")
23
- .gsub(/#{separator}/, ' ')
23
+ .gsub(/#{separator}/, " ")
24
24
  end
25
25
  module_function :fold
26
26
  end # Fold
data/lib/strings/pad.rb CHANGED
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'strings-ansi'
4
- require 'unicode/display_width'
3
+ require "strings-ansi"
4
+ require "unicode/display_width"
5
5
 
6
- require_relative 'padder'
6
+ require_relative "padder"
7
7
 
8
8
  module Strings
9
9
  # Responsible for text padding
10
10
  module Pad
11
- NEWLINE = "\n".freeze
12
-
13
- SPACE = ' '.freeze
11
+ NEWLINE = "\n"
12
+ SPACE = " "
13
+ LINE_BREAK = %r{\r\n|\r|\n}.freeze
14
14
 
15
15
  # Apply padding to multiline text with ANSI codes
16
16
  #
@@ -31,10 +31,11 @@ module Strings
31
31
  # @return [String]
32
32
  #
33
33
  # @api private
34
- def pad(text, padding, fill: SPACE, separator: NEWLINE)
34
+ def pad(text, padding, fill: SPACE, separator: nil)
35
35
  padding = Strings::Padder.parse(padding)
36
36
  text_copy = text.dup
37
- line_width = max_line_length(text, separator)
37
+ sep = separator || text[LINE_BREAK] || NEWLINE
38
+ line_width = max_line_length(text, sep)
38
39
  output = []
39
40
 
40
41
  filler_line = fill * line_width
@@ -43,7 +44,8 @@ module Strings
43
44
  output << pad_around(filler_line, padding, fill: fill)
44
45
  end
45
46
 
46
- text_copy.split(separator).each do |line|
47
+ text_copy.split(sep).each do |line|
48
+ line = line.empty? ? filler_line : line
47
49
  output << pad_around(line, padding, fill: fill)
48
50
  end
49
51
 
@@ -51,7 +53,7 @@ module Strings
51
53
  output << pad_around(filler_line, padding, fill: fill)
52
54
  end
53
55
 
54
- output.join(separator)
56
+ output.join(sep)
55
57
  end
56
58
  module_function :pad
57
59
 
@@ -77,7 +79,7 @@ module Strings
77
79
  # @api private
78
80
  def max_line_length(text, separator)
79
81
  lines = text.split(separator, -1)
80
- display_width(lines.max_by { |line| display_width(line) } || '')
82
+ display_width(lines.max_by { |line| display_width(line) } || "")
81
83
  end
82
84
  module_function :max_line_length
83
85
 
@@ -1,4 +1,4 @@
1
- # frozen_string_litera: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Strings
4
4
  # A class responsible for parsing padding value
@@ -45,7 +45,7 @@ module Strings
45
45
  elsif value.size == 4
46
46
  value
47
47
  else
48
- raise ParseError, 'Wrong :padding parameter, must be an array'
48
+ raise ParseError, "Wrong :padding parameter, must be an array"
49
49
  end
50
50
  end
51
51
 
@@ -72,7 +72,7 @@ module Strings
72
72
 
73
73
  # Set top padding
74
74
  #
75
- # @param [Integer] val
75
+ # @param [Integer] value
76
76
  #
77
77
  # @return [nil]
78
78
  #
@@ -92,7 +92,7 @@ module Strings
92
92
 
93
93
  # Set right padding
94
94
  #
95
- # @param [Integer] val
95
+ # @param [Integer] value
96
96
  #
97
97
  # @api public
98
98
  def right=(value)