flutter 0.2.1 → 0.2.3

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: cbd8d330334676bcfcb2d328466c569bd561ed05a7fd3a45e880cace5670af56
4
- data.tar.gz: 5b4fcd28bb14fa1a6fd5b9c834abbd5bf368c56e7496b574864f2f443d7effb5
3
+ metadata.gz: 0daff4637dd21ecf8d1b03a3a63462f8a4d2cdabd36323348093e4d94dbba057
4
+ data.tar.gz: 6245d89c2e32a14c419dd888822766c2e99e9423d38d57280c6586a357649023
5
5
  SHA512:
6
- metadata.gz: e6720c70a784f3b6862d7bc07749465fbf5834fb1c6b7fe19b76caa7c0fd52bec2e0b79fc9100385dcc878881ec77199f7e8ff34e0105f5d272b806eeb12ef06
7
- data.tar.gz: 4cd2b8a88705a44a6b1f28159e01bc8f0e2aed6f54caf287617d81a2ebd823ddcc02ec0867110f7d38da4c5b3541d491cb366e82fd9d94bad319ca7588c74d6d
6
+ metadata.gz: cc30fd26343a5668793299c43a7361edb635f45f62693a8cbb9383d2eb910dd021cb738746cca92cd56b24a6fecbabb002e4d0e4f2476624aa8d5965ab9271b8
7
+ data.tar.gz: 572a637813788adb8ef674b97381976e3b4e56adc75ba70aa903e20f38bd564b956f092b8e8a1388844f139bf96cea868d18c188d5eb5333dd0f7e4bdeb3c2e1
data/.yardopts ADDED
@@ -0,0 +1,2 @@
1
+ --markup-provider redcarpet
2
+ --markup markdown
data/CHANGELOG.md CHANGED
@@ -5,9 +5,22 @@ 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
- ## Fixed
9
- - Corrected integration examples for guard in README
8
+ ## 0.2.3 - 2022-10-04
9
+ ### Fixed
10
+ - Disable filtering when Flutter.enabled=false
11
+
12
+ ## 0.2.2 - 2022-10-03
13
+ ### Added
14
+ - Document configuration options in README
15
+
16
+ ### Changed
17
+ - Delay requiring source files explicitely and only in the case where the constant cannot be found
18
+ - Ensure the previous test->coverage mapping is merged with current one when the test fails.
19
+
10
20
  ## 0.2.1
21
+ ### Fixed
22
+ - Corrected integration examples for guard in README
23
+
11
24
  ## 0.2.0
12
25
  ### Added
13
26
  - CI Recipe in README
data/Gemfile CHANGED
@@ -6,6 +6,11 @@ gemspec
6
6
 
7
7
  gem "rake", "~> 13.0"
8
8
 
9
+ group :development do
10
+ gem "yard", "~> 0.9.28"
11
+ gem "redcarpet", "~> 3.5"
12
+ end
13
+
9
14
  group :test, :development do
10
15
  gem "pry", "~> 0.14.1"
11
16
  gem "overcommit", "~> 0.59.1"
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)](http://www.rubydoc.info/gems/flutter)
6
+ [![Docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://flutter.indydevs.org)
7
7
 
8
8
  ```
9
9
  __ __
@@ -23,7 +23,7 @@ or in continuous integration environments to only run the subset of tests affect
23
23
  ## How?
24
24
  Flutter tracks each method call within the context of each test case in your test suite and persists this mapping along with
25
25
  a signature for all the methods that were exercised. On subsequent runs Flutter intercepts test enumeration and skips any test if
26
- all the following conditions are true:
26
+ **ALL** the following conditions are true:
27
27
 
28
28
  - The test was seen before
29
29
  - The source of the test has not changed
@@ -43,23 +43,17 @@ all the following conditions are true:
43
43
  ```ruby
44
44
  require 'flutter'
45
45
  ```
46
- - Enable & configure it in your `test_helper.rb`:
46
+ - Enable & configure it in your `test_helper.rb` (See [Configuration options](#configuration-options) for available options):
47
47
 
48
48
  ```ruby
49
49
  Flutter.configure do |config|
50
50
  config.enabled = true
51
- # Paths to consider when tracking test -> source mappings. Default: Dir.pwd/*
52
- config.sources = ["./app/*", "./test/*"]
53
- # Paths to ignore for tracking test -> source. Default: ./vendor
54
- config.exclusions = ["./vendor/*"]
55
- # Storage type. Default: Flutter::Persistence::Marshal
56
- config.storage_class = Flutter::Persistence::Marshal
57
- # Where to store the state. Default: ./.flutter
58
- config.storage_options = {path: "./.flutter"}
59
- # Whether to reset the stored state before the test run. Default: false
60
- config.reset_storage = false
61
51
  end
62
52
  ```
53
+ - Run your test suite the way you normally would (for example: `bundle exec rake test`). The first run will run all
54
+ tests. After the test run has completed the mapping of test cases to exercised code will be persisted in the `./.flutter`
55
+ folder.
56
+ - Now make changes and run the test suite again. Only the relevant tests will be executed.
63
57
 
64
58
  #### With guard
65
59
  Using the same configuration as above (and assuming that the application
@@ -84,23 +78,18 @@ end
84
78
  ```ruby
85
79
  require 'flutter'
86
80
  ```
87
- - Enable & configure it in your `spec_helper.rb`:
81
+ - Enable & configure it in your `spec_helper.rb` (See [Configuration options](#configuration-options) for available options):
88
82
 
89
83
  ```ruby
90
84
  Flutter.configure do |config|
91
85
  config.enabled = true
92
- # Paths to consider when tracking test -> source mappings. Default: Dir.pwd/*
93
- config.sources = ["./app/*", "./lib/*", "./spec/*"]
94
- # Paths to ignore for tracking test -> source. Default: ./vendor
95
- config.exclusions = ["./vendor/*"]
96
- # Storage type. Default: Flutter::Persistence::Marshal
97
- config.storage_class = Flutter::Persistence::Marshal
98
- # Where to store the state. Default: ./.flutter
99
- config.storage_options = {path: "./.flutter"}
100
- # Whether to reset the stored state before the test run. Default: false
101
- config.reset_storage = false
102
86
  end
103
87
  ```
88
+ - Run your specs the way you normally would (for example: `bundle exec rspec`). The first run will run all
89
+ tests. After the test run has completed the mapping of test cases to exercised code will be persisted in the `./.flutter`
90
+ folder.
91
+ - Now make changes and run rspec again. Only the relevant examples will be executed.
92
+
104
93
  #### With guard
105
94
  Using the same configuration as above (and assuming that the application
106
95
  sources are in the `./app` & `./lib` folders while the specs are in the `./spec` folder)
@@ -111,6 +100,21 @@ guard :rspec, cmd: "rspec" do
111
100
  watch(%r{^(spec|app|lib)/(.*/)?([^/]+)\.rb$}) { "spec" }
112
101
  end
113
102
  ```
103
+
104
+ ### Configuration options
105
+ | option | Description | Type | Default |
106
+ |:-----------------:|:---------------------------------------------------------------|:---------------------------------------:|:-------------------------------:|
107
+ | `enabled` | Whether flutter is enabled | `TrueClass, FalseClass` | `true` |
108
+ | `sources` | List of glob style expressions to select source files to track | `Set` | `["#{Dir.pwd}/*"]` |
109
+ | `exclusions` | List of glob style expressions to exclude sources files | `Set` | `["#{Dir.pwd}/vendor}/*"]` |
110
+ | `storage_class` | The storage class to use for persisting the state | `Flutter::Persistence::AbstractStorage` | `Flutter::Persistence::Marshal` |
111
+ | `storage_options` | Additional options to pass to the storage class | `Hash` | `{path: './.flutter'}` |
112
+ | `reset_storage` | Whether to clear the persisted state on initialization | `TrueClass, FalseClass` | `false` |
113
+
114
+
115
+
116
+
117
+
114
118
  ## Configuring flutter in continuous integration
115
119
 
116
120
  Flutter can be used in continuous integration environments to speed up the turn
@@ -179,9 +183,9 @@ To install this gem onto your local machine, run `bundle exec rake install`.
179
183
  and contains useful details.
180
184
  - Create a new release using the `release` rake task as follows (for more details about specifying the version change
181
185
  run `gem bump --help` which is the command used by the task):
182
- - Patch release `bundle exec rake release["-v patch"]`
183
- - Minor release `bundle exec rake release["-v minor"]`
184
- - Major release `bundle exec rake release["-v major"]`
186
+ - Patch release `bundle exec rake release["patch"]`
187
+ - Minor release `bundle exec rake release["minor"]`
188
+ - Major release `bundle exec rake release["major"]`
185
189
  > **Note**
186
190
  > The `release` rake task automates updating the changelog & version, committing the changes & creating a new tag
187
191
  - Push the tag. The CI workflow for tag pushes will take care of publishing the gem & creating a github release.
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "date"
3
4
  require "rake/testtask"
4
5
  require "keepachangelog"
5
6
 
@@ -27,11 +28,11 @@ desc "Increment the version, update changelog and create a tag for the release"
27
28
  task :release, [:version] do |_t, args|
28
29
  parser = Keepachangelog::MarkdownParser.load("CHANGELOG.md")
29
30
  log = parser.parsed_content["versions"].delete("Unreleased")
30
- sh("gem bump --pretend #{args[:version]}") do |ok, _|
31
+ sh("gem bump --pretend -v #{args[:version]}") do |ok, _|
31
32
  if ok
32
- new_version = %x(gem bump --no-commit #{args[:version]} | awk '{print $4}' | uniq).chomp
33
+ new_version = %x(gem bump --no-commit -v #{args[:version]} | awk '{print $4}' | uniq).chomp
33
34
  parser.parsed_content["versions"]["Unreleased"] = { "url" => nil, "date" => nil, "changes" => {} }
34
- parser.parsed_content["versions"][new_version] = log
35
+ parser.parsed_content["versions"]["#{new_version} - #{Date.today}"] = log
35
36
  File.open("CHANGELOG.md", "w") do |file|
36
37
  file.write(parser.to_md)
37
38
  end
@@ -49,7 +50,7 @@ task :release_notes, [:version] do |_t, args|
49
50
  parser = Keepachangelog::MarkdownParser.load("CHANGELOG.md")
50
51
  parser.parsed_content.delete("intro")
51
52
  parser.parsed_content.delete("title")
52
- parser.parsed_content["versions"] = parser.parsed_content["versions"].select { |k, _v| k == version }
53
+ parser.parsed_content["versions"] = parser.parsed_content["versions"].select { |k, _v| k.start_with?(version) }
53
54
  lines = parser.to_md.split("\n")
54
55
  chunk = lines.slice_after { |line| line.include?("## #{version}") }.to_a[1] || []
55
56
  puts chunk.join("\n")
@@ -42,6 +42,8 @@ module Flutter
42
42
  module Hooks
43
43
  module ClassMethods
44
44
  def runnable_methods
45
+ return super unless ::Flutter.enabled
46
+
45
47
  Flutter::Minitest.filtered ||= 0
46
48
  Flutter::Minitest.total ||= 0
47
49
  default = super()
@@ -62,7 +64,7 @@ module Flutter
62
64
  end
63
65
 
64
66
  def before_teardown
65
- Minitest.flutter_tracker&.stop if ::Flutter.enabled
67
+ Minitest.flutter_tracker&.stop(location, failures.empty?) if ::Flutter.enabled
66
68
  super
67
69
  end
68
70
  end
@@ -51,9 +51,14 @@ module Flutter
51
51
  end
52
52
 
53
53
  def build_signatures
54
- require_relative @file
55
54
  @targets.each do |container|
56
- instance = Kernel.const_get(container)
55
+ begin
56
+ instance = Kernel.const_get(container)
57
+ rescue NameError
58
+ require_relative @file
59
+ instance = Kernel.const_get(container)
60
+ end
61
+
57
62
  class_methods = instance.methods + instance.private_methods
58
63
  instance_methods = instance.instance_methods + instance.private_instance_methods
59
64
 
@@ -65,11 +70,12 @@ module Flutter
65
70
  hash = source_hash(instance.instance_method(method))
66
71
  ["#{container}:#{method}", hash] if hash
67
72
  end.compact.to_h)
68
- rescue NameError
69
- $stderr.puts "failed to load #{container} in #{@file}"
73
+ rescue
74
+ warn("Failed to parse #{@file}")
75
+ break
70
76
  end
71
77
  rescue LoadError
72
- $stderr.puts "failed to inspect #{@file}"
78
+ warn("Failed to inspect #{@file}")
73
79
  end
74
80
 
75
81
  def source_hash(callable)
data/lib/flutter/rspec.rb CHANGED
@@ -17,6 +17,8 @@ module Flutter
17
17
 
18
18
  module ClassMethods
19
19
  def filtered_examples
20
+ return super unless Flutter.enabled
21
+
20
22
  Flutter::RSpec.filtered ||= Set.new
21
23
  Flutter::RSpec.total ||= Set.new
22
24
  Flutter::RSpec.tracker.reset! if Flutter.enabled && Flutter.config.reset_storage
@@ -52,7 +54,8 @@ if defined?(RSpec.configure)
52
54
  config.around(:each) do |example|
53
55
  Flutter::RSpec.tracker.start(example.full_description) if Flutter.enabled
54
56
  example.run
55
- Flutter::RSpec.tracker.stop if Flutter.enabled
57
+ Flutter::RSpec.tracker.stop(example.full_description,
58
+ example.execution_result.exception.nil?) if Flutter.enabled
56
59
  end
57
60
 
58
61
  config.after(:suite) do
@@ -26,6 +26,7 @@ module Flutter
26
26
  @exclusions = exclusions.map { |s| File.absolute_path(s) }
27
27
  @storage = storage_class.new(**storage_options)
28
28
  @test_mapping = @storage.test_mapping
29
+ @previous_test_mapping = {}
29
30
  @test_source_mapping = {}
30
31
  @source_mapping = @storage.source_mapping
31
32
  @current_source_mapping = {}
@@ -39,7 +40,7 @@ module Flutter
39
40
  def start(test)
40
41
  # Delete test from the in-memory mapping to allow each new test run
41
42
  # to store all the functions that the test calls into
42
- @test_mapping.delete(test)
43
+ @previous_test_mapping[test] = @test_mapping.delete(test)
43
44
  @current_tracepoint = TracePoint.new(:call) do |tp|
44
45
  hit!(test, tp)
45
46
  end
@@ -47,8 +48,11 @@ module Flutter
47
48
  end
48
49
 
49
50
  # End tracking (should be called after a call to {#start})
50
- def stop
51
+ # @param [String] test A unique identifier for the test
52
+ # @param [TrueClass, FalseClass] success Whether the test succeeded
53
+ def stop(test, success)
51
54
  @current_tracepoint&.disable
55
+ @test_mapping[test].merge!(@previous_test_mapping.delete(test) || {}) { |_, old, new| old + new } unless success
52
56
  end
53
57
 
54
58
  ##
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # :nocov:
4
+
3
5
  module Flutter
4
- VERSION = "0.2.1"
6
+ VERSION = "0.2.3"
5
7
  end
data/lib/flutter.rb CHANGED
@@ -7,6 +7,5 @@ require_relative "flutter/rspec"
7
7
  require_relative "flutter/persistence"
8
8
 
9
9
  module Flutter
10
- class Error < StandardError; end
11
10
  include Flutter::Config
12
11
  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.1
4
+ version: 0.2.3
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-02 00:00:00.000000000 Z
12
+ date: 2022-10-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: deep_merge
@@ -65,6 +65,7 @@ extra_rdoc_files: []
65
65
  files:
66
66
  - ".overcommit.yml"
67
67
  - ".rubocop.yml"
68
+ - ".yardopts"
68
69
  - CHANGELOG.md
69
70
  - CODE_OF_CONDUCT.md
70
71
  - Gemfile
@@ -84,13 +85,15 @@ files:
84
85
  - lib/flutter/version.rb
85
86
  - lib/minitest/flutter_plugin.rb
86
87
  - sig/flutter.rbs
87
- homepage: https://github.com/indydevs/flutter
88
+ homepage: https://flutter.indydevs.org
88
89
  licenses:
89
90
  - MIT
90
91
  metadata:
91
- homepage_uri: https://github.com/indydevs/flutter
92
+ homepage_uri: https://flutter.indydevs.org
92
93
  source_code_uri: https://github.com/indydevs/flutter
94
+ bug_tracker_uri: https://github.com/indydevs/flutter/issues
93
95
  changelog_uri: https://github.com/indydevs/flutter/blob/master/CHANGELOG.md
96
+ ducmentation_uri: https://flutter.indydevs.org
94
97
  post_install_message:
95
98
  rdoc_options: []
96
99
  require_paths: