yap-rawline 0.2.0 → 0.3.0

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: 27dea4694161e07942a1244b30298efd3c7473b5
4
- data.tar.gz: 483fbc976ef8fbb074aba07df0ade32d47b821b7
3
+ metadata.gz: be73e6267c8fe5f9ae5dd481a01bace695822a39
4
+ data.tar.gz: bc7d6f138c08f9fa7c182ddf4fad243a529992dc
5
5
  SHA512:
6
- metadata.gz: 757786ae22ee40296c746e29183b7cba37c0011422f97c21b0bc3efc5fa7b736d1e8686fa08534f23deafb7eda52bb448a566ee0e9c818b6c9efcf664a091122
7
- data.tar.gz: aa640a935bcbe38c9afe54b8a583a7441673eb879c5e98969e9b692126b9d5b49b6faa5289e6dc39bd7e4b6b9a8ac1ccceba70547f29bb755154d9e7c7721109
6
+ metadata.gz: e32e2906e69dd93fa0a68f10025f1e7396dbb4dbef59134459e8348c534390e71a3e6634331a3264517c71466f44035ec09aff0bbd6bf9867ff1dd9af22f0942
7
+ data.tar.gz: 935126f5ff9486c6a3bd4ac98b8a98313e4fc0de4817cb403276415fb9aba2130186c0d57891bcb9909c43f5fbed6f4df3f21edaa2963550190d10002b86ee02
@@ -38,7 +38,18 @@ module RawLine
38
38
  elsif bytes.map(&:ord) != @completion_char
39
39
  @done_proc.call(bytes)
40
40
  elsif @first_time
41
- matches = @completion_proc.call(sub_word, @line.text) unless !@completion_proc || @completion_proc == []
41
+ unless !@completion_proc || @completion_proc == []
42
+ word = @line.text[@line.word[:start]..@line.position-1] || ""
43
+ words = @line.text
44
+ .split(/\s+/)
45
+ .delete_if(&:empty?)
46
+ word_index = words.index(word)
47
+ matches = @completion_proc.call(
48
+ word,
49
+ words,
50
+ word_index
51
+ )
52
+ end
42
53
  matches = matches.to_a.compact.sort.reverse
43
54
 
44
55
  if matches.any?
@@ -64,12 +75,6 @@ module RawLine
64
75
  @completion_found_proc.call(completion: match, possible_completions: @completion_matches.reverse)
65
76
  end
66
77
  end
67
-
68
- private
69
-
70
- def sub_word
71
- @line.text[@line.word[:start]..@line.position-1] || ""
72
- end
73
78
  end
74
79
 
75
80
  end
@@ -41,9 +41,9 @@ module RawLine
41
41
  extend Forwardable
42
42
  include HighLine::SystemExtensions
43
43
 
44
- attr_accessor :char, :history_size, :line_history_size, :highlight_history_matching_text
45
- attr_accessor :terminal, :keys, :mode
46
- attr_accessor :completion_class, :completion_proc, :line, :history, :completion_append_string
44
+ attr_accessor :char
45
+ attr_accessor :terminal, :mode
46
+ attr_accessor :completion_proc, :line, :history
47
47
  attr_accessor :match_hidden_files
48
48
  attr_accessor :word_break_characters
49
49
  attr_accessor :dom
@@ -85,18 +85,42 @@ module RawLine
85
85
  )
86
86
  end
87
87
 
88
+ class Environment
89
+ attr_accessor :keys, :completion_class, :history, :word_separator
90
+
91
+ # * <tt>@history_size</tt> - the size of the editor history buffer (30).
92
+ # * <tt>@keys</tt> - the keys (arrays of character codes) bound to specific actions.
93
+ # * <tt>@line_history_size</tt> - the size of the editor line history buffer (50).
94
+ def initialize(env: nil)
95
+ @env = env
96
+ @keys = {}
97
+
98
+ @completion_class = Completer
99
+
100
+ @line_history_size = 50
101
+ @history_size = 30
102
+
103
+ @history = HistoryBuffer.new(@history_size) do |h|
104
+ h.duplicates = false;
105
+ h.exclude = lambda { |item| item.strip == "" }
106
+ end
107
+ end
108
+
109
+ def initialize_line(&blk)
110
+ Line.new(@line_history_size) do |line|
111
+ blk.call(line) if blk
112
+ end
113
+ end
114
+ end
115
+
88
116
  #
89
117
  # Create an instance of RawLine::Editor which can be used
90
118
  # to read from input and perform line-editing operations.
91
119
  # This method takes an optional block used to override the
92
120
  # following instance attributes:
93
- # * <tt>@history_size</tt> - the size of the editor history buffer (30).
94
- # * <tt>@line_history_size</tt> - the size of the editor line history buffer (50).
95
- # * <tt>@keys</tt> - the keys (arrays of character codes) bound to specific actions.
96
121
  # * <tt>@word_break_characters</tt> - a regex used for word separation, default inclues: " \t\n\"\\'`@$><=;|&{("
97
122
  # * <tt>@mode</tt> - The editor's character insertion mode (:insert).
98
123
  # * <tt>@completion_proc</tt> - a Proc object used to perform word completion.
99
- # * <tt>@completion_append_string</tt> - a string to append to completed words ('').
100
124
  # * <tt>@terminal</tt> - a RawLine::Terminal containing character key codes.
101
125
  #
102
126
  def initialize(dom:, input:, renderer:, terminal:)
@@ -105,24 +129,17 @@ module RawLine
105
129
  @renderer = renderer
106
130
  @terminal = terminal
107
131
 
108
- @history_size = 30
109
- @line_history_size = 50
110
- @keys = {}
111
- @word_break_characters = " \t\n\"'@\$><=;|&{("
132
+ @env_stack = [Environment.new]
133
+
134
+ @word_break_characters = " \t\n\"'@><=;|&{("
112
135
  @mode = :insert
113
- @completion_class = Completer
136
+
114
137
  @completion_proc = filename_completion_proc
115
- @completion_append_string = ''
138
+
116
139
  @match_hidden_files = false
117
140
  set_default_keys
118
141
  @add_history = false
119
- @highlight_history_matching_text = true
120
- @history = HistoryBuffer.new(@history_size) do |h|
121
- h.duplicates = false;
122
- h.exclude = lambda { |item| item.strip == "" }
123
- end
124
142
  @keyboard_input_processors = [self]
125
- # @allow_prompt_updates = true
126
143
  yield self if block_given?
127
144
  update_word_separator
128
145
  @char = nil
@@ -134,11 +151,17 @@ module RawLine
134
151
  attr_reader :dom, :event_loop, :input
135
152
  attr_reader :keyboard_input_processors
136
153
 
154
+ def env ; @env_stack.last ; end
155
+
156
+ def completion_class ; env.completion_class ; end
157
+ def history ; env.history ; end
158
+ def keys ; env.keys ; end
159
+
137
160
  #
138
161
  # Return the current RawLine version
139
162
  #
140
163
  def library_version
141
- "RawLine v#{RawLine.rawline_version}"
164
+ "RawLine v#{RawLine::VERSION}"
142
165
  end
143
166
 
144
167
  def prompt
@@ -214,18 +237,14 @@ module RawLine
214
237
  def read_bytes(bytes)
215
238
  return unless bytes.any?
216
239
  old_position = @line.position
217
- key_codes = parse_key_codes(bytes)
218
- key_codes.each do |key_code|
219
- @char = key_code
240
+
241
+ key_code_sequences = parse_key_code_sequences(bytes)
242
+ key_code_sequences.each do |sequence|
243
+ @char = sequence
220
244
  process_character
221
245
 
222
246
  new_position = @line.position
223
247
 
224
- if !@ignore_position_change && new_position != old_position
225
- @matching_text = @line.text[0...@line.position]
226
- end
227
-
228
- @ignore_position_change = false
229
248
  if @char == @terminal.keys[:enter] || !@char
230
249
  process_line
231
250
  end
@@ -252,11 +271,10 @@ module RawLine
252
271
  # This method is called automatically by <tt>read</tt>
253
272
  #
254
273
  def process_character
255
- case @char.class.to_s
256
- when 'Fixnum' then
257
- default_action
258
- when 'Array'
274
+ if @char.is_a?(Array)
259
275
  press_key if key_bound?
276
+ else
277
+ default_action
260
278
  end
261
279
  end
262
280
 
@@ -281,16 +299,16 @@ module RawLine
281
299
  case key.class.to_s
282
300
  when 'Symbol' then
283
301
  raise BindingException, "Unknown key or key sequence '#{key.to_s}' (#{key.class.to_s})" unless @terminal.keys[key]
284
- @keys[@terminal.keys[key]] = block
302
+ keys[@terminal.keys[key]] = block
285
303
  when 'Array' then
286
304
  raise BindingException, "Unknown key or key sequence '#{key.join(", ")}' (#{key.class.to_s})" unless @terminal.keys.has_value? key
287
- @keys[key] = block
305
+ keys[key] = block
288
306
  when 'Fixnum' then
289
307
  raise BindingException, "Unknown key or key sequence '#{key.to_s}' (#{key.class.to_s})" unless @terminal.keys.has_value? [key]
290
- @keys[[key]] = block
308
+ keys[[key]] = block
291
309
  when 'String' then
292
310
  if key.length == 1 then
293
- @keys[[key.ord]] = block
311
+ keys[[key.ord]] = block
294
312
  else
295
313
  bind_hash({:"#{key}" => key}, block)
296
314
  end
@@ -306,14 +324,14 @@ module RawLine
306
324
  def unbind(key)
307
325
  block = case key.class.to_s
308
326
  when 'Symbol' then
309
- @keys.delete @terminal.keys[key]
327
+ keys.delete @terminal.keys[key]
310
328
  when 'Array' then
311
- @keys.delete @keys[key]
329
+ keys.delete keys[key]
312
330
  when 'Fixnum' then
313
- @keys.delete[[key]]
331
+ keys.delete[[key]]
314
332
  when 'String' then
315
333
  if key.length == 1 then
316
- @keys.delete([key.ord])
334
+ keys.delete([key.ord])
317
335
  else
318
336
  raise NotImplementedError, "This is no implemented yet. It needs to return the previously bound block"
319
337
  bind_hash({:"#{key}" => key}, block)
@@ -330,7 +348,7 @@ module RawLine
330
348
  # Return true if the last character read via <tt>read</tt> is bound to an action.
331
349
  #
332
350
  def key_bound?
333
- @keys[@char] ? true : false
351
+ keys[@char] ? true : false
334
352
  end
335
353
 
336
354
  #
@@ -338,24 +356,23 @@ module RawLine
338
356
  # This method is called automatically by <tt>process_character</tt>.
339
357
  #
340
358
  def press_key
341
- @keys[@char].call
359
+ keys[@char].call
342
360
  end
343
361
 
344
362
  #
345
363
  # Execute the default action for the last character read via <tt>read</tt>.
346
- # By default it prints the character to the screen via <tt>print_character</tt>.
364
+ # By default it prints the character to the screen via <tt>write</tt>.
347
365
  # This method is called automatically by <tt>process_character</tt>.
348
366
  #
349
367
  def default_action
350
- @dom.input_box.content += @char.chr
351
- print_character
368
+ insert(@char)
352
369
  end
353
370
 
354
371
  #
355
372
  # Parse a key or key sequence into the corresponding codes.
356
373
  #
357
- def parse_key_codes(bytes)
358
- KeycodeParser.new(@terminal.keys).parse_bytes(bytes)
374
+ def parse_key_code_sequences(bytes)
375
+ KeycodeParser.new(@terminal.keys).parse_bytes_into_sequences(bytes)
359
376
  end
360
377
 
361
378
  #
@@ -364,7 +381,7 @@ module RawLine
364
381
  #
365
382
  def newline
366
383
  add_to_history
367
- @history.clear_position
384
+ history.clear_position
368
385
  end
369
386
 
370
387
  def on_read_line(&blk)
@@ -387,7 +404,7 @@ module RawLine
387
404
  @line.text = ""
388
405
  @line.position = 0
389
406
  @dom.input_box.position = @line.position
390
- @history.clear_position
407
+ history.clear_position
391
408
  end
392
409
 
393
410
  def clear_screen
@@ -416,7 +433,7 @@ module RawLine
416
433
  @dom.input_box.position = @line.position
417
434
  @dom.input_box.content = @line.text
418
435
  add_to_line_history unless no_line_history
419
- @history.clear_position
436
+ history.clear_position
420
437
  end
421
438
 
422
439
  #
@@ -434,7 +451,7 @@ module RawLine
434
451
  @dom.input_box.content = @line.text
435
452
  @dom.input_box.position = @line.position
436
453
  add_to_line_history unless no_line_history
437
- @history.clear_position
454
+ history.clear_position
438
455
  end
439
456
  end
440
457
 
@@ -447,7 +464,7 @@ module RawLine
447
464
  @line.text[@line.position..-1] = ANSIString.new("")
448
465
  @dom.input_box.content = line.text
449
466
  @dom.input_box.position = @line.position
450
- @history.clear_position
467
+ history.clear_position
451
468
  killed_text
452
469
  end
453
470
 
@@ -456,7 +473,7 @@ module RawLine
456
473
  @line.position = line.position + text.length
457
474
  @dom.input_box.content = line.text
458
475
  @dom.input_box.position = @line.position
459
- @history.clear_position
476
+ history.clear_position
460
477
  end
461
478
 
462
479
  #
@@ -543,7 +560,6 @@ module RawLine
543
560
  new_line = highlight_text_up_to(new_line, options[:highlight_up_to])
544
561
  end
545
562
 
546
- @ignore_position_change = true
547
563
  @line.position = position || new_line.length
548
564
  @line.text = new_line
549
565
  @dom.input_box.content = @line.text
@@ -572,30 +588,6 @@ module RawLine
572
588
  #
573
589
  ############################################################################
574
590
 
575
- #
576
- # Write a character to <tt>output</tt> at cursor position,
577
- # shifting characters as appropriate.
578
- # If <tt>no_line_history</tt> is set to <tt>true</tt>, the updated
579
- # won't be saved in the history of the current line.
580
- #
581
- def print_character(char=@char, no_line_history = false)
582
- if @line.position < @line.length then
583
- chars = select_characters_from_cursor if @mode == :insert
584
- @line.text[@line.position] = (@mode == :insert) ? "#{char.chr}#{@line.text[@line.position]}" : "#{char.chr}"
585
- @line.right
586
- @dom.input_box.position = @line.position
587
- # if @mode == :insert then
588
- # chars.length.times { @line.left } # move cursor back
589
- # end
590
- else
591
- @line.right
592
- @line << char
593
- end
594
- @dom.input_box.content = @line.text
595
- @dom.input_box.position = @line.position
596
- add_to_line_history unless no_line_history
597
- end
598
-
599
591
  #
600
592
  # Write to <tt>output</tt> and then immediately re-render.
601
593
  #
@@ -605,15 +597,29 @@ module RawLine
605
597
  end
606
598
 
607
599
  #
608
- # Write a string starting from the cursor position.
600
+ # Inserts a string at the current line position, shifting characters
601
+ # to right if necessary.
602
+ #
603
+ def insert(string, add_to_line_history: true)
604
+ @line.text.insert @line.position, string
605
+ string.length.times { @line.right }
606
+ @dom.input_box.position = @line.position
607
+ @dom.input_box.content = @line.text
608
+
609
+ self.add_to_line_history if add_to_line_history
610
+ end
611
+
612
+ #
613
+ # Write a string starting from the cursor position ovewriting any character
614
+ # at the current position if necessary.
609
615
  #
610
- def write(string)
616
+ def write(string, add_to_line_history: true)
611
617
  @line.text[@line.position] = string
612
618
  string.length.times { @line.right }
613
619
  @dom.input_box.position = @line.position
614
620
  @dom.input_box.content = @line.text
615
621
 
616
- add_to_line_history
622
+ self.add_to_line_history if add_to_line_history
617
623
  end
618
624
 
619
625
  ############################################################################
@@ -635,7 +641,7 @@ module RawLine
635
641
  #
636
642
  def complete
637
643
  @dom.input_box.cursor_off
638
- completer = @completion_class.new(
644
+ completer = completion_class.new(
639
645
  char: @char,
640
646
  line: @line,
641
647
  completion: @completion_proc,
@@ -669,7 +675,7 @@ module RawLine
669
675
 
670
676
  move_to_position @line.word[:end]
671
677
  delete_n_characters(@line.word[:end] - @line.word[:start], true)
672
- write completion.to_s + @completion_append_string.to_s
678
+ write completion.to_s
673
679
  end
674
680
 
675
681
  def completion_not_found
@@ -729,7 +735,7 @@ module RawLine
729
735
  def show_history
730
736
  pos = @line.position
731
737
  text = @line.text
732
- @history.each {|l| puts "- [#{l}]"}
738
+ history.each {|l| puts "- [#{l}]"}
733
739
  overwrite_line(text, pos)
734
740
  end
735
741
 
@@ -737,7 +743,7 @@ module RawLine
737
743
  # Clear the editor history.
738
744
  #
739
745
  def clear_history
740
- @history.empty
746
+ history.empty
741
747
  end
742
748
 
743
749
  #
@@ -764,7 +770,7 @@ module RawLine
764
770
  # This action is bound to the up arrow key by default.
765
771
  #
766
772
  def history_back
767
- generic_history_back(@history)
773
+ generic_history_back(history)
768
774
  add_to_line_history
769
775
  end
770
776
 
@@ -774,7 +780,7 @@ module RawLine
774
780
  # This action is bound to down arrow key by default.
775
781
  #
776
782
  def history_forward
777
- generic_history_forward(@history)
783
+ generic_history_forward(history)
778
784
  add_to_line_history
779
785
  end
780
786
 
@@ -791,7 +797,7 @@ module RawLine
791
797
  # Add the current line (<tt>@line.text</tt>) to the editor history.
792
798
  #
793
799
  def add_to_history
794
- @history << @line.text.dup if @add_history && @line.text != ""
800
+ history << @line.text.dup if @add_history && @line.text != ""
795
801
  end
796
802
 
797
803
  ############################################################################
@@ -831,7 +837,7 @@ module RawLine
831
837
  @event_loop.add_event name: "render", source: @dom#, target: event[:target]
832
838
  end
833
839
 
834
- @dom.on :cursor_position_changed do |*args|
840
+ @dom.on :position_changed do |*args|
835
841
  @renderer.render_cursor(@dom.input_box)
836
842
  end
837
843
 
@@ -846,8 +852,8 @@ module RawLine
846
852
  def initialize_line
847
853
  @dom.input_box.content = ""
848
854
  update_word_separator
849
- @add_history = true #add_history
850
- @line = Line.new(@line_history_size) do |l|
855
+ @add_history = true
856
+ @line = env.initialize_line do |l|
851
857
  l.prompt = @dom.prompt_box.content
852
858
  l.word_separator = @word_separator
853
859
  end
@@ -881,7 +887,7 @@ module RawLine
881
887
  raise BindingException, "Unable to bind '#{k.to_s}' (#{k.class.to_s})"
882
888
  end
883
889
  @terminal.keys[j] = code
884
- @keys[code] = block
890
+ keys[code] = block
885
891
  end
886
892
  end
887
893
 
@@ -891,36 +897,21 @@ module RawLine
891
897
 
892
898
  def generic_history_back(history)
893
899
  unless history.empty?
894
- history.back(matching_text: matching_text)
900
+ history.back
895
901
  line = history.get
896
902
  return unless line
897
903
 
898
904
  cursor_position = nil
899
- if supports_partial_text_matching? && highlight_history_matching_text
900
- if line && matching_text
901
- cursor_position = [line.length, matching_text.length].min
902
- elsif matching_text
903
- cursor_position = matching_text.length
904
- end
905
- end
906
-
907
905
  overwrite_line(line, cursor_position, highlight_up_to: cursor_position)
908
906
  end
909
907
  end
910
908
 
911
- def supports_partial_text_matching?
912
- history.supports_partial_text_matching?
913
- end
914
-
915
909
  def generic_history_forward(history)
916
- if history.forward(matching_text: matching_text)
910
+ if history.forward
917
911
  line = history.get
918
912
  return unless line
919
913
 
920
- cursor_position = if supports_partial_text_matching? && highlight_history_matching_text && matching_text
921
- [line.length, matching_text.length].min
922
- end
923
-
914
+ cursor_position = nil
924
915
  overwrite_line(line, cursor_position, highlight_up_to: cursor_position)
925
916
  end
926
917
  end
@@ -934,7 +925,7 @@ module RawLine
934
925
  end
935
926
 
936
927
  def set_default_keys
937
- bind(:space) { write(' ') }
928
+ bind(:space) { insert(' ') }
938
929
  bind(:enter) { newline }
939
930
  bind(:tab) { complete }
940
931
  bind(:backspace) { delete_left_character }
@@ -950,16 +941,6 @@ module RawLine
950
941
  bind(:insert) { toggle_mode }
951
942
  end
952
943
 
953
- def matching_text
954
- return nil unless @line
955
- return nil if @line.text == ""
956
- if @history.searching?
957
- @matching_text
958
- else
959
- @matching_text = @line[0...@line.position]
960
- end
961
- end
962
-
963
944
  def terminal_row_for_line_position(line_position)
964
945
  ((@line.prompt.length + line_position) / terminal_width.to_f).ceil
965
946
  end
@@ -50,10 +50,6 @@ module RawLine
50
50
  !!@position
51
51
  end
52
52
 
53
- def supports_partial_text_matching?
54
- false
55
- end
56
-
57
53
  #
58
54
  # Resize the buffer, resetting <tt>@position</tt> to nil.
59
55
  #
@@ -5,6 +5,42 @@ module RawLine
5
5
  @escape_code = keymap[:escape]
6
6
  end
7
7
 
8
+ # Parses a collection of bytes into key code sequences. All
9
+ # multi-byte sequences (e.g. [27, 91, 67]) will be left alone where-as
10
+ # all other byte sequences will be converted to UTF-8.
11
+ #
12
+ # E.g.
13
+ # parse_bytes_into_sequences [97, 98, [27, 91, 67], 99, 198, 146]
14
+ # # => ["a", "b", [27, 91, 67], "c", "ƒ"]
15
+ #
16
+ def parse_bytes_into_sequences(bytes)
17
+ key_codes = parse_bytes(bytes)
18
+
19
+ byte_buffer = []
20
+ sequences = key_codes.each_with_object([]) do |val, arr|
21
+ if val.is_a?(Array)
22
+ arr.push *convert_bytes_to_utf8(byte_buffer)
23
+ arr << val
24
+ byte_buffer = []
25
+ else
26
+ byte_buffer << val
27
+ end
28
+ end
29
+
30
+ # don't forget about remaining bytes in the buffer
31
+ if byte_buffer.any?
32
+ sequences.push *convert_bytes_to_utf8(byte_buffer)
33
+ end
34
+
35
+ sequences
36
+ end
37
+
38
+ private
39
+
40
+ def convert_bytes_to_utf8(bytes)
41
+ bytes.pack('C*').force_encoding('UTF-8')
42
+ end
43
+
8
44
  def parse_bytes(bytes)
9
45
  i = 0
10
46
  results = []
data/lib/rawline/line.rb CHANGED
@@ -144,8 +144,8 @@ module RawLine
144
144
  #
145
145
  # Add a character (expressed as a character code) to the line text.
146
146
  #
147
- def <<(char)
148
- @text << char.chr
147
+ def <<(string)
148
+ @text << string
149
149
  end
150
150
 
151
151
  #
@@ -22,6 +22,10 @@ module RawLine
22
22
  @escape_codes = [?\e.ord]
23
23
  @keys.merge!(
24
24
  {
25
+ :alt_up_arrow => [?\e.ord, ?\e.ord, ?[.ord, ?A.ord],
26
+ :alt_down_arrow => [?\e.ord, ?\e.ord, ?[.ord, ?B.ord],
27
+ :alt_right_arrow => [?\e.ord, ?\e.ord, ?[.ord, ?C.ord],
28
+ :alt_left_arrow => [?\e.ord, ?\e.ord, ?[.ord, ?D.ord],
25
29
  :up_arrow => [?\e.ord, ?[.ord, ?A.ord],
26
30
  :down_arrow => [?\e.ord, ?[.ord, ?B.ord],
27
31
  :right_arrow => [?\e.ord, ?[.ord, ?C.ord],
@@ -39,6 +39,7 @@ module RawLine
39
39
  @keys =
40
40
  {
41
41
  :tab => [?\t.ord],
42
+ :shift_tab => [27, 91, 90],
42
43
  :return => [?\r.ord],
43
44
  :newline => [?\n.ord],
44
45
  :escape => [?\e.ord],
@@ -0,0 +1,3 @@
1
+ module RawLine
2
+ VERSION = "0.3.0"
3
+ end
data/lib/rawline.rb CHANGED
@@ -16,10 +16,7 @@ require "rubygems"
16
16
  # as the Readline one.
17
17
  #
18
18
  module RawLine
19
-
20
- def self.rawline_version
21
- "0.3.2"
22
- end
19
+ require 'rawline/version'
23
20
 
24
21
  class BindingException < RuntimeError; end
25
22
 
@@ -0,0 +1,62 @@
1
+ namespace :bump do
2
+ namespace :version do
3
+ class ProjectVersion
4
+ FILE = File.dirname(__FILE__) + '/../rawline/version.rb'
5
+ PATTERN = /VERSION\s*=\s*"(\d+)\.(\d+)\.(\d+)"/m
6
+
7
+ def initialize(file=FILE, pattern=PATTERN)
8
+ @file = file
9
+ @pattern = pattern
10
+ end
11
+
12
+ def bump(major:nil, minor:nil, patch:nil)
13
+ version = nil
14
+ contents.sub!(@pattern) do
15
+ _major = major.call($1) if major
16
+ _minor = minor.call($2) if minor
17
+ _patch = patch.call($3) if patch
18
+ version = "#{_major}.#{_minor}.#{_patch}"
19
+ results = %|VERSION = "#{version}"|
20
+ end
21
+ File.write(@file, contents)
22
+ system "bundle"
23
+ system "git add #{ProjectVersion::FILE} && git commit -m 'Bumping version to #{version}'"
24
+ system "git tag v#{version}"
25
+ end
26
+
27
+ private
28
+
29
+ def contents
30
+ @contents ||= File.read(@file)
31
+ end
32
+ end
33
+
34
+ desc "Increments the patch number by 1 for the project"
35
+ task :patch do
36
+ ProjectVersion.new.bump(
37
+ major: ->(major){ major },
38
+ minor: ->(minor){ minor },
39
+ patch: ->(patch){ patch.succ }
40
+ )
41
+ end
42
+
43
+ desc "Increments the minor number by 1 for the project"
44
+ task :minor do
45
+ ProjectVersion.new.bump(
46
+ major: ->(major){ major },
47
+ minor: ->(minor){ minor.succ },
48
+ patch: ->(patch){ 0 }
49
+ )
50
+ end
51
+
52
+ desc "Increments the major number by 1 for the project"
53
+ task :major do
54
+ ProjectVersion.new.bump(
55
+ major: ->(major){ major.succ },
56
+ minor: ->(minor){ 0 },
57
+ patch: ->(patch){ 0 }
58
+ )
59
+ end
60
+
61
+ end
62
+ end
data/spec/editor_spec.rb CHANGED
@@ -132,7 +132,7 @@ describe RawLine::Editor do
132
132
  it "moves the line and cursor position to left by 1 character" do
133
133
  @editor.event_loop.tick
134
134
  expect(@editor.line.position).to eq(3)
135
- expect(@editor.input_box.cursor_position.x).to eq(3)
135
+ expect(@editor.input_box.position).to eq(3)
136
136
 
137
137
  input.clear
138
138
  input << arrow_key_left_ansi
@@ -142,7 +142,7 @@ describe RawLine::Editor do
142
142
  @editor.event_loop.tick
143
143
 
144
144
  expect(@editor.line.position).to eq(2)
145
- expect(@editor.input_box.cursor_position.x).to eq(2)
145
+ expect(@editor.input_box.position).to eq(2)
146
146
  end
147
147
  end
148
148
 
@@ -150,7 +150,7 @@ describe RawLine::Editor do
150
150
  it "doesnt move the line and cursor position" do
151
151
  @editor.event_loop.tick
152
152
  expect(@editor.line.position).to eq(3)
153
- expect(@editor.input_box.cursor_position.x).to eq(3)
153
+ expect(@editor.input_box.position).to eq(3)
154
154
 
155
155
  input.clear
156
156
  input << arrow_key_right_ansi
@@ -160,7 +160,7 @@ describe RawLine::Editor do
160
160
  @editor.event_loop.tick
161
161
 
162
162
  expect(@editor.line.position).to eq(3)
163
- expect(@editor.input_box.cursor_position.x).to eq(3)
163
+ expect(@editor.input_box.position).to eq(3)
164
164
  end
165
165
  end
166
166
 
@@ -204,12 +204,77 @@ describe RawLine::Editor do
204
204
 
205
205
  it "correctly sets the line and cursor position" do
206
206
  expect(@editor.line.position).to eq(3)
207
- expect(@editor.input_box.cursor_position.x).to eq(3)
207
+ expect(@editor.input_box.position).to eq(3)
208
208
  end
209
209
  end
210
210
  end
211
211
  end
212
212
 
213
+ describe "#insert" do
214
+ before do
215
+ input << "test #5"
216
+ input.rewind
217
+ @editor.event_loop.tick
218
+ expect(@editor.line.position).to eq(7)
219
+ end
220
+
221
+ it "inserts the given string at the current line position" do
222
+ @editor.insert "ABC"
223
+ expect(@editor.line.text).to eq("test #5ABC")
224
+ end
225
+
226
+ it "increments the line position the length of the inserted string" do
227
+ @editor.insert "ABC"
228
+ expect(@editor.line.position).to eq(10)
229
+ end
230
+
231
+ it "shifts characters not at the end of the string" do
232
+ @editor.move_left
233
+ @editor.insert "931"
234
+ expect(@editor.line.text).to eq("test #9315")
235
+ expect(@editor.line.position).to eq(9)
236
+ end
237
+
238
+ it "updates the DOM's input_box and position" do
239
+ @editor.insert "hello"
240
+ expect(dom.input_box.content).to eq("test #5hello")
241
+ expect(dom.input_box.position).to eq(12)
242
+ end
243
+ end
244
+
245
+ describe "#write" do
246
+ before do
247
+ input << "test #5"
248
+ input.rewind
249
+ @editor.event_loop.tick
250
+ expect(@editor.line.position).to eq(7)
251
+ end
252
+
253
+ it "writes the given string at the current line position" do
254
+ @editor.write "ABC"
255
+ expect(@editor.line.text).to eq("test #5ABC")
256
+ end
257
+
258
+ it "increments the line position the length of the written string" do
259
+ @editor.write "ABC"
260
+ expect(@editor.line.position).to eq(10)
261
+ end
262
+
263
+ it "overwrites any character at the current position" do
264
+ @editor.move_left
265
+ @editor.write "931"
266
+ expect(@editor.line.text).to eq("test #931")
267
+ expect(@editor.line.position).to eq(9)
268
+ end
269
+
270
+ it "updates the DOM's input_box and position" do
271
+ @editor.move_left
272
+ @editor.write "hello"
273
+ expect(dom.input_box.content).to eq("test #hello")
274
+ expect(dom.input_box.position).to eq(11)
275
+ end
276
+ end
277
+
213
278
  it "can delete characters" do
214
279
  input << "test #5"
215
280
  input.rewind
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yap-rawline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Cevasco
@@ -104,6 +104,8 @@ files:
104
104
  - lib/rawline/terminal.rb
105
105
  - lib/rawline/terminal/vt220_terminal.rb
106
106
  - lib/rawline/terminal/windows_terminal.rb
107
+ - lib/rawline/version.rb
108
+ - lib/tasks/gem.rake
107
109
  - spec/editor_spec.rb
108
110
  - spec/history_buffer_spec.rb
109
111
  - spec/keycode_parser_spec.rb