flutter 0.2.4 → 0.2.6

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: 0137e88be0b2d6f99518bde9e33497eb948d824778661410538a72b0bf852c97
4
- data.tar.gz: 2842efb0848b384af7b2f23fa12c0974c229c72bc43d02b54e8866c85a4124f7
3
+ metadata.gz: 2470e3d751dcee88e34d5954533cd0e27eabed7bc2da3f125e44455491e024ee
4
+ data.tar.gz: 27c405a255544315c4e27792351cefcbacab177308793973396be672f94ad007
5
5
  SHA512:
6
- metadata.gz: 2ac30e5299a8127650b95b7178b38a3d7b949c5d1c65674163d9c89c2e18f676b47acb4a3a20887b3ce9d13cf108f5365b81a95a917bd7e0eba339c9f6c3fddd
7
- data.tar.gz: a3b8bfeab3a7681616e7aac4af9d086d60b3a0b783beaf50e15499e3e7575876a2eb68ae89c31d6a3c4b3ce98d4b0c3f0dfdce536cdf49da5e45ebbafafc1133
6
+ metadata.gz: d5b4d52b2afc31b98c1103a11bdc95cf53ac932ce7498f8488f6dc352f04cf1396bc4fb00a13d735fd719651a7b6728b1f03ec7dc0ca6465b4404ba0ef4e8376
7
+ data.tar.gz: 3857beb1103a0d64d7a31d3de1c1b1c5da7ff7a3c5d71d84b43d9d422d94a0a81a1f0a0eb3bf359ef6786803d097ed4da9575f592739328487b9acbc480db12f
data/CHANGELOG.md CHANGED
@@ -5,6 +5,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## Unreleased
8
+ ## 0.2.6 - 2022-10-14
9
+ ### Added
10
+ - Backward compatibilty hack for default values in `dry-configurable < 0.13`
11
+
12
+ ## 0.2.5 - 2022-10-13
13
+ ### Added
14
+ - Explicit dependency on `pry` for reflecting sources of methods
15
+ - Use source hints from coverage to include dynamically added classes in signature generation
16
+
8
17
  ## 0.2.4 - 2022-10-04
9
18
  ### Changed
10
19
  - Relax version requirement for dry-configurable
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![CI](https://github.com/indydevs/flutter/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/indydevs/flutter/actions/workflows/main.yml)
4
4
  [![codecov](https://codecov.io/github/indydevs/flutter/branch/main/graph/badge.svg?token=XANF37D9C1)](https://codecov.io/github/indydevs/flutter)
5
5
  [![Gem](https://img.shields.io/gem/v/flutter)](https://rubygems.org/gems/flutter)
6
- [![Docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://flutter.indydevs.org)
6
+ [![Docs](https://img.shields.io/badge/yard-docs-blue.svg)](https://flutter.indydevs.org)
7
7
 
8
8
  ```
9
9
  __ __
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/configurable"
4
+ require "dry/configurable/version"
4
5
  require_relative "persistence"
5
6
 
6
7
  module Flutter
@@ -11,12 +12,26 @@ module Flutter
11
12
  def included(other)
12
13
  other.extend(Dry::Configurable)
13
14
  other.class_eval do
14
- setting(:enabled, default: false, reader: true)
15
- setting(:sources, default: Set.new(["#{Dir.pwd}/*"]))
16
- setting(:exclusions, default: Set.new(["./vendor/*"]))
17
- setting(:storage_class, default: Flutter::Persistence::Marshal)
18
- setting(:storage_options, default: { path: "./.flutter" })
19
- setting(:reset_storage, default: false)
15
+ # dry-configurable versions < 0.13 expect default values
16
+ # as the second parameter, whereas newer versions have started
17
+ # deprecating passing the default value as a non keyword argument.
18
+ if Dry::Configurable::VERSION >= "0.13"
19
+ setting(:enabled, default: false, reader: true)
20
+ setting(:sources, default: Set.new(["#{Dir.pwd}/*"]))
21
+ setting(:exclusions, default: Set.new(["./vendor/*"]))
22
+ setting(:storage_class, default: Flutter::Persistence::Marshal)
23
+ setting(:storage_options, default: { path: "./.flutter" })
24
+ setting(:reset_storage, default: false)
25
+ else
26
+ # :nocov:
27
+ setting(:enabled, false, reader: true)
28
+ setting(:sources, Set.new(["#{Dir.pwd}/*"]))
29
+ setting(:exclusions, Set.new(["./vendor/*"]))
30
+ setting(:storage_class, Flutter::Persistence::Marshal)
31
+ setting(:storage_options, { path: "./.flutter" })
32
+ setting(:reset_storage, false)
33
+ # :nocov:
34
+ end
20
35
  end
21
36
  end
22
37
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pry"
3
4
  require_relative "tracker"
4
5
 
5
6
  begin
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "parser/current"
4
+ require "pry"
4
5
  require "digest/sha1"
5
6
  require "set"
6
7
 
@@ -13,9 +14,9 @@ module Flutter
13
14
  attr_reader :method_cache
14
15
  end
15
16
 
16
- def initialize(file)
17
+ def initialize(file, hints = [])
17
18
  @signatures = {}
18
- @targets = Set.new
19
+ @targets = Set.new(hints)
19
20
  if File.exist?(file)
20
21
  code = File.open(file, "r").read
21
22
  @file = File.absolute_path(file)
@@ -70,6 +71,8 @@ module Flutter
70
71
  hash = source_hash(instance.instance_method(method))
71
72
  ["#{container}:#{method}", hash] if hash
72
73
  end.compact.to_h)
74
+ rescue NameError
75
+ next
73
76
  rescue
74
77
  warn("Failed to parse #{@file}")
75
78
  break
@@ -30,11 +30,17 @@ module Flutter
30
30
  end
31
31
 
32
32
  # Mapping of +source file -> callable_id -> signature+
33
- # @return [Hash<String, Hash<String, String>>] mapping
33
+ # @return [Hash<String, Hash<String, String>>]
34
34
  def source_mapping
35
35
  raise NotImplementedError
36
36
  end
37
37
 
38
+ # Mapping of +source file -> class or module
39
+ # @return [Hash<String, Set<String>]
40
+ def source_hints
41
+ raise NotImplementedError
42
+ end
43
+
38
44
  ##
39
45
  # Update {#test_mapping}
40
46
  #
@@ -47,7 +53,8 @@ module Flutter
47
53
  # Update {#source_mapping}
48
54
  #
49
55
  # @param [Hash<String, Hash<String, String>>] mapping
50
- def update_source_mapping!(mapping)
56
+ # @param [Hash<String, Hash<String, String>>] hints
57
+ def update_source_mapping!(mapping, hints)
51
58
  raise NotImplementedError
52
59
  end
53
60
 
@@ -103,14 +110,20 @@ module Flutter
103
110
  @state.fetch(:source_mapping) { @state[:source_mapping] = {} }
104
111
  end
105
112
 
113
+ # (see AbstractStorage#source_hints)
114
+ def source_hints
115
+ @state.fetch(:source_hints) { @state[:source_hints] = {} }
116
+ end
117
+
106
118
  # (see AbstractStorage#update_test_mapping!)
107
119
  def update_test_mapping!(mapping)
108
120
  test_mapping.merge!(mapping)
109
121
  end
110
122
 
111
123
  # (see AbstractStorage#update_source_mapping!)
112
- def update_source_mapping!(mapping)
124
+ def update_source_mapping!(mapping, hints)
113
125
  source_mapping.merge!(mapping)
126
+ source_hints.merge!(hints)
114
127
  end
115
128
 
116
129
  # (see AbstractStorage#clear!)
@@ -153,14 +166,21 @@ module Flutter
153
166
  # (see AbstractStorage#test_mapping)
154
167
  def test_mapping
155
168
  @state.transaction do
156
- return @state[:test_mapping]
169
+ return @state[:test_mapping] || {}
157
170
  end
158
171
  end
159
172
 
160
173
  # (see AbstractStorage#source_mapping)
161
174
  def source_mapping
162
175
  @state.transaction do
163
- return @state[:source_mapping]
176
+ return @state[:source_mapping] || {}
177
+ end
178
+ end
179
+
180
+ # (see AbstractStorage#source_hints)
181
+ def source_hints
182
+ @state.transaction do
183
+ return @state[:source_hints] || {}
164
184
  end
165
185
  end
166
186
 
@@ -173,10 +193,12 @@ module Flutter
173
193
  end
174
194
 
175
195
  # (see AbstractStorage#update_source_mapping!)
176
- def update_source_mapping!(mapping)
196
+ def update_source_mapping!(mapping, hints)
177
197
  @state.transaction do
178
198
  @state[:source_mapping] ||= {}
199
+ @state[:source_hints] ||= {}
179
200
  @state[:source_mapping].merge!(mapping)
201
+ @state[:source_hints].merge!(hints)
180
202
  end
181
203
  end
182
204
 
data/lib/flutter/rspec.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pry"
3
4
  require_relative "tracker"
4
5
 
5
6
  module Flutter
@@ -4,7 +4,6 @@ require "deep_merge"
4
4
  require "set"
5
5
  require_relative "persistence"
6
6
  require_relative "parser"
7
- require "pry"
8
7
 
9
8
  module Flutter
10
9
  # @attr [Hash<String, Hash<String, Set<String>>>] test_mapping Mapping of tests to
@@ -33,6 +32,7 @@ module Flutter
33
32
  @path_mapping = {}
34
33
  @method_prefixes = {}
35
34
  @tracked_files = {}
35
+ @source_hints = @storage.source_hints
36
36
  end
37
37
 
38
38
  # Starts tracking calls made by +test+
@@ -80,7 +80,7 @@ module Flutter
80
80
 
81
81
  sources = @test_mapping[test]
82
82
  sources.map do |file, methods|
83
- @current_source_mapping[file] ||= Flutter::Parser.new(file).signatures
83
+ @current_source_mapping[file] ||= Flutter::Parser.new(file, @source_hints[file]).signatures
84
84
  methods.map do |method|
85
85
  @source_mapping.dig(file, method) == @current_source_mapping.dig(file, method)
86
86
  end.all?
@@ -93,7 +93,7 @@ module Flutter
93
93
  # @return [void]
94
94
  def persist!
95
95
  @storage.update_test_mapping!(@test_mapping)
96
- @storage.update_source_mapping!(generate_source_mapping)
96
+ @storage.update_source_mapping!(generate_source_mapping, @source_hints)
97
97
  @storage.persist!
98
98
  end
99
99
 
@@ -119,11 +119,12 @@ module Flutter
119
119
 
120
120
  if tracked?(tracepoint.path, tracepoint.callee_id)
121
121
  rel_path = relative_path(tracepoint.path)
122
- prefix = method_prefix(tracepoint.defined_class)
122
+ class_name, seperator = method_prefix(tracepoint.defined_class).values_at(:class, :seperator)
123
+ @source_hints.fetch(rel_path) { @source_hints[rel_path] = Set.new } << class_name if class_name
123
124
  @test_mapping.fetch(test) do
124
125
  @test_mapping[test] = {}
125
126
  end.fetch(rel_path) { @test_mapping[test][rel_path] = Set.new } << (
126
- prefix ? "#{prefix}#{tracepoint.callee_id}" : tracepoint.callee_id
127
+ class_name ? "#{class_name}#{seperator}#{tracepoint.callee_id}" : tracepoint.callee_id
127
128
  )
128
129
  end
129
130
  end
@@ -133,22 +134,22 @@ module Flutter
133
134
  end
134
135
 
135
136
  ##
136
- # Returns a prefix based on Tracepoint.defined_class
137
+ # Returns a (class name, separator) prefix based on Tracepoint.defined_class
137
138
  #
138
139
  # @param [Class] tracepoint_class
139
- # @return [String]
140
+ # @return [Hash<Symbol, String>]
140
141
  #
141
142
  def method_prefix(tracepoint_class)
142
- return unless tracepoint_class
143
+ return { class: nil, seperator: nil } unless tracepoint_class
143
144
 
144
145
  @method_prefixes[tracepoint_class] ||= if tracepoint_class.to_s.start_with?("#<Class")
145
146
  if tracepoint_class.superclass.name && tracepoint_class.to_s.include?(tracepoint_class.superclass.name)
146
- "#{tracepoint_class.superclass.name}::"
147
+ { class: tracepoint_class.superclass.name, separator: "::" }
147
148
  else
148
- tracepoint_class.to_s.sub(/#<Class:(.*?)(\(.*?\))?>/, '\1::')
149
+ { class: tracepoint_class.to_s.sub(/#<Class:(.*?)(\(.*?\))?>/, '\1'), separator: "::" }
149
150
  end
150
151
  else
151
- "#{tracepoint_class.name}:"
152
+ { class: tracepoint_class.name, seperator: ":" }
152
153
  end
153
154
  end
154
155
 
@@ -173,7 +174,7 @@ module Flutter
173
174
  # @return [Hash<String, Hash<String, Hash<String, String>>>]
174
175
  def generate_source_mapping
175
176
  @test_mapping.map { |_k, v| v.keys }.flatten.uniq.map do |file|
176
- [file, @current_source_mapping.fetch(file) { Flutter::Parser.new(file).signatures }]
177
+ [file, @current_source_mapping.fetch(file) { Flutter::Parser.new(file, @source_hints[file] || []).signatures }]
177
178
  end.to_h.deep_merge(@test_source_mapping)
178
179
  end
179
180
  end
@@ -3,5 +3,5 @@
3
3
  # :nocov:
4
4
 
5
5
  module Flutter
6
- VERSION = "0.2.4"
6
+ VERSION = "0.2.6"
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flutter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ali-Akber Saifee
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-10-04 00:00:00.000000000 Z
12
+ date: 2022-10-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: deep_merge
@@ -53,6 +53,20 @@ dependencies:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '3.1'
56
+ - !ruby/object:Gem::Dependency
57
+ name: pry
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '0.13'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0.13'
56
70
  description: "Plug in for RSpec & Minitest test suites\n to run only the tests that
57
71
  exercise the code that has changed\n "
58
72
  email: