glimmer-cs-gladiator 0.3.1 → 0.4.0

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: 650c712355cabdc815732a44b445b14ba7940daf39905019f10b7cdf1c62a935
4
- data.tar.gz: 02377cc0cc8891d0ff3128877ee521c0ae6674c86304b0663ce3956e603e3cd1
3
+ metadata.gz: 1b17d21c81f04c1f1fc1ad516013d9e62a6abeb0900096b1bd13c95c6cf10ccd
4
+ data.tar.gz: 78d41ab949f3f40c71f2abfa26310a32f3720eecb64dcf5b90d2f155c2b35345
5
5
  SHA512:
6
- metadata.gz: fcefebd0897944ec7e6634027c9e44cce3f705001a452d21ad68647b6e5aec70652c0d6cc7d8dfdd4870ddda6995902625eebc91bf085e7b5fbfe5db35c1b479
7
- data.tar.gz: 4604954cce35346ddb5203f76e45efc492b37421b3f4748be5bbd7b7c34208efb4bb5de92445391f7a537b25aaa74747ffca9fa698139eb11f0a3549e37ede6b
6
+ metadata.gz: bff6362c1eb4cc711c507ac90aa34e5a5b11653fe7b48f475bd829b37fdb1a87ca6b2317b35ff11f14f287aebfe2e35dee5e47ea2e9575f74c7b9971a1231b77
7
+ data.tar.gz: dc19f782cfb448e32f8054fee66797001af383cdcbedf26aeed3a3beaddef4309edefa4ca59c9be4192cd534d8a670bed35bd691ee458e3c5d22a43938e9d5e2
data/README.md CHANGED
@@ -1,10 +1,12 @@
1
- # <img src='https://raw.githubusercontent.com/AndyObtiva/glimmer-cs-gladiator/master/images/glimmer-cs-gladiator-logo.svg' height=85 /> Gladiator 0.3.1 - [Ugliest Text Editor Ever](https://www.reddit.com/r/ruby/comments/hgve8k/gladiator_glimmer_editor_ugliest_text_editor_ever/)
1
+ # <img src='https://raw.githubusercontent.com/AndyObtiva/glimmer-cs-gladiator/master/images/glimmer-cs-gladiator-logo.svg' height=85 /> Gladiator 0.4.0 - [Ugliest Text Editor Ever](https://www.reddit.com/r/ruby/comments/hgve8k/gladiator_glimmer_editor_ugliest_text_editor_ever/)
2
2
  ## [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=40 /> Glimmer Custom Shell](https://github.com/AndyObtiva/glimmer-dsl-swt#custom-shell-gem)
3
3
  [![Gem Version](https://badge.fury.io/rb/glimmer-cs-gladiator.svg)](http://badge.fury.io/rb/glimmer-cs-gladiator)
4
4
 
5
5
  ![Gladiator](images/glimmer-gladiator.png)
6
6
 
7
- Gladiator (short for Glimmer Editor) is a [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) sample project under on-going development that demonstrates how to build a text editor in [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) (JRuby Desktop Development GUI Library).
7
+ (Now, slightly less ugly with Ruby syntax highlighting colors)
8
+
9
+ Gladiator (short for Glimmer Editor) is a [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) sample project under on-going development that demonstrates how to build a text editor in Ruby using [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) (JRuby Desktop Development GUI Library).
8
10
  It is not intended to be a full-fledged editor by any means, yet mostly a fun educational exercise in using [Glimmer](https://github.com/AndyObtiva/glimmer).
9
11
  Gladiator is also a personal tool for shaping an editor exactly the way I like, with all the keyboard shortcuts I prefer.
10
12
  I leave building truly professional text editors to software tooling experts who would hopefully use [Glimmer](https://github.com/AndyObtiva/glimmer) one day. Otherwise, I have been happily using Gladiator to develop all my [open-source projects](https://github.com/AndyObtiva) since May of 2020.
@@ -12,6 +14,7 @@ I leave building truly professional text editors to software tooling experts who
12
14
  ## Features
13
15
 
14
16
  Gladiator currently supports the following text editing features (including keyboard shortcuts with Mac CMD=CTRL on Windows/Linux):
17
+ - Ruby Syntax Highlighting with colors
15
18
  - File explorer navigation with context menu to open file, rename, delete, add new file, add new directory, or refresh tree (CMD+T)
16
19
  - File lookup by name ignoring slashes, underscores, and dots to ease lookup (CMD+R)
17
20
  - Watch open file for external changes to automatically refresh in editor
@@ -30,6 +33,8 @@ Gladiator currently supports the following text editing features (including keyb
30
33
  - Indent/Unindent line/selection (CMD+] & CMD+[)
31
34
  - Insert/Prefix New Line (CMD+ENTER & CMD+SHIFT+ENTER)
32
35
  - Drag and Drop Text Editor Split Screen (drag a file from File Tree or File Lookup List, and it splits the screen)
36
+ - Run current Ruby file via Run Menu (CMD+SHIFT+R)
37
+ - Change Split Orientation to Horizontal/Vertical via View Menu (CMD+SHIFT+O)
33
38
 
34
39
  ## Platforms
35
40
 
@@ -99,7 +104,7 @@ To reuse Gladiator as a Glimmer Custom Shell inside another Glimmer application,
99
104
  following to the application's `Gemfile`:
100
105
 
101
106
  ```
102
- gem 'glimmer-cs-gladiator', '~> 0.3.1'
107
+ gem 'glimmer-cs-gladiator', '~> 0.4.0'
103
108
  ```
104
109
 
105
110
  Run:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.1
1
+ 0.4.0
@@ -1,7 +1,9 @@
1
1
  module Glimmer
2
2
  class Gladiator
3
- class Command
3
+ class Command
4
4
  class << self
5
+ include Glimmer
6
+
5
7
  def command_history
6
8
  @command_history ||= {}
7
9
  end
@@ -11,7 +13,7 @@ module Glimmer
11
13
  command_history[file] ||= [Command.new(file)]
12
14
  end
13
15
 
14
- def do(file, method = nil, command: nil)
16
+ def do(file, method = nil, command: nil)
15
17
  command ||= Command.new(file, method)
16
18
  command_history_for(file)&.last&.next_command = command
17
19
  command.do
@@ -20,11 +22,13 @@ module Glimmer
20
22
 
21
23
  def undo(file)
22
24
  return if command_history_for(file).size <= 1
23
- command_history_for(file).pop.undo
25
+ command = command_history_for(file).pop
26
+ command&.undo
24
27
  end
25
28
 
26
29
  def redo(file)
27
- command_history_for(file).last&.redo
30
+ command = command_history_for(file).last
31
+ command&.redo
28
32
  end
29
33
  end
30
34
 
@@ -5,15 +5,15 @@ module Glimmer
5
5
  class File
6
6
  include Glimmer
7
7
 
8
- attr_accessor :dirty_content, :line_numbers_content, :selection, :selection_count, :line_number, :find_text, :replace_text, :top_index, :display_path, :case_sensitive
8
+ attr_accessor :dirty_content, :line_numbers_content, :selection, :line_number, :find_text, :replace_text, :top_pixel, :display_path, :case_sensitive
9
9
  attr_reader :name, :path
10
-
10
+
11
11
  def initialize(path)
12
12
  raise "Not a file path: #{path}" unless ::File.file?(path)
13
13
  @command_history = []
14
14
  @name = ::File.basename(path)
15
15
  self.path = ::File.expand_path(path)
16
- @top_index = 0
16
+ @top_pixel = 0
17
17
  @selection_count = 0
18
18
  @selection = Point.new(0, 0 + @selection_count)
19
19
  read_dirty_content = ::File.read(path)
@@ -52,8 +52,11 @@ module Glimmer
52
52
 
53
53
  # to use for widget data-binding
54
54
  def content=(value)
55
- Command.do(self) # record a native (OS-widget) operation
56
- self.dirty_content = value
55
+ value = value.gsub("\t", ' ')
56
+ if dirty_content != value
57
+ Command.do(self) # record a native (OS-widget) operation
58
+ self.dirty_content = value
59
+ end
57
60
  end
58
61
 
59
62
  def content
@@ -61,18 +64,23 @@ module Glimmer
61
64
  end
62
65
 
63
66
  def caret_position=(value)
67
+ old_top_pixel = top_pixel
64
68
  self.selection = Point.new(value, value + selection_count.to_i)
65
- if OS.linux?
66
- async_exec do
67
- self.top_index = line_index_for_caret_position(value)
68
- end
69
- end
69
+ self.top_pixel = old_top_pixel
70
70
  end
71
71
 
72
72
  def caret_position
73
73
  selection.x
74
74
  end
75
+
76
+ def selection_count
77
+ selection.y - selection.x
78
+ end
75
79
 
80
+ def selection_count=(value)
81
+ self.selection = Point.new(caret_position, caret_position + value.to_i)
82
+ end
83
+
76
84
  def name=(the_name)
77
85
  new_path = path.sub(/#{Regexp.escape(@name)}$/, the_name)
78
86
  @name = the_name
@@ -135,10 +143,10 @@ module Glimmer
135
143
  current_line.to_s.match(/^(\s+)/).to_a[1].to_s
136
144
  end
137
145
 
138
- def current_line
146
+ def current_line
139
147
  lines[line_number - 1]
140
148
  end
141
-
149
+
142
150
  def delete!
143
151
  FileUtils.rm(path)
144
152
  end
@@ -210,8 +218,9 @@ module Glimmer
210
218
  old_caret_position = self.caret_position
211
219
  self.dirty_content = new_lines.join("\n")
212
220
  if old_selection_count.to_i > 0
213
- self.caret_position = caret_position_for_line_index(old_caret_position_line_index)
214
- self.selection_count = (caret_position_for_line_index(old_end_caret_line_index + 1) - self.caret_position)
221
+ caret_position_value = caret_position_for_line_index(old_caret_position_line_index)
222
+ selection_count_value = (caret_position_for_line_index(old_end_caret_line_index + 1) - caret_position_value)
223
+ self.selection = Point.new(caret_position_value, caret_position_value + selection_count_value)
215
224
  else
216
225
  self.caret_position = old_caret_position + delta
217
226
  end
@@ -239,8 +248,9 @@ module Glimmer
239
248
  end
240
249
  self.dirty_content = new_lines.join("\n")
241
250
  if old_selection_count.to_i > 0
242
- self.caret_position = caret_position_for_line_index(old_caret_position_line_index)
243
- self.selection_count = (caret_position_for_line_index(old_end_caret_line_index + 1) - self.caret_position)
251
+ caret_position_value = caret_position_for_line_index(old_caret_position_line_index)
252
+ selection_count_value = (caret_position_for_line_index(old_end_caret_line_index + 1) - caret_position_value)
253
+ self.selection = Point.new(caret_position_value, caret_position_value + selection_count_value)
244
254
  else
245
255
  new_caret_position = old_caret_position + delta
246
256
  new_caret_position = [new_caret_position, old_caret_position_line_caret_position].max
@@ -290,7 +300,7 @@ module Glimmer
290
300
  all_lines = lines
291
301
  the_line_index = line_index_for_caret_position(caret_position)
292
302
  line_position = line_position_for_caret_position(caret_position)
293
- found =
303
+ found = found_text?(caret_position)
294
304
  2.times do |i|
295
305
  rotation = the_line_index
296
306
  all_lines.rotate(rotation).each_with_index do |the_line, the_index|
@@ -302,6 +312,7 @@ module Glimmer
302
312
  if occurrence_index
303
313
  self.caret_position = caret_position_for_line_index(the_index) + start_position + occurrence_index
304
314
  self.selection_count = find_text.to_s.size
315
+ self.selection = Point.new(self.caret_position, self.caret_position + self.selection_count)
305
316
  return
306
317
  end
307
318
  end
@@ -15,6 +15,7 @@ module Glimmer
15
15
  class Gladiator
16
16
  include Glimmer::UI::CustomShell
17
17
 
18
+ APP_ROOT = ::File.expand_path('../../../..', __FILE__)
18
19
  COMMAND_KEY = OS.mac? ? :command : :ctrl
19
20
 
20
21
  class << self
@@ -28,6 +29,8 @@ module Glimmer
28
29
  # option :width, 320
29
30
  # option :height, 240
30
31
 
32
+ attr_accessor :split_orientation
33
+
31
34
  ## Uncomment before_body block to pre-initialize variables to use in body
32
35
  #
33
36
  #
@@ -72,6 +75,8 @@ module Glimmer
72
75
  @text_editor&.text_widget&.setFocus
73
76
  end
74
77
  end
78
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'o'
79
+ self.split_orientation = split_orientation == swt(:horizontal) ? swt(:vertical) : swt(:horizontal)
75
80
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']'
76
81
  @tab_folder.swt_widget.setSelection((@tab_folder.swt_widget.getSelectionIndex() + 1) % @tab_folder.swt_widget.getItemCount) if @tab_folder.swt_widget.getItemCount > 0
77
82
  @text_editor&.text_widget&.setFocus
@@ -132,10 +137,10 @@ module Glimmer
132
137
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'l'
133
138
  @line_number_text.swt_widget.selectAll
134
139
  @line_number_text.swt_widget.setFocus
135
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'r'
140
+ elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'r'
136
141
  @filter_text.swt_widget.selectAll
137
142
  @filter_text.swt_widget.setFocus
138
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 't'
143
+ elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 't'
139
144
  select_tree_item unless @rename_in_progress
140
145
  @tree.swt_widget.setFocus
141
146
  elsif key_event.keyCode == swt(:esc)
@@ -147,6 +152,7 @@ module Glimmer
147
152
  }
148
153
  }
149
154
 
155
+ @split_orientation = swt(:horizontal)
150
156
  local_dir = ENV['LOCAL_DIR'] || '.'
151
157
  @config_file_path = ::File.join(local_dir, '.gladiator')
152
158
  @config = {}
@@ -223,7 +229,7 @@ module Glimmer
223
229
  observe(Dir.local_dir, 'selected_child.caret_position') do
224
230
  save_config
225
231
  end
226
- observe(Dir.local_dir, 'selected_child.top_index') do
232
+ observe(Dir.local_dir, 'selected_child.top_pixel') do
227
233
  save_config
228
234
  end
229
235
  load_config
@@ -258,6 +264,46 @@ module Glimmer
258
264
  on_shell_deactivated {
259
265
  @text_editor&.file&.write_dirty_content
260
266
  }
267
+
268
+ menu_bar {
269
+ menu {
270
+ text '&View'
271
+ menu {
272
+ text '&Split'
273
+ menu_item(:radio) {
274
+ text '&Horizontal'
275
+ selection bind(self, :split_orientation, on_read: ->(o) { o == swt(:horizontal)}, on_write: ->(b) { b ? swt(:horizontal) : swt(:vertical)})
276
+ }
277
+ menu_item(:radio) {
278
+ text '&Vertical'
279
+ selection bind(self, :split_orientation, on_read: ->(o) { o == swt(:vertical)}, on_write: ->(b) { b ? swt(:vertical) : swt(:horizontal)})
280
+ }
281
+ }
282
+ }
283
+ menu {
284
+ text '&Run'
285
+ # menu_item {
286
+ # text 'Launch Glimmer &App'
287
+ # on_widget_selected {
288
+ # parent_path = Dir.local_dir.path
289
+ ## current_directory_name = ::File.basename(parent_path)
290
+ ## assumed_shell_script = ::File.join(parent_path, 'bin', current_directory_name)
291
+ ## assumed_shell_script = ::Dir.glob(::File.join(parent_path, 'bin', '*')).detect {|f| ::File.file?(f) && !::File.read(f).include?('#!/usr/bin/env')} if !::File.exist?(assumed_shell_script)
292
+ ## load assumed_shell_script
293
+ # FileUtils.cd(parent_path) do
294
+ # system 'glimmer run'
295
+ # end
296
+ # }
297
+ # }
298
+ menu_item {
299
+ text '&Current File'
300
+ on_widget_selected {
301
+ load Dir.local_dir.selected_child.path
302
+ }
303
+ }
304
+ }
305
+ }
306
+
261
307
  composite {
262
308
  grid_layout 1, false
263
309
  layout_data(:fill, :fill, false, true) {
@@ -395,9 +441,13 @@ module Glimmer
395
441
 
396
442
  # row 1
397
443
 
444
+ label {
445
+ text 'File:'
446
+ }
447
+
398
448
  @file_path_label = styled_text(:none) {
399
449
  layout_data(:fill, :fill, true, false) {
400
- horizontal_span 3
450
+ horizontal_span 2
401
451
  }
402
452
  background color(:widget_background)
403
453
  editable false
@@ -496,6 +546,7 @@ module Glimmer
496
546
  height_hint 480
497
547
  }
498
548
  sash_width 10
549
+ orientation bind(self, :split_orientation)
499
550
  @tab_folder = tab_folder {
500
551
  drag_source(DND::DROP_COPY) {
501
552
  transfer [TextTransfer.getInstance].to_java(Transfer)
@@ -549,7 +600,7 @@ module Glimmer
549
600
  Gladiator.drag = false
550
601
  Dir.local_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path]
551
602
  Dir.local_dir.selected_child&.caret_position = Dir.local_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position].to_i) if @config[:caret_position]
552
- Dir.local_dir.selected_child&.top_index = @config[:top_index].to_i if @config[:top_index]
603
+ Dir.local_dir.selected_child&.top_pixel = @config[:top_pixel].to_i if @config[:top_pixel]
553
604
  else
554
605
  @loaded_config = true
555
606
  end
@@ -561,12 +612,12 @@ module Glimmer
561
612
  return if child.nil?
562
613
  tab_folder1 = @tab_folder1 || @tab_folder
563
614
  tab_folder2 = @tab_folder2
564
- open_file_paths1 = tab_folder1&.swt_widget&.items&.to_a.map {|i| i.get_data('file_path')}
565
- open_file_paths2 = tab_folder2&.swt_widget&.items&.to_a.map {|i| i.get_data('file_path')}
615
+ open_file_paths1 = tab_folder1&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
616
+ open_file_paths2 = tab_folder2&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
566
617
  @config = {
567
618
  selected_child_path: child.path,
568
619
  caret_position: child.caret_position,
569
- top_index: child.top_index,
620
+ top_pixel: child.top_pixel,
570
621
  shell_width: swt_widget&.getBounds&.width,
571
622
  shell_height: swt_widget&.getBounds&.height,
572
623
  shell_x: swt_widget&.getBounds&.x,
@@ -16,13 +16,13 @@ module Glimmer
16
16
  composite {
17
17
  layout_data :fill, :fill, true, true
18
18
  grid_layout 2, false
19
- @line_numbers_text = text(:multi) {
19
+ @line_numbers_text = code_text(:border, :multi) {
20
20
  layout_data(:right, :fill, false, true)
21
21
  font name: 'Consolas', height: OS.mac? ? 15 : 12
22
22
  background color(:widget_background)
23
23
  foreground rgb(75, 75, 75)
24
24
  text bind(file, 'line_numbers_content')
25
- top_index bind(file, 'top_index', read_only: true)
25
+ top_pixel bind(file, 'top_pixel', read_only: true)
26
26
  on_focus_gained {
27
27
  @text&.swt_widget.setFocus
28
28
  }
@@ -33,15 +33,15 @@ module Glimmer
33
33
  @text&.swt_widget.setFocus
34
34
  }
35
35
  }
36
- @text = text(:multi, :border, :h_scroll, :v_scroll) {
36
+
37
+ @text = code_text {
37
38
  layout_data :fill, :fill, true, true
38
39
  font name: 'Consolas', height: OS.mac? ? 15 : 12
39
40
  foreground rgb(75, 75, 75)
40
41
  text bind(file, :content)
41
42
  focus true
42
- selection bind(file, 'selection')
43
- selection_count bind(file, 'selection_count')
44
- top_index bind(file, 'top_index')
43
+ selection bind(file, :selection)
44
+ top_pixel bind(file, :top_pixel)
45
45
  drop_target(DND::DROP_COPY) {
46
46
  transfer [TextTransfer.getInstance].to_java(Transfer)
47
47
  on_drag_enter { |event|
@@ -57,12 +57,21 @@ module Glimmer
57
57
 
58
58
  on_focus_lost {
59
59
  file&.write_dirty_content
60
- }
61
- on_key_pressed { |key_event|
60
+ }
61
+ on_verify_key { |key_event|
62
62
  if (Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'z') || (key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'y')
63
63
  key_event.doit = !Command.redo(file)
64
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'r'
65
+ Dir.local_dir.selected_child.write_dirty_content
66
+ begin
67
+ load Dir.local_dir.selected_child.path
68
+ rescue => e
69
+ puts e.full_message
70
+ end
64
71
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'z'
65
72
  key_event.doit = !Command.undo(file)
73
+ elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'a'
74
+ key_event.widget.selectAll
66
75
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == '/'
67
76
  Command.do(file, :comment_line!)
68
77
  key_event.doit = false
@@ -105,13 +114,13 @@ module Glimmer
105
114
  end
106
115
  }
107
116
  on_verify_text { |verify_event|
108
- key_code = verify_event.keyCode
109
- case key_code
110
- when swt(:cr)
117
+ # TODO convert these into File commands to support Undo/Redo
118
+ case verify_event.text
119
+ when "\n"
111
120
  if file.selection_count.to_i == 0
112
121
  verify_event.text += file.current_line_indentation
113
122
  end
114
- when swt(:tab)
123
+ when "\t"
115
124
  if file.selection_count.to_i > 0
116
125
  Command.do(file, :indent!)
117
126
  verify_event.doit = false
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-cs-gladiator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-11 00:00:00.000000000 Z
11
+ date: 2020-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 4.17.2.0
18
+ version: 4.17.4.2
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
21
  version: 5.0.0.0
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 4.17.2.0
29
+ version: 4.17.4.2
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: 5.0.0.0