solargraph 0.54.1 → 0.54.2

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: d6619265fc1ba2cab9154e70c5f4a6626999b685d58e26a805ec606d6804f17b
4
- data.tar.gz: cfac32a13734ba9b392d27fcb8da7c76b180f0bf64189d17698b2246ce6e3773
3
+ metadata.gz: 17844968917df55d45751cbe82fa1f59e72f4dbfe7ecce04f73dbccbc1ec2aeb
4
+ data.tar.gz: 1b86c653e3b5c145f1b0aa9c614f136bd6d75c305aeac680f0cfe992ca4ff3dc
5
5
  SHA512:
6
- metadata.gz: 8d1d40bf5d19b37f6a2ee8cce73e36027140ae402d27326c15e39a961217153e8b269722503ca0a8a3b592bee50cb6227fffcd812f62a1ec8a1bf94219270eea
7
- data.tar.gz: 627df7fb0bd23b641f0b1a40434a6384def8f32bf318b4f92d243266ee0c3145059adc29ea487dcdc30c914045e5737bca92bff6bd67fd06527f97c2e4690fb8
6
+ metadata.gz: 44d428aa78d2d82bcfb97b650acd72aaf904666702a59e13a87f1a4c4c8bb2fa171afe6f502fb7327a67f12854a3953fccee1fde95f75fc5cf4b4f8742683e8e
7
+ data.tar.gz: ce37d473c9e3b8decd9c97c868fb66ef8441e27aeb10b557abf345bba1ad9c96c8dc5657127ea9680dfa60f59da7663f25ccffed412d5683b272ea3dbf823f76
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 0.54.2 - April 28, 2025
2
+ - Resolve generics correctly on mixin inclusion (#898)
3
+ - Pick correct String#split overload (#905)
4
+ - Fix type sent into YARD method (#912)
5
+ - Early CancelRequest handling (#914)
6
+ - Destructure partial yield types (#915)
7
+ - Dependency versions (#916)
8
+
1
9
  ## 0.54.1 - April 26, 2025
2
10
  - Retire more RubyVM-specific code (#797)
3
11
  - Add additional docs for key classes, modules and methods (#802)
@@ -284,8 +284,8 @@ module Solargraph
284
284
  get_path_pins(pin.path.sub(/#initialize/, '.new')).first
285
285
  end
286
286
  (ovr.tags.map(&:tag_name) + ovr.delete).uniq.each do |tag|
287
- pin.docstring.delete_tags tag.to_sym
288
- new_pin.docstring.delete_tags tag.to_sym if new_pin
287
+ pin.docstring.delete_tags tag
288
+ new_pin.docstring.delete_tags tag if new_pin
289
289
  end
290
290
  ovr.tags.each do |tag|
291
291
  pin.docstring.add_tag(tag)
@@ -96,6 +96,9 @@ module Solargraph
96
96
  self
97
97
  end
98
98
 
99
+ # @todo need to model type def statement in chains as a symbol so
100
+ # that this overload of 'protected' will typecheck @sg-ignore
101
+ # @sg-ignore
99
102
  protected def equality_fields
100
103
  [self.class, @source_map_hash, implicit, @doc_map, @unresolved_requires, @missing_docs]
101
104
  end
@@ -341,6 +344,9 @@ module Solargraph
341
344
  # @param deep [Boolean] True to include superclasses, mixins, etc.
342
345
  # @return [Array<Solargraph::Pin::Method>]
343
346
  def get_methods rooted_tag, scope: :instance, visibility: [:public], deep: true
347
+ rooted_type = ComplexType.try_parse(rooted_tag)
348
+ fqns = rooted_type.namespace
349
+ namespace_pin = store.get_path_pins(fqns).select { |p| p.is_a?(Pin::Namespace) }.first
344
350
  cached = cache.get_methods(rooted_tag, scope, visibility, deep)
345
351
  return cached.clone unless cached.nil?
346
352
  result = []
@@ -380,9 +386,12 @@ module Solargraph
380
386
  result.concat inner_get_methods('Kernel', :instance, [:public], deep, skip) if visibility.include?(:private)
381
387
  result.concat inner_get_methods('Module', scope, visibility, deep, skip) if scope == :module
382
388
  end
383
- resolved = resolve_method_aliases(result, visibility)
384
- cache.set_methods(rooted_tag, scope, visibility, deep, resolved)
385
- resolved
389
+ result = resolve_method_aliases(result, visibility)
390
+ if namespace_pin && rooted_tag != rooted_type.name
391
+ result = result.map { |method_pin| method_pin.resolve_generics(namespace_pin, rooted_type) }
392
+ end
393
+ cache.set_methods(rooted_tag, scope, visibility, deep, result)
394
+ result
386
395
  end
387
396
 
388
397
  # Get an array of method pins for a complex type.
@@ -438,8 +447,13 @@ module Solargraph
438
447
  # @param name [String] Method name to look up
439
448
  # @param scope [Symbol] :instance or :class
440
449
  # @return [Array<Solargraph::Pin::Method>]
441
- def get_method_stack rooted_tag, name, scope: :instance
442
- get_methods(rooted_tag, scope: scope, visibility: [:private, :protected, :public]).select { |p| p.name == name }
450
+ def get_method_stack rooted_tag, name, scope: :instance, visibility: [:private, :protected, :public], preserve_generics: false
451
+ rooted_type = ComplexType.parse(rooted_tag)
452
+ fqns = rooted_type.namespace
453
+ namespace_pin = store.get_path_pins(fqns).select { |p| p.is_a?(Pin::Namespace) }.first
454
+ methods = get_methods(rooted_tag, scope: scope, visibility: visibility).select { |p| p.name == name }
455
+ methods = erase_generics(namespace_pin, rooted_type, methods) unless preserve_generics
456
+ methods
443
457
  end
444
458
 
445
459
  # Get an array of all suggestions that match the specified path.
@@ -601,6 +615,7 @@ module Solargraph
601
615
  rooted_type = ComplexType.parse(rooted_tag).force_rooted
602
616
  fqns = rooted_type.namespace
603
617
  fqns_generic_params = rooted_type.all_params
618
+ namespace_pin = store.get_path_pins(fqns).select { |p| p.is_a?(Pin::Namespace) }.first
604
619
  return [] if no_core && fqns =~ /^(Object|BasicObject|Class|Module)$/
605
620
  reqstr = "#{fqns}|#{scope}|#{visibility.sort}|#{deep}"
606
621
  return [] if skip.include?(reqstr)
@@ -615,15 +630,7 @@ module Solargraph
615
630
  # Store#get_methods doesn't know about full tags, just
616
631
  # namespaces; resolving the generics in the method pins is this
617
632
  # class' responsibility
618
- raw_methods = store.get_methods(fqns, scope: scope, visibility: visibility).sort{ |a, b| a.name <=> b.name }
619
- namespace_pin = store.get_path_pins(fqns).select { |p| p.is_a?(Pin::Namespace) }.first
620
- methods = if namespace_pin && rooted_tag != fqns
621
- methods = raw_methods.map do |method_pin|
622
- method_pin.resolve_generics(namespace_pin, rooted_type)
623
- end
624
- else
625
- raw_methods
626
- end
633
+ methods = store.get_methods(fqns, scope: scope, visibility: visibility).sort{ |a, b| a.name <=> b.name }
627
634
  result.concat methods
628
635
  if deep
629
636
  if scope == :instance
@@ -809,11 +816,48 @@ module Solargraph
809
816
  name: pin.name,
810
817
  comments: origin.comments,
811
818
  scope: origin.scope,
819
+ # context: pin.context,
812
820
  visibility: origin.visibility,
813
821
  signatures: origin.signatures,
814
- attribute: origin.attribute?
822
+ attribute: origin.attribute?,
823
+ generics: origin.generics,
824
+ return_type: origin.return_type,
815
825
  }
816
826
  Pin::Method.new **args
817
827
  end
828
+
829
+ include Logging
830
+
831
+ private
832
+
833
+ # @param namespace_pin [Pin::Namespace]
834
+ # @param rooted_type [ComplexType]
835
+ # @param pins [Enumerable<Pin::Base>]
836
+ # @return [Array<Pin::Base>]
837
+ def erase_generics(namespace_pin, rooted_type, pins)
838
+ return pins unless should_erase_generics_when_done?(namespace_pin, rooted_type)
839
+
840
+ logger.debug("Erasing generics on namespace_pin=#{namespace_pin} / rooted_type=#{rooted_type}")
841
+ pins.map do |method_pin|
842
+ method_pin.erase_generics(namespace_pin.generics)
843
+ end
844
+ end
845
+
846
+ # @param namespace_pin [Pin::Namespace]
847
+ # @param rooted_type [ComplexType]
848
+ def should_erase_generics_when_done?(namespace_pin, rooted_type)
849
+ has_generics?(namespace_pin) && !can_resolve_generics?(namespace_pin, rooted_type)
850
+ end
851
+
852
+ # @param namespace_pin [Pin::Namespace]
853
+ def has_generics?(namespace_pin)
854
+ namespace_pin && !namespace_pin.generics.empty?
855
+ end
856
+
857
+ # @param namespace_pin [Pin::Namespace]
858
+ # @param rooted_type [ComplexType]
859
+ def can_resolve_generics?(namespace_pin, rooted_type)
860
+ has_generics?(namespace_pin) && !rooted_type.all_params.empty?
861
+ end
818
862
  end
819
863
  end
@@ -129,6 +129,13 @@ module Solargraph
129
129
  end.call
130
130
  end
131
131
 
132
+ def namespace_type
133
+ return ComplexType.parse('::Object') if duck_type?
134
+ return ComplexType.parse('::NilClass') if nil_type?
135
+ return subtypes.first if (name == 'Class' || name == 'Module') && !subtypes.empty?
136
+ self
137
+ end
138
+
132
139
  # @return [String]
133
140
  def rooted_namespace
134
141
  return namespace unless rooted? && can_root_name?(namespace)
@@ -3,12 +3,14 @@
3
3
  module Solargraph
4
4
  module LanguageServer
5
5
  class Host
6
- # A serial worker Thread to handle message.
7
- #
8
- # this make check pending message possible, and maybe cancelled to speedup process
6
+ # A serial worker Thread to handle incoming messages.
9
7
  #
10
8
  class MessageWorker
11
- UPDATE_METHODS = ['textDocument/didOpen', 'textDocument/didChange', 'workspace/didChangeWatchedFiles'].freeze
9
+ UPDATE_METHODS = [
10
+ 'textDocument/didOpen',
11
+ 'textDocument/didChange',
12
+ 'workspace/didChangeWatchedFiles'
13
+ ].freeze
12
14
 
13
15
  # @param host [Host]
14
16
  def initialize(host)
@@ -64,12 +66,24 @@ module Solargraph
64
66
  private
65
67
 
66
68
  def next_message
69
+ cancel_message || next_priority
70
+ end
71
+
72
+ def cancel_message
73
+ # Handle cancellations first
74
+ idx = messages.find_index { |msg| msg['method'] == '$/cancelRequest' }
75
+ return unless idx
76
+
77
+ msg = messages[idx]
78
+ messages.delete_at idx
79
+ msg
80
+ end
81
+
82
+ def next_priority
67
83
  # Prioritize updates and version-dependent messages for performance
68
84
  idx = messages.find_index do |msg|
69
85
  UPDATE_METHODS.include?(msg['method']) || version_dependent?(msg)
70
86
  end
71
- # @todo We might want to clear duplicate instances of this message
72
- # that occur before the next update
73
87
  return messages.shift unless idx
74
88
 
75
89
  msg = messages[idx]
@@ -24,10 +24,8 @@ module Solargraph
24
24
  attr_writer :client_capabilities
25
25
 
26
26
  def initialize
27
- @cancel_semaphore = Mutex.new
28
27
  @buffer_semaphore = Mutex.new
29
28
  @request_mutex = Mutex.new
30
- @cancel = []
31
29
  @buffer = String.new
32
30
  @stopped = true
33
31
  @next_request_id = 1
@@ -65,7 +63,7 @@ module Solargraph
65
63
  # @param id [Integer]
66
64
  # @return [void]
67
65
  def cancel id
68
- @cancel_semaphore.synchronize { @cancel.push id }
66
+ cancelled.push id
69
67
  end
70
68
 
71
69
  # True if the host received a request to cancel the method with the
@@ -74,9 +72,7 @@ module Solargraph
74
72
  # @param id [Integer]
75
73
  # @return [Boolean]
76
74
  def cancel? id
77
- result = false
78
- @cancel_semaphore.synchronize { result = @cancel.include? id }
79
- result
75
+ cancelled.include? id
80
76
  end
81
77
 
82
78
  # Delete the specified ID from the list of cancelled IDs if it exists.
@@ -84,7 +80,7 @@ module Solargraph
84
80
  # @param id [Integer]
85
81
  # @return [void]
86
82
  def clear id
87
- @cancel_semaphore.synchronize { @cancel.delete id }
83
+ cancelled.delete id
88
84
  end
89
85
 
90
86
  # Called by adapter, to handle the request
@@ -101,11 +97,11 @@ module Solargraph
101
97
  # @return [Solargraph::LanguageServer::Message::Base, nil] The message handler.
102
98
  def receive request
103
99
  if request['method']
104
- logger.info "Server received #{request['method']}"
100
+ logger.info "Host received ##{request['id']} #{request['method']}"
105
101
  logger.debug request
106
102
  message = Message.select(request['method']).new(self, request)
107
103
  begin
108
- message.process
104
+ message.process unless cancel?(request['id'])
109
105
  rescue StandardError => e
110
106
  logger.warn "Error processing request: [#{e.class}] #{e.message}"
111
107
  logger.warn e.backtrace.join("\n")
@@ -381,7 +377,6 @@ module Solargraph
381
377
  envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
382
378
  queue envelope
383
379
  @next_request_id += 1
384
- logger.info "Server sent #{method}"
385
380
  logger.debug params
386
381
  end
387
382
  end
@@ -693,6 +688,11 @@ module Solargraph
693
688
 
694
689
  private
695
690
 
691
+ # @return [Array<Integer>]
692
+ def cancelled
693
+ @cancelled ||= []
694
+ end
695
+
696
696
  # @return [MessageWorker]
697
697
  def message_worker
698
698
  @message_worker ||= MessageWorker.new(self)
@@ -61,18 +61,11 @@ module Solargraph
61
61
  # @return [void]
62
62
  def send_response
63
63
  return if id.nil?
64
- if host.cancel?(id)
65
- # https://microsoft.github.io/language-server-protocol/specifications/specification-current/#cancelRequest
66
- # cancel should send response RequestCancelled
67
- Solargraph::Logging.logger.info "Cancelled response to #{method}"
68
- set_result nil
69
- set_error ErrorCodes::REQUEST_CANCELLED, "cancelled by client"
70
- else
71
- Solargraph::Logging.logger.info "Sending response to #{method}"
72
- end
64
+
65
+ accept_or_cancel
73
66
  response = {
74
- jsonrpc: "2.0",
75
- id: id,
67
+ jsonrpc: '2.0',
68
+ id: id
76
69
  }
77
70
  response[:result] = result unless result.nil?
78
71
  response[:error] = error unless error.nil?
@@ -83,6 +76,20 @@ module Solargraph
83
76
  host.queue envelope
84
77
  host.clear id
85
78
  end
79
+
80
+ private
81
+
82
+ def accept_or_cancel
83
+ if host.cancel?(id)
84
+ # https://microsoft.github.io/language-server-protocol/specifications/specification-current/#cancelRequest
85
+ # cancel should send response RequestCancelled
86
+ Solargraph::Logging.logger.info "Cancelled response to ##{id} #{method}"
87
+ set_result nil
88
+ set_error ErrorCodes::REQUEST_CANCELLED, 'Cancelled by client'
89
+ else
90
+ Solargraph::Logging.logger.info "Sending response to ##{id} #{method}"
91
+ end
92
+ end
86
93
  end
87
94
  end
88
95
  end
@@ -12,9 +12,6 @@ module Solargraph
12
12
  col = params['position']['character']
13
13
  begin
14
14
  completion = host.completions_at(params['textDocument']['uri'], line, col)
15
- if host.cancel?(id)
16
- return set_result(empty_result) if host.cancel?(id)
17
- end
18
15
  items = []
19
16
  last_context = nil
20
17
  idx = -1
@@ -650,7 +650,6 @@ module Solargraph
650
650
  return if @sync_count == 0
651
651
 
652
652
  mutex.synchronize do
653
- logger.warn "CATALOG"
654
653
  logger.info "Cataloging #{workspace.directory.empty? ? 'generic workspace' : workspace.directory}"
655
654
  api_map.catalog bench
656
655
  source_map_hash.values.each { |map| find_external_requires(map) }
@@ -71,8 +71,7 @@ module Solargraph
71
71
  # @param context_type [ComplexType] The receiver type
72
72
  # @return [self]
73
73
  def resolve_generics definitions, context_type
74
- transformed = transform_types { |t| t.resolve_generics(definitions, context_type) if t }
75
- transformed.erase_generics(definitions.generics)
74
+ transform_types { |t| t.resolve_generics(definitions, context_type) if t }
76
75
  end
77
76
 
78
77
  def all_rooted?
@@ -36,14 +36,12 @@ module Solargraph
36
36
  #
37
37
  # @return [::Array<ComplexType>]
38
38
  def destructure_yield_types(yield_types, parameters)
39
- return yield_types if yield_types.length == parameters.length
40
-
41
39
  # yielding a tuple into a block will destructure the tuple
42
40
  if yield_types.length == 1
43
41
  yield_type = yield_types.first
44
42
  return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
45
43
  end
46
- parameters.map { ComplexType::UNDEFINED }
44
+ parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
47
45
  end
48
46
 
49
47
  # @param api_map [ApiMap]
@@ -80,9 +80,12 @@ module Solargraph
80
80
  # @param closure [Pin::Namespace]
81
81
  # @return [void]
82
82
  def convert_self_type_to_pins decl, closure
83
+ type = build_type(decl.name, decl.args)
84
+ generic_values = type.all_params.map(&:to_s)
83
85
  include_pin = Solargraph::Pin::Reference::Include.new(
84
86
  name: decl.name.relative!.to_s,
85
87
  type_location: location_decl_to_pin_location(decl.location),
88
+ generic_values: generic_values,
86
89
  closure: closure
87
90
  )
88
91
  pins.push include_pin
@@ -628,9 +631,12 @@ module Solargraph
628
631
  def add_mixins decl, namespace
629
632
  decl.each_mixin do |mixin|
630
633
  klass = mixin.is_a?(RBS::AST::Members::Include) ? Pin::Reference::Include : Pin::Reference::Extend
634
+ type = build_type(mixin.name, mixin.args)
635
+ generic_values = type.all_params.map(&:to_s)
631
636
  pins.push klass.new(
632
637
  name: mixin.name.relative!.to_s,
633
- location: location_decl_to_pin_location(mixin.location),
638
+ type_location: location_decl_to_pin_location(mixin.location),
639
+ generic_values: generic_values,
634
640
  closure: namespace
635
641
  )
636
642
  end
@@ -42,8 +42,8 @@ module Solargraph
42
42
  end
43
43
  return inferred_pins(found, api_map, name_pin, locals) unless found.empty?
44
44
  pins = name_pin.binder.each_unique_type.flat_map do |context|
45
- method_context = context.namespace == '' ? '' : context.tag
46
- api_map.get_method_stack(method_context, word, scope: context.scope)
45
+ ns = context.namespace == '' ? '' : context.namespace_type.tag
46
+ api_map.get_method_stack(ns, word, scope: context.scope)
47
47
  end
48
48
  return [] if pins.empty?
49
49
  inferred_pins(pins, api_map, name_pin, locals)
@@ -81,10 +81,12 @@ module Solargraph
81
81
  break
82
82
  end
83
83
  atype = atypes[idx] ||= arg.infer(api_map, Pin::ProxyType.anonymous(name_pin.context), locals)
84
- ptype = param.return_type
84
+ # make sure we get types from up the method
85
+ # inheritance chain if we don't have them on this pin
86
+ ptype = param.typify api_map
85
87
  # @todo Weak type comparison
86
88
  # unless atype.tag == param.return_type.tag || api_map.super_and_sub?(param.return_type.tag, atype.tag)
87
- unless param.return_type.undefined? || atype.name == param.return_type.name || api_map.super_and_sub?(param.return_type.name, atype.name) || param.return_type.generic?
89
+ unless ptype.undefined? || atype.name == ptype.name || ptype.any? { |current_ptype| api_map.super_and_sub?(current_ptype.name, atype.name) } || ptype.generic? || param.restarg?
88
90
  match = false
89
91
  break
90
92
  end
@@ -35,6 +35,7 @@ module Solargraph
35
35
  # The part of the word before the current position. Given the text
36
36
  # `foo.bar`, the start_of_word at position(0, 6) is `ba`.
37
37
  #
38
+ # @sg-ignore Improve resolution of String#match below
38
39
  # @return [String]
39
40
  def start_of_word
40
41
  @start_of_word ||= begin
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Solargraph
4
- VERSION = '0.54.1'
4
+ VERSION = '0.54.2'
5
5
  end
data/solargraph.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
  s.required_ruby_version = '>= 3.0'
25
25
 
26
26
  s.add_runtime_dependency 'backport', '~> 1.2'
27
- s.add_runtime_dependency 'benchmark'
27
+ s.add_runtime_dependency 'benchmark', '~> 0.4'
28
28
  s.add_runtime_dependency 'bundler', '~> 2.0'
29
29
  s.add_runtime_dependency 'diff-lcs', '~> 1.4'
30
30
  s.add_runtime_dependency 'jaro_winkler', '~> 1.6'
@@ -35,19 +35,19 @@ Gem::Specification.new do |s|
35
35
  s.add_runtime_dependency 'ostruct', '~> 0.6'
36
36
  s.add_runtime_dependency 'parser', '~> 3.0'
37
37
  s.add_runtime_dependency 'rbs', '~> 3.3'
38
- s.add_runtime_dependency 'reverse_markdown', '>= 2.0', '< 4'
38
+ s.add_runtime_dependency 'reverse_markdown', '~> 3.0'
39
39
  s.add_runtime_dependency 'rubocop', '~> 1.38'
40
40
  s.add_runtime_dependency 'thor', '~> 1.0'
41
41
  s.add_runtime_dependency 'tilt', '~> 2.0'
42
42
  s.add_runtime_dependency 'yard', '~> 0.9', '>= 0.9.24'
43
43
  s.add_runtime_dependency 'yard-solargraph', '~> 0.1'
44
44
 
45
- s.add_development_dependency 'pry'
45
+ s.add_development_dependency 'pry', '~> 0.15'
46
46
  s.add_development_dependency 'public_suffix', '~> 3.1'
47
47
  s.add_development_dependency 'rake', '~> 13.2'
48
48
  s.add_development_dependency 'rspec', '~> 3.5'
49
49
  s.add_development_dependency 'simplecov', '~> 0.14'
50
50
  s.add_development_dependency 'webmock', '~> 3.6'
51
51
  # work around missing yard dependency needed as of Ruby 3.5
52
- s.add_development_dependency 'irb'
52
+ s.add_development_dependency 'irb', '~> 1.15'
53
53
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solargraph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.54.1
4
+ version: 0.54.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Snyder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-04-26 00:00:00.000000000 Z
11
+ date: 2025-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backport
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: benchmark
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '0.4'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '0.4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -182,22 +182,16 @@ dependencies:
182
182
  name: reverse_markdown
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '2.0'
188
- - - "<"
185
+ - - "~>"
189
186
  - !ruby/object:Gem::Version
190
- version: '4'
187
+ version: '3.0'
191
188
  type: :runtime
192
189
  prerelease: false
193
190
  version_requirements: !ruby/object:Gem::Requirement
194
191
  requirements:
195
- - - ">="
196
- - !ruby/object:Gem::Version
197
- version: '2.0'
198
- - - "<"
192
+ - - "~>"
199
193
  - !ruby/object:Gem::Version
200
- version: '4'
194
+ version: '3.0'
201
195
  - !ruby/object:Gem::Dependency
202
196
  name: rubocop
203
197
  requirement: !ruby/object:Gem::Requirement
@@ -278,16 +272,16 @@ dependencies:
278
272
  name: pry
279
273
  requirement: !ruby/object:Gem::Requirement
280
274
  requirements:
281
- - - ">="
275
+ - - "~>"
282
276
  - !ruby/object:Gem::Version
283
- version: '0'
277
+ version: '0.15'
284
278
  type: :development
285
279
  prerelease: false
286
280
  version_requirements: !ruby/object:Gem::Requirement
287
281
  requirements:
288
- - - ">="
282
+ - - "~>"
289
283
  - !ruby/object:Gem::Version
290
- version: '0'
284
+ version: '0.15'
291
285
  - !ruby/object:Gem::Dependency
292
286
  name: public_suffix
293
287
  requirement: !ruby/object:Gem::Requirement
@@ -362,16 +356,16 @@ dependencies:
362
356
  name: irb
363
357
  requirement: !ruby/object:Gem::Requirement
364
358
  requirements:
365
- - - ">="
359
+ - - "~>"
366
360
  - !ruby/object:Gem::Version
367
- version: '0'
361
+ version: '1.15'
368
362
  type: :development
369
363
  prerelease: false
370
364
  version_requirements: !ruby/object:Gem::Requirement
371
365
  requirements:
372
- - - ">="
366
+ - - "~>"
373
367
  - !ruby/object:Gem::Version
374
- version: '0'
368
+ version: '1.15'
375
369
  description: IDE tools for code completion, inline documentation, and static analysis
376
370
  email: admin@castwide.com
377
371
  executables: