flutter 0.2.0 → 0.2.2

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: 2ca2f5eb98359bf0cbac8abbdedcbe6ca27ec7bf205625f44cf0c4150313eeb4
4
- data.tar.gz: 6620320c3c54d63117ddc95550c0d4223411bfe9b6b469336fe9f60ffcddcfe3
3
+ metadata.gz: d3929d7a4586b20232226e254f271162bba4ee4a8212bd65a59b1a06c371d9f3
4
+ data.tar.gz: ed09b644a323dd8fc4dccb380a6212d272fb283708e9edbdc42487cd82728513
5
5
  SHA512:
6
- metadata.gz: 6f97e5720ea6fd890e4c6283a1193750eea3c1ffa64de2de550793cecb14f8636a205774a08811a3f4aea35ed5a764023603fa91a33bd0b4d00496925f4ab35c
7
- data.tar.gz: 7f890be9219df6f89fde38e9bc34479a65c9a3d8d910ec1495732a2a32ac65d33291c507b8e7b6950facca0d02b6a47c726c864ae2abde9a4416ae983096b29c
6
+ metadata.gz: d696e398b4e0130b48ffa9f36b5fc7371ab62b9b37670a652e736f56c202df95ca0bef74c934cc8d2c802818b10d90e80b99c902e04b3ebdcf12601d14c0a752
7
+ data.tar.gz: fc2e7556e864e626b9670344ef44c5d12c62321b63a48be5637082fc1213422184ee54d53ad42c9f0f7852420f1ce923d58bf2fdbfebeac6104a2307b7668f93
data/.yardopts ADDED
@@ -0,0 +1,2 @@
1
+ --markup-provider redcarpet
2
+ --markup markdown
data/CHANGELOG.md CHANGED
@@ -5,6 +5,18 @@ 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.2 - 2022-10-03
9
+ ### Added
10
+ - Document configuration options in README
11
+
12
+ ### Changed
13
+ - Delay requiring source files explicitely and only in the case where
14
+ - Ensure the previous test->coverage mapping is merged with current
15
+
16
+ ## 0.2.1
17
+ ### Fixed
18
+ - Corrected integration examples for guard in README
19
+
8
20
  ## 0.2.0
9
21
  ### Added
10
22
  - 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/Guardfile CHANGED
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  guard :minitest, test_folders: ["test"] do
4
- watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { "test" }
4
+ watch(%r{^(test|lib)/(.*/)?([^/]+)\.rb$}) { "test" }
5
5
  end
6
6
 
7
- guard :rspec, cmd: "rspec" do
8
- watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { "spec" }
7
+ guard :rspec, cmd: "rspec", all_on_start: true do
8
+ watch(%r{^(spec|lib)/(.*/)?([^/]+)\.rb$}) { "spec" }
9
9
  end
data/README.md CHANGED
@@ -3,6 +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
7
 
7
8
  ```
8
9
  __ __
@@ -22,7 +23,7 @@ or in continuous integration environments to only run the subset of tests affect
22
23
  ## How?
23
24
  Flutter tracks each method call within the context of each test case in your test suite and persists this mapping along with
24
25
  a signature for all the methods that were exercised. On subsequent runs Flutter intercepts test enumeration and skips any test if
25
- all the following conditions are true:
26
+ **ALL** the following conditions are true:
26
27
 
27
28
  - The test was seen before
28
29
  - The source of the test has not changed
@@ -42,30 +43,26 @@ all the following conditions are true:
42
43
  ```ruby
43
44
  require 'flutter'
44
45
  ```
45
- - 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):
46
47
 
47
48
  ```ruby
48
49
  Flutter.configure do |config|
49
50
  config.enabled = true
50
- # Paths to consider when tracking test -> source mappings. Default: Dir.pwd/*
51
- config.sources = ["./app/*", "./test/*"]
52
- # Paths to ignore for tracking test -> source. Default: ./vendor
53
- config.exclusions = ["./vendor/*"]
54
- # Storage type. Default: Flutter::Persistence::Marshal
55
- config.storage_class = Flutter::Persistence::Marshal
56
- # Where to store the state. Default: ./.flutter
57
- config.storage_options = {path: "./.flutter"}
58
- # Whether to reset the stored state before the test run. Default: false
59
- config.reset_storage = false
60
51
  end
61
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.
62
57
 
63
58
  #### With guard
64
- Add the following to your `Guardfile`:
59
+ Using the same configuration as above (and assuming that the application
60
+ sources are in the `./lib` folder while the tests are in the `./test` folder)
61
+ add the following to your `Guardfile`:
65
62
 
66
63
  ```ruby
67
64
  guard :minitest, test_folders: ["test"] do
68
- watch(%r{^{test,lib}/(.*/)?([^/]+)\.rb$}) { "test" }
65
+ watch(%r{^(test|lib)/(.*/)?([^/]+)\.rb$}) { "test" }
69
66
  end
70
67
  ```
71
68
 
@@ -81,31 +78,43 @@ end
81
78
  ```ruby
82
79
  require 'flutter'
83
80
  ```
84
- - 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):
85
82
 
86
83
  ```ruby
87
84
  Flutter.configure do |config|
88
85
  config.enabled = true
89
- # Paths to consider when tracking test -> source mappings. Default: Dir.pwd/*
90
- config.sources = ["./app/*", "./test/*"]
91
- # Paths to ignore for tracking test -> source. Default: ./vendor
92
- config.exclusions = ["./vendor/*"]
93
- # Storage type. Default: Flutter::Persistence::Marshal
94
- config.storage_class = Flutter::Persistence::Marshal
95
- # Where to store the state. Default: ./.flutter
96
- config.storage_options = {path: "./.flutter"}
97
- # Whether to reset the stored state before the test run. Default: false
98
- config.reset_storage = false
99
86
  end
100
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
+
101
93
  #### With guard
102
- Using the same configuration as above add the following to your `Guardfile`:
94
+ Using the same configuration as above (and assuming that the application
95
+ sources are in the `./app` & `./lib` folders while the specs are in the `./spec` folder)
96
+ add the following to your `Guardfile`:
103
97
 
104
98
  ```ruby
105
99
  guard :rspec, cmd: "rspec" do
106
- watch(%r{^{spec,lib}/(.*/)?([^/]+)\.rb$}) { "spec" }
100
+ watch(%r{^(spec|app|lib)/(.*/)?([^/]+)\.rb$}) { "spec" }
107
101
  end
108
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
+
109
118
  ## Configuring flutter in continuous integration
110
119
 
111
120
  Flutter can be used in continuous integration environments to speed up the turn
@@ -174,9 +183,9 @@ To install this gem onto your local machine, run `bundle exec rake install`.
174
183
  and contains useful details.
175
184
  - Create a new release using the `release` rake task as follows (for more details about specifying the version change
176
185
  run `gem bump --help` which is the command used by the task):
177
- - Patch release `bundle exec rake release["-v patch"]`
178
- - Minor release `bundle exec rake release["-v minor"]`
179
- - 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"]`
180
189
  > **Note**
181
190
  > The `release` rake task automates updating the changelog & version, committing the changes & creating a new tag
182
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,10 +50,8 @@ 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
- chunk = ["## #{version}"] + (
55
- lines.slice_after { |line| line.include?("## #{version}") }.to_a[1] || []
56
- )
55
+ chunk = lines.slice_after { |line| line.include?("## #{version}") }.to_a[1] || []
57
56
  puts chunk.join("\n")
58
57
  end
data/TODO.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## Code quality
10
10
  - [ ] Separate public/private API
11
- - [ ] Add rdoc / yard documentation
11
+ - [x] Add rdoc / yard documentation
12
12
 
13
13
  ## Testing
14
14
  - [x] Improve test coverage
@@ -26,5 +26,5 @@
26
26
  ## Usability
27
27
  - [x] Quick start guide
28
28
  - [x] Recipes for guard
29
- - [ ] Recipes for CI
29
+ - [x] Recipes for CI
30
30
 
@@ -62,7 +62,7 @@ module Flutter
62
62
  end
63
63
 
64
64
  def before_teardown
65
- Minitest.flutter_tracker&.stop if ::Flutter.enabled
65
+ Minitest.flutter_tracker&.stop(location, failures.empty?) if ::Flutter.enabled
66
66
  super
67
67
  end
68
68
  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
@@ -52,7 +52,8 @@ if defined?(RSpec.configure)
52
52
  config.around(:each) do |example|
53
53
  Flutter::RSpec.tracker.start(example.full_description) if Flutter.enabled
54
54
  example.run
55
- Flutter::RSpec.tracker.stop if Flutter.enabled
55
+ Flutter::RSpec.tracker.stop(example.full_description,
56
+ example.execution_result.exception.nil?) if Flutter.enabled
56
57
  end
57
58
 
58
59
  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,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Flutter
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.2"
5
5
  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.0
4
+ version: 0.2.2
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-01 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: