terminal-layout 0.1.0 → 0.1.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
  SHA1:
3
- metadata.gz: 283b397c0181527c2ded64f2865ebc71ede5aac9
4
- data.tar.gz: adb2c56149641dcd9322173e512be240e1b6eca2
3
+ metadata.gz: 69a8c9c2bf542621e42aaefcd221d552b507a333
4
+ data.tar.gz: 029d171fa3c85d36edd1312e6a1ba45b1f77c4b6
5
5
  SHA512:
6
- metadata.gz: 5b2b2c1eb88264c1084e879cdef933a5115edf521ca0288a3b3d594ce360a1155429847af7fe52a791d222c94885f89d75d3890e96477164f26f84880dbbd4f5
7
- data.tar.gz: f28f73e2b8c7aa43bfab59f807103194096e621dee8e05a593ad1b99a1db9c4d2cfe24331f6f4897c960b522ea3b08e7524ccac4b77d574900a640493ff75314
6
+ metadata.gz: ad0a729599af474de93c42ef4b704b326514e7515e703a1377f583b6e018185de12c0bcb87fe26dd323bf1ddb70f2429c0f4f19230737d26aff56117cfd6ee73
7
+ data.tar.gz: 69d6c4ca7dac9d55941bf94404b780fdc07e8918363dc3b8b5b7124fcba9b82644d986ad249bffbd4d92526b56e807359da21ccf3a5f3135baa84ce530e0cbed
data/lib/ansi_string.rb CHANGED
@@ -36,8 +36,14 @@ class ANSIString
36
36
  # convert numeric position to a range
37
37
  range = (range..range) if range.is_a?(Integer)
38
38
 
39
- text = @without_ansi[range]
40
- process_string replace_in_string(range, replacement_str)
39
+ range_begin = range.begin
40
+ range_end = range.exclude_end? ? range.end - 1 : range.end
41
+
42
+ range_begin = @without_ansi.length - range.begin.abs if range.begin < 0
43
+ range_end = @without_ansi.length - range.end.abs if range.end < 0
44
+
45
+ updated_string = replace_in_string(range_begin..range_end, replacement_str)
46
+ process_string raw_string_for(updated_string)
41
47
  self
42
48
  end
43
49
 
@@ -55,6 +61,11 @@ class ANSIString
55
61
  @without_ansi.rindex(*args)
56
62
  end
57
63
 
64
+ def replace(str)
65
+ process_string raw_string_for(str)
66
+ self
67
+ end
68
+
58
69
  def reverse
59
70
  str = @ansi_sequence_locations.reverse.map do |location|
60
71
  [location[:start_ansi_sequence], location[:text].reverse, location[:end_ansi_sequence]].join
@@ -88,6 +99,10 @@ class ANSIString
88
99
  raw.split(*args).map { |s| ANSIString.new(s) }
89
100
  end
90
101
 
102
+ def strip
103
+ ANSIString.new raw.strip
104
+ end
105
+
91
106
  def length
92
107
  @without_ansi.length
93
108
  end
@@ -218,7 +233,6 @@ class ANSIString
218
233
 
219
234
  range = range.begin..(range.end - 1) if range.exclude_end?
220
235
  str = ""
221
-
222
236
  @ansi_sequence_locations.each_with_index do |location, j|
223
237
  # If the given range encompasses part of the location, then we want to
224
238
  # include the whole location
@@ -255,9 +269,9 @@ class ANSIString
255
269
  str << [
256
270
  location[:start_ansi_sequence],
257
271
  location[:text][location[:begins_at]...(location[:begins_at]+start_index)],
258
- location[:end_ansi_sequence],
259
- replacement_str.to_s,
272
+ replacement_str,
260
273
  location[:text][end_index..-1],
274
+ location[:end_ansi_sequence],
261
275
  ].join
262
276
 
263
277
  if location=@ansi_sequence_locations[j+1]
@@ -219,6 +219,20 @@ describe 'ANSIString' do
219
219
  expect(ansi_string).to eq ANSIString.new(blue("tZYXs is blue"))
220
220
  end
221
221
 
222
+ it "supports replacing with negative indexes at the front of the string" do
223
+ ansi_string[0..-1] = "abc"
224
+ expect(ansi_string).to eq ANSIString.new(blue("abc"))
225
+ end
226
+
227
+ it "supports replacing with negative indexes in the middle of the string" do
228
+ ansi_string = ANSIString.new(blue("abc"))
229
+ ansi_string[1..-2] = red("*")
230
+
231
+ # Do not preserve reset sequences (e.g. "\e[0m") when inserting/replacing.
232
+ # So no \e[0m before the replacement '*'
233
+ expect(ansi_string).to eq ANSIString.new("\e[34ma\e[31m*\e[0mc\e[0m")
234
+ end
235
+
222
236
  it "preserves coloring when part of the text with a String" do
223
237
  ansi_string[0..3] = "that"
224
238
  expect(ansi_string).to eq ANSIString.new(blue("that is blue"))
@@ -270,10 +284,43 @@ describe 'ANSIString' do
270
284
  context "replacing a substring that goes across ANSI sequence boundaries" do
271
285
  subject(:ansi_string){ ANSIString.new "this#{blue('that')}" }
272
286
 
273
- it "successfully moves the boundaries" do
287
+ it "moves the boundaries when using positive indexes and a regular String replacement" do
274
288
  ansi_string[3..4] = yellow("SORRY")
275
289
  expect(ansi_string).to eq ANSIString.new("thi#{yellow('SORRY')}#{blue('hat')}")
276
290
  end
291
+
292
+ it "moves the boundaries when using positive indexes and an ANSIString replacement" do
293
+ ansi_string[3..4] = yellow("SORRY")
294
+ expect(ansi_string).to eq ANSIString.new("thi#{yellow('SORRY')}#{blue('hat')}")
295
+ end
296
+
297
+ it "moves the boundaries when using negatives indexes and a regular String replacement" do
298
+ ansi_string[-5..4] = "SORRY"
299
+ expect(ansi_string).to eq ANSIString.new("thiSORRY#{blue('hat')}")
300
+ end
301
+
302
+ it "moves the boundaries when using negatives indexes and an ANSIString replacement" do
303
+ ansi_string[-5..4] = yellow("SORRY")
304
+ expect(ansi_string).to eq ANSIString.new("thi#{yellow('SORRY')}#{blue('hat')}")
305
+ end
306
+ end
307
+
308
+ context "clearing the string" do
309
+ subject(:ansi_string){ ANSIString.new "this\nthat" }
310
+
311
+ it "clears the string" do
312
+ ansi_string[0..-1] = ""
313
+ expect(ansi_string).to eq ANSIString.new("")
314
+ end
315
+ end
316
+
317
+ context "expanding a string" do
318
+ subject(:ansi_string){ ANSIString.new "" }
319
+
320
+ it "expands the string" do
321
+ ansi_string[0..-1] = ANSIString.new(blue("HI"))
322
+ expect(ansi_string).to eq ANSIString.new(blue("HI"))
323
+ end
277
324
  end
278
325
 
279
326
  it "raises an error out of index" do
@@ -365,6 +412,15 @@ describe 'ANSIString' do
365
412
  end
366
413
  end
367
414
 
415
+ describe "#replace" do
416
+ it "replaces the contents of the current string with the new string" do
417
+ ansi_string = ANSIString.new("abc")
418
+ original_object_id = ansi_string.object_id
419
+ expect(ansi_string.replace("def")).to eq ANSIString.new("def")
420
+ expect(ansi_string.object_id).to eq(original_object_id)
421
+ end
422
+ end
423
+
368
424
  describe "#reverse" do
369
425
  it "reverses the string" do
370
426
  ansi_string = ANSIString.new("abc")
@@ -463,6 +519,14 @@ describe 'ANSIString' do
463
519
  end
464
520
  end
465
521
 
522
+ describe "#strip" do
523
+ it 'returns a copy of the string with leading and trailing whitespace removed' do
524
+ ansi_string = ANSIString.new " this is his #{blue('pig')} "
525
+ expect(ansi_string.strip).to eq ANSIString.new "this is his #{blue('pig')}"
526
+ expect(ansi_string).to eq ANSIString.new " this is his #{blue('pig')} "
527
+ end
528
+ end
529
+
466
530
  describe "#sub" do
467
531
  subject(:ansi_string){ ANSIString.new blue(string) }
468
532
  let(:string){ "this is blue" }
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "terminal-layout"
7
- spec.version = "0.1.0"
7
+ spec.version = "0.1.1"
8
8
  spec.authors = ["Zach Dennis"]
9
9
  spec.email = ["zach.dennis@gmail.com"]
10
10
  spec.summary = %q{A terminal layout manager}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terminal-layout
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zach Dennis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-13 00:00:00.000000000 Z
11
+ date: 2015-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-terminfo