fastlane-plugin-flutter 0.3.19 → 0.4.1

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: b6ae751ed4705c48c841b8f95f553e0072a9aceb5824a8c2fcce02c39117f0f0
4
- data.tar.gz: a3d2a2e1f02ff0b209602eebd39402adc6485af3ca24879a67674fb1393bd61d
3
+ metadata.gz: db3474e6f0494dc87b920d46e9d10c6db3c1c2bd3fd287302e566c6ca2c75257
4
+ data.tar.gz: 818dea65a21344a03305ee25b2f6485850c3ecffbdc0289bfa7dab5c256e2211
5
5
  SHA512:
6
- metadata.gz: a6cdd8c323a7c7111565662df4de703f92fdfcfb01f66b7371ca10697341cde4551d7fc885b1a5429ae9bc1a82bbc023f0088dadce50b5d7508f84cc5b09a773
7
- data.tar.gz: 5ae0b0554e40555dac75f4df84d5421444a632429468df6e5587319cf961d483e0fd651e2a68a8dec79fcef83560c3ebf3ed395186a4d4b644c4a78f38030e5e
6
+ metadata.gz: e1b4913c36b02a40fd76943fe959199da720a17670beabcc84bb341c85e9c29a7cd54da5b2f2ebeafa6962c95d735ff195e1753aa97f603e6deea2439c0764ec
7
+ data.tar.gz: aa7b41e76456eb3b971ab47e22b02c5798401a449492192f2cb7ad5e431d9e455b3b0c016a9c8712036cdd6f674c68853f67b069871cd904bb7a525fa6d233a4
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/fastlane-plugin-flutter.svg)](https://badge.fury.io/rb/fastlane-plugin-flutter)
4
4
  [![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-flutter)
5
+ [![codecov](https://codecov.io/gh/dotdoom/fastlane-plugin-flutter/branch/master/graph/badge.svg)](https://codecov.io/gh/dotdoom/fastlane-plugin-flutter)
5
6
  [![Build Status](https://github.com/dotdoom/fastlane-plugin-flutter/workflows/end-to-end%20test/badge.svg?branch=master)](https://github.com/dotdoom/fastlane-plugin-flutter/actions?query=workflow%3A"end-to-end+test"+branch%3Amaster)
6
7
 
7
8
  Automated end-to-end test (download Flutter, create an app, build it) on the
@@ -52,9 +52,13 @@ module Fastlane
52
52
 
53
53
  Helper::FlutterHelper.flutter('build', *build_args) do |status, res|
54
54
  if status.success?
55
- if res =~ /Built (.*?)(:? \([^)]*\))?\.$/
56
- lane_context[SharedValues::FLUTTER_OUTPUT] =
57
- File.absolute_path($1)
55
+ artifacts = res.scan(/Built (.*?)(:? \([^)]*\))?\.$/).
56
+ map { |path| File.absolute_path(path[0]) }
57
+ if artifacts.size == 1
58
+ lane_context[SharedValues::FLUTTER_OUTPUT] = artifacts.first
59
+ elsif artifacts.size > 1
60
+ # Could be the result of "flutter build apk --split-per-abi".
61
+ lane_context[SharedValues::FLUTTER_OUTPUT] = artifacts
58
62
  else
59
63
  UI.important('Cannot parse built file path from "flutter build"')
60
64
  end
@@ -9,6 +9,13 @@ module Fastlane
9
9
  class FlutterGenerateAction < Action
10
10
  extend FlutterActionBase
11
11
 
12
+ # Although this file is autogenerated, we should not call it ".g.dart",
13
+ # because it is common for coverage configuration to exclude such files.
14
+ # Note that it's also common to configure Dart analyser to exclude these
15
+ # files from checks; this won't match, and we have to use ignore_for_file
16
+ # for all known lint rules that we might be breaking.
17
+ ALL_IMPORTS_TEST_FILE = 'test/all_imports_for_coverage_test.dart'
18
+
12
19
  def self.run(params)
13
20
  Helper::FlutterHelper.flutter(*%w(packages get)) {}
14
21
 
@@ -26,6 +33,38 @@ module Fastlane
26
33
  UI.message('Found build_runner dependency, running build...')
27
34
  Helper::FlutterGenerateBuildRunnerHelper.build
28
35
  end
36
+
37
+ if params[:coverage_all_imports]
38
+ UI.message("Generating #{ALL_IMPORTS_TEST_FILE} for coverage...")
39
+
40
+ dart_file_literals = Dir['lib/**/*.dart'].reject do |file_name|
41
+ # ".g.dart" files often are "part of" files and can not be imported
42
+ # directly. Commonly coverage for generated files is not that useful
43
+ file_name.end_with?('.g.dart')
44
+ end.map do |file_name|
45
+ Helper::FlutterHelper.
46
+ import_path_for_test(file_name, '..').
47
+ gsub("'", "\\\\'")
48
+ end
49
+
50
+ File.write(
51
+ ALL_IMPORTS_TEST_FILE,
52
+ <<-DART
53
+ // This file is autogenerated by fastlane flutter_generate action.
54
+ // It imports all files in lib/ so that test coverage in percentage
55
+ // of overall project is calculated correctly. Do not modify this
56
+ // file manually!
57
+
58
+ // ignore_for_file: unused_import, directives_ordering
59
+ // ignore_for_file: avoid_relative_lib_imports
60
+ // ignore_for_file: lines_longer_than_80_chars
61
+
62
+ #{dart_file_literals.map { |fn| "import '#{fn}';" }.sort.join("\n")}
63
+
64
+ void main() {}
65
+ DART
66
+ )
67
+ end
29
68
  end
30
69
 
31
70
  def self.generate_translation?
@@ -39,7 +78,9 @@ module Fastlane
39
78
  "(3) According to `package:intl`, take `$strings_file` and generate " \
40
79
  "`${strings_file.dirname}/arb/intl_messages.arb`, then take all " \
41
80
  "files matching `${strings_file.dirname}/intl_*.arb`, fix them and " \
42
- "generate .dart files from them."
81
+ "generate .dart files from them. " \
82
+ "(4) Generate an empty test importing all files, which would be used " \
83
+ "to calculate correct full coverage numbers."
43
84
  end
44
85
 
45
86
  def self.available_options
@@ -64,6 +105,19 @@ module Fastlane
64
105
  description: 'Locale of the default data in the strings_file',
65
106
  optional: true,
66
107
  ),
108
+ FastlaneCore::ConfigItem.new(
109
+ key: :coverage_all_imports,
110
+ env_name: 'FL_FLUTTER_COVERAGE_ALL_IMPORTS',
111
+ description: <<-DESCRIPTION,
112
+ Set to true to generate an empty test importing all .dart files in
113
+ lib/, which would allow calculating correct coverage numbers for the
114
+ whole project. NOTE: Don't forget to add
115
+ /#{ALL_IMPORTS_TEST_FILE}
116
+ to .gitignore!
117
+ DESCRIPTION
118
+ optional: true,
119
+ type: Boolean,
120
+ ),
67
121
  ]
68
122
  end
69
123
  end
@@ -45,6 +45,30 @@ module Fastlane
45
45
  (YAML.load_file('pubspec.yaml')['dev_dependencies'] || {}).key?(package)
46
46
  end
47
47
 
48
+ def self.pub_package_name
49
+ YAML.load_file('pubspec.yaml')['name']
50
+ end
51
+
52
+ def self.import_path_for_test(file_to_import, relative_path)
53
+ unless file_to_import.start_with?('lib/')
54
+ return File.join(relative_path, file_to_import)
55
+ end
56
+
57
+ # Import file schema in tests have to match files in lib/ exactly. From
58
+ # Dart perspective, symbols in files imported via relative and
59
+ # "package:" file paths are different symbols.
60
+ package_specification = "package:#{pub_package_name}/"
61
+ if File.read(file_to_import, 4096).include?(package_specification)
62
+ # If there's a package reference in the first few bytes of the file,
63
+ # chances are, it's using "package:..." imports. Indeed, checking the
64
+ # file itself isn't sufficient to explore all of its dependencies, but
65
+ # we expect imports to be consistent in the project.
66
+ "#{package_specification}#{file_to_import['lib/'.size..-1]}"
67
+ else
68
+ File.join(relative_path, file_to_import)
69
+ end
70
+ end
71
+
48
72
  def self.execute(*command)
49
73
  # TODO(dotdoom): make CommandExecutor (and Actions.sh) behave similarly.
50
74
  command = command.shelljoin
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module Flutter
3
- VERSION = '0.3.19'
3
+ VERSION = '0.4.1'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-flutter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.19
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artem Sheremet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-16 00:00:00.000000000 Z
11
+ date: 2020-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: codecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: fastlane
127
141
  requirement: !ruby/object:Gem::Requirement