flutter 0.2.4 → 0.2.6

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
  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: