fastlane-plugin-flutter 0.7.1 → 0.8.0
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 +4 -4
- data/lib/fastlane/plugin/flutter/actions/flutter_action.rb +6 -4
- data/lib/fastlane/plugin/flutter/actions/flutter_bootstrap_action.rb +12 -10
- data/lib/fastlane/plugin/flutter/actions/flutter_build_action.rb +43 -45
- data/lib/fastlane/plugin/flutter/actions/flutter_generate_action.rb +47 -49
- data/lib/fastlane/plugin/flutter/base/flutter_action_base.rb +2 -0
- data/lib/fastlane/plugin/flutter/helper/flutter_bootstrap_helper.rb +3 -0
- data/lib/fastlane/plugin/flutter/helper/flutter_generate_build_runner_helper.rb +3 -1
- data/lib/fastlane/plugin/flutter/helper/flutter_generate_intl_helper.rb +83 -82
- data/lib/fastlane/plugin/flutter/helper/flutter_helper.rb +14 -14
- data/lib/fastlane/plugin/flutter/version.rb +3 -1
- data/lib/fastlane/plugin/flutter.rb +2 -0
- metadata +50 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a8c5c397684224bab9705b5f8e2980ea3c49704c25b00a189dbd9fe7ae80175
|
4
|
+
data.tar.gz: 7e133c3e06a7a9771eebaa86125f26d125c0e20e0dd3b8312133664d396e707c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 188f0c619b42b371c8c166d48e709c44c6d6f0d7943df3f4f551f024837284d6d7d7a17317c085b4f42018ee6e0e1d7aaf5cc6189cf1024f1eff23ba83d6dbc0
|
7
|
+
data.tar.gz: 65b3c45bb076916775e34e8d6ba34a05477eac7997aaf31a235d01173e79bc69c50b1c759124169818fb082fa890bc9ef79c522ec9fcd56b1c31aa7e3d9071a9
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fastlane/action'
|
2
4
|
require_relative '../base/flutter_action_base'
|
3
5
|
require_relative '../helper/flutter_helper'
|
@@ -9,7 +11,7 @@ module Fastlane
|
|
9
11
|
|
10
12
|
def self.run(params)
|
11
13
|
if params[:capture_stdout]
|
12
|
-
Helper::FlutterHelper.flutter(*params[:args]) do |
|
14
|
+
Helper::FlutterHelper.flutter(*params[:args]) do |_status, output|
|
13
15
|
output
|
14
16
|
end
|
15
17
|
else
|
@@ -27,7 +29,7 @@ module Fastlane
|
|
27
29
|
key: :args,
|
28
30
|
env_name: 'FL_FLUTTER_ARGS',
|
29
31
|
description: 'Arguments to Flutter command',
|
30
|
-
type: Array
|
32
|
+
type: Array
|
31
33
|
),
|
32
34
|
FastlaneCore::ConfigItem.new(
|
33
35
|
key: :capture_stdout,
|
@@ -35,8 +37,8 @@ module Fastlane
|
|
35
37
|
description: 'Do not print stdout of the command, but return it',
|
36
38
|
optional: true,
|
37
39
|
type: Boolean,
|
38
|
-
default_value: false
|
39
|
-
)
|
40
|
+
default_value: false
|
41
|
+
)
|
40
42
|
]
|
41
43
|
end
|
42
44
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fastlane/action'
|
2
4
|
require_relative '../base/flutter_action_base'
|
3
5
|
require_relative '../helper/flutter_helper'
|
@@ -14,7 +16,7 @@ module Fastlane
|
|
14
16
|
if params[:android_licenses]
|
15
17
|
Helper::FlutterBootstrapHelper.accept_licenses(
|
16
18
|
File.join(android_sdk_root!, 'licenses'),
|
17
|
-
params[:android_licenses]
|
19
|
+
params[:android_licenses]
|
18
20
|
)
|
19
21
|
end
|
20
22
|
|
@@ -38,7 +40,7 @@ module Fastlane
|
|
38
40
|
'--quiet',
|
39
41
|
'--',
|
40
42
|
FLUTTER_REMOTE_REPOSITORY,
|
41
|
-
flutter_sdk_root
|
43
|
+
flutter_sdk_root
|
42
44
|
)
|
43
45
|
end
|
44
46
|
|
@@ -52,19 +54,19 @@ module Fastlane
|
|
52
54
|
|
53
55
|
remote_hash = Helper::FlutterHelper.git(
|
54
56
|
'ls-remote', FLUTTER_REMOTE_REPOSITORY, flutter_channel
|
55
|
-
) do |status, output,
|
57
|
+
) do |status, output, _errors_thread|
|
56
58
|
output.split[0].strip if status.success?
|
57
59
|
end
|
58
60
|
local_hash = Helper::FlutterHelper.git(
|
59
61
|
'-C', flutter_sdk_root, 'rev-parse', 'HEAD'
|
60
|
-
) do |status, output,
|
62
|
+
) do |status, output, _errors_thread|
|
61
63
|
output.strip if status.success?
|
62
64
|
end
|
63
65
|
|
64
66
|
if !local_hash.nil? && local_hash == remote_hash
|
65
|
-
UI.message(
|
67
|
+
UI.message('Local and remote Flutter repository hashes match ' \
|
66
68
|
"(#{local_hash}), no upgrade necessary. Keeping Git " \
|
67
|
-
|
69
|
+
'index untouched!')
|
68
70
|
false
|
69
71
|
else
|
70
72
|
UI.message("Local hash (#{local_hash}) of Flutter repository " \
|
@@ -94,7 +96,7 @@ module Fastlane
|
|
94
96
|
env_name: 'FL_FLUTTER_CHANNEL',
|
95
97
|
description: 'Flutter SDK channel (keep existing if unset)',
|
96
98
|
optional: true,
|
97
|
-
type: String
|
99
|
+
type: String
|
98
100
|
),
|
99
101
|
FastlaneCore::ConfigItem.new(
|
100
102
|
key: :flutter_auto_upgrade,
|
@@ -102,7 +104,7 @@ module Fastlane
|
|
102
104
|
description: 'Automatically upgrade Flutter when already installed',
|
103
105
|
default_value: true,
|
104
106
|
optional: true,
|
105
|
-
is_string: false
|
107
|
+
is_string: false # official replacement for "type: Boolean"
|
106
108
|
),
|
107
109
|
FastlaneCore::ConfigItem.new(
|
108
110
|
key: :android_licenses,
|
@@ -111,8 +113,8 @@ module Fastlane
|
|
111
113
|
'$ANDROID_SDK_ROOT/licenses/ on developer workstations. Gradle ' \
|
112
114
|
'will refuse to install SDK unless licenses are accepted',
|
113
115
|
optional: true,
|
114
|
-
type: Hash
|
115
|
-
)
|
116
|
+
type: Hash
|
117
|
+
)
|
116
118
|
]
|
117
119
|
end
|
118
120
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fastlane/action'
|
2
4
|
require_relative '../base/flutter_action_base'
|
3
5
|
require_relative '../helper/flutter_helper'
|
@@ -13,8 +15,8 @@ module Fastlane
|
|
13
15
|
|
14
16
|
FASTLANE_PLATFORM_TO_BUILD = {
|
15
17
|
ios: 'ios',
|
16
|
-
android: 'apk'
|
17
|
-
}
|
18
|
+
android: 'apk'
|
19
|
+
}.freeze
|
18
20
|
|
19
21
|
def self.run(params)
|
20
22
|
# "flutter build" args list.
|
@@ -22,28 +24,24 @@ module Fastlane
|
|
22
24
|
|
23
25
|
if params[:build]
|
24
26
|
build_args.push(params[:build])
|
25
|
-
|
26
|
-
if fastlane_platform = (lane_context[SharedValues::PLATFORM_NAME] ||
|
27
|
+
elsif (fastlane_platform = lane_context[SharedValues::PLATFORM_NAME] ||
|
27
28
|
lane_context[SharedValues::DEFAULT_PLATFORM])
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
29
|
+
build_args.push(FASTLANE_PLATFORM_TO_BUILD[fastlane_platform])
|
30
|
+
else
|
31
|
+
UI.user_error!('flutter_build action "build" parameter is not ' \
|
32
|
+
'specified and cannot be inferred from Fastlane context.')
|
33
33
|
end
|
34
34
|
|
35
35
|
process_deprecated_params(params, build_args)
|
36
36
|
|
37
|
-
if params[:debug]
|
38
|
-
build_args.push('--debug')
|
39
|
-
end
|
37
|
+
build_args.push('--debug') if params[:debug]
|
40
38
|
|
41
|
-
if build_number =
|
39
|
+
if (build_number = params[:build_number] ||
|
42
40
|
lane_context[SharedValues::BUILD_NUMBER])
|
43
41
|
build_args.push('--build-number', build_number.to_s)
|
44
42
|
end
|
45
43
|
|
46
|
-
if build_name =
|
44
|
+
if (build_name = params[:build_name] ||
|
47
45
|
lane_context[SharedValues::VERSION_NUMBER])
|
48
46
|
build_args.push('--build-name', build_name.to_s)
|
49
47
|
end
|
@@ -84,41 +82,41 @@ module Fastlane
|
|
84
82
|
ENV['GYM_WORKSPACE'] ||= 'ios/Runner.xcworkspace'
|
85
83
|
ENV['GYM_BUILD_PATH'] ||= 'build/ios'
|
86
84
|
ENV['GYM_OUTPUT_DIRECTORY'] ||= 'build'
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
85
|
+
return if ENV.include?('GYM_SCHEME')
|
86
|
+
|
87
|
+
# Do some parsing on args. Is there a less ugly way?
|
88
|
+
build_args.each.with_index do |arg, index|
|
89
|
+
if arg.start_with?('--flavor', '-flavor')
|
90
|
+
ENV['GYM_SCHEME'] = if arg.include?('=')
|
91
|
+
arg.split('=', 2).last
|
92
|
+
else
|
93
|
+
build_args[index + 1]
|
94
|
+
end
|
97
95
|
end
|
98
96
|
end
|
99
97
|
end
|
100
98
|
|
101
99
|
def self.process_deprecated_params(params, build_args)
|
102
|
-
|
103
|
-
UI.deprecated(<<-"MESSAGE")
|
104
|
-
flutter_build parameter "codesign" is deprecated. Use
|
100
|
+
return if params[:codesign].nil?
|
105
101
|
|
106
|
-
|
107
|
-
|
108
|
-
)
|
102
|
+
UI.deprecated(<<~"MESSAGE")
|
103
|
+
flutter_build parameter "codesign" is deprecated. Use
|
109
104
|
|
110
|
-
|
111
|
-
|
105
|
+
flutter_build(
|
106
|
+
build_args: ["--#{params[:codesign] == false ? 'no-' : ''}codesign"]
|
107
|
+
)
|
112
108
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
109
|
+
form instead.
|
110
|
+
MESSAGE
|
111
|
+
|
112
|
+
return unless params[:codesign] == false
|
113
|
+
|
114
|
+
build_args.push('--no-codesign')
|
117
115
|
end
|
118
116
|
|
119
117
|
def self.process_build_output(output, build_args)
|
120
|
-
artifacts = output.scan(/Built (.*?)(:? \([^)]*\))
|
121
|
-
|
118
|
+
artifacts = output.scan(/Built (.*?)(:? \([^)]*\))?[.]?$/)
|
119
|
+
.map { |path| File.absolute_path(path[0]) }
|
122
120
|
if artifacts.size == 1
|
123
121
|
lane_context[SharedValues::FLUTTER_OUTPUT] = artifacts.first
|
124
122
|
elsif artifacts.size > 1
|
@@ -150,7 +148,7 @@ form instead.
|
|
150
148
|
env_name: 'FL_FLUTTER_BUILD',
|
151
149
|
description: 'Type of Flutter build (e.g. apk, appbundle, ios)',
|
152
150
|
optional: true,
|
153
|
-
type: String
|
151
|
+
type: String
|
154
152
|
),
|
155
153
|
FastlaneCore::ConfigItem.new(
|
156
154
|
key: :debug,
|
@@ -158,7 +156,7 @@ form instead.
|
|
158
156
|
description: 'Build a Debug version of the app if true',
|
159
157
|
optional: true,
|
160
158
|
type: Boolean,
|
161
|
-
default_value: false
|
159
|
+
default_value: false
|
162
160
|
),
|
163
161
|
FastlaneCore::ConfigItem.new(
|
164
162
|
key: :codesign,
|
@@ -166,14 +164,14 @@ form instead.
|
|
166
164
|
description: 'Set to false to skip iOS app signing. This may be ' \
|
167
165
|
'useful e.g. on CI or when signed later by Fastlane "sigh"',
|
168
166
|
optional: true,
|
169
|
-
type: Boolean
|
167
|
+
type: Boolean
|
170
168
|
),
|
171
169
|
FastlaneCore::ConfigItem.new(
|
172
170
|
key: :build_number,
|
173
171
|
env_name: 'FL_FLUTTER_BUILD_NUMBER',
|
174
172
|
description: 'Override build number specified in pubspec.yaml',
|
175
173
|
optional: true,
|
176
|
-
type: Integer
|
174
|
+
type: Integer
|
177
175
|
),
|
178
176
|
FastlaneCore::ConfigItem.new(
|
179
177
|
key: :build_name,
|
@@ -183,14 +181,14 @@ form instead.
|
|
183
181
|
NOTE: for App Store, build name must be in the format of at most 3
|
184
182
|
integeres separated by a dot (".").
|
185
183
|
DESCRIPTION
|
186
|
-
optional: true
|
184
|
+
optional: true
|
187
185
|
),
|
188
186
|
FastlaneCore::ConfigItem.new(
|
189
187
|
key: :build_args,
|
190
188
|
description: 'An array of extra arguments for "flutter build"',
|
191
189
|
optional: true,
|
192
|
-
type: Array
|
193
|
-
)
|
190
|
+
type: Array
|
191
|
+
)
|
194
192
|
]
|
195
193
|
end
|
196
194
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fastlane/action'
|
2
4
|
require_relative '../base/flutter_action_base'
|
3
5
|
require_relative '../helper/flutter_helper'
|
@@ -17,7 +19,7 @@ module Fastlane
|
|
17
19
|
ALL_IMPORTS_TEST_FILE = 'test/all_imports_for_coverage_test.dart'
|
18
20
|
|
19
21
|
def self.run(params)
|
20
|
-
Helper::FlutterHelper.flutter(*%w
|
22
|
+
Helper::FlutterHelper.flutter(*%w[packages get]) {}
|
21
23
|
|
22
24
|
if params[:coverage_all_imports] && File.exist?(ALL_IMPORTS_TEST_FILE)
|
23
25
|
# This file may somehow confuse codegeneration (e.g. built_value).
|
@@ -39,37 +41,37 @@ module Fastlane
|
|
39
41
|
Helper::FlutterGenerateBuildRunnerHelper.build
|
40
42
|
end
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
File.write(
|
56
|
-
ALL_IMPORTS_TEST_FILE,
|
57
|
-
<<-DART
|
58
|
-
// This file is autogenerated by fastlane flutter_generate action.
|
59
|
-
// It imports all files in lib/ so that test coverage in percentage
|
60
|
-
// of overall project is calculated correctly. Do not modify this
|
61
|
-
// file manually!
|
62
|
-
|
63
|
-
// ignore_for_file: unused_import, directives_ordering
|
64
|
-
// ignore_for_file: avoid_relative_lib_imports
|
65
|
-
// ignore_for_file: lines_longer_than_80_chars
|
66
|
-
|
67
|
-
#{dart_file_literals.map { |fn| "import '#{fn}';" }.sort.join("\n")}
|
68
|
-
|
69
|
-
void main() {}
|
70
|
-
DART
|
71
|
-
)
|
44
|
+
return unless params[:coverage_all_imports]
|
45
|
+
|
46
|
+
UI.message("Generating #{ALL_IMPORTS_TEST_FILE} for coverage...")
|
47
|
+
|
48
|
+
dart_file_literals = Dir['lib/**/*.dart'].reject do |file_name|
|
49
|
+
# ".g.dart" files often are "part of" files and can not be imported
|
50
|
+
# directly. Commonly coverage for generated files is not that useful
|
51
|
+
file_name.end_with?('.g.dart')
|
52
|
+
end.map do |file_name|
|
53
|
+
Helper::FlutterHelper
|
54
|
+
.import_path_for_test(file_name, '..')
|
55
|
+
.gsub("'", "\\\\'")
|
72
56
|
end
|
57
|
+
|
58
|
+
File.write(
|
59
|
+
ALL_IMPORTS_TEST_FILE,
|
60
|
+
<<~DART
|
61
|
+
// This file is autogenerated by fastlane flutter_generate action.
|
62
|
+
// It imports all files in lib/ so that test coverage in percentage
|
63
|
+
// of overall project is calculated correctly. Do not modify this
|
64
|
+
// file manually!
|
65
|
+
|
66
|
+
// ignore_for_file: unused_import, directives_ordering
|
67
|
+
// ignore_for_file: avoid_relative_lib_imports
|
68
|
+
// ignore_for_file: lines_longer_than_80_chars
|
69
|
+
|
70
|
+
#{dart_file_literals.map { |fn| "import '#{fn}';" }.sort.join("\n")}
|
71
|
+
|
72
|
+
void main() {}
|
73
|
+
DART
|
74
|
+
)
|
73
75
|
end
|
74
76
|
|
75
77
|
def self.generate_translation?
|
@@ -77,15 +79,15 @@ void main() {}
|
|
77
79
|
end
|
78
80
|
|
79
81
|
def self.description
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
82
|
+
'(1) Run `flutter packages get`; ' \
|
83
|
+
'(2) Run `build_runner build` if build_runner is in dev_dependencies;' \
|
84
|
+
' ' \
|
85
|
+
'(3) According to `package:intl`, take `$strings_file` and generate ' \
|
86
|
+
'`${strings_file.dirname}/arb/intl_messages.arb`, then take all ' \
|
87
|
+
'files matching `${strings_file.dirname}/intl_*.arb`, fix them and ' \
|
88
|
+
'generate .dart files from them. ' \
|
89
|
+
'(4) Generate an empty test importing all files, which would be used ' \
|
90
|
+
'to calculate correct full coverage numbers.'
|
89
91
|
end
|
90
92
|
|
91
93
|
def self.available_options
|
@@ -96,19 +98,15 @@ void main() {}
|
|
96
98
|
env_name: 'FL_FLUTTER_INTL_STRINGS_FILE',
|
97
99
|
description: 'Path to source .dart file with Intl.message calls',
|
98
100
|
verify_block: proc do |value|
|
99
|
-
if generate_translation?
|
100
|
-
unless File.exist?(value)
|
101
|
-
UI.user_error!("File `#{value}' does not exist")
|
102
|
-
end
|
103
|
-
end
|
101
|
+
UI.user_error!("File `#{value}' does not exist") if generate_translation? && !File.exist?(value)
|
104
102
|
end,
|
105
|
-
default_value: 'lib/intl/intl.dart'
|
103
|
+
default_value: 'lib/intl/intl.dart'
|
106
104
|
),
|
107
105
|
FastlaneCore::ConfigItem.new(
|
108
106
|
key: :intl_strings_locale,
|
109
107
|
env_name: 'FL_FLUTTER_INTL_STRINGS_LOCALE',
|
110
108
|
description: 'Locale of the default data in the strings_file',
|
111
|
-
optional: true
|
109
|
+
optional: true
|
112
110
|
),
|
113
111
|
FastlaneCore::ConfigItem.new(
|
114
112
|
key: :coverage_all_imports,
|
@@ -121,8 +119,8 @@ void main() {}
|
|
121
119
|
to .gitignore!
|
122
120
|
DESCRIPTION
|
123
121
|
optional: true,
|
124
|
-
type: Boolean
|
125
|
-
)
|
122
|
+
type: Boolean
|
123
|
+
)
|
126
124
|
]
|
127
125
|
end
|
128
126
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fastlane_core/ui/ui'
|
2
4
|
require 'fileutils'
|
3
5
|
|
@@ -10,6 +12,7 @@ module Fastlane
|
|
10
12
|
license_file = File.join(licenses_directory, license)
|
11
13
|
next if File.exist?(license_file) &&
|
12
14
|
File.readlines(license_file).map(&:strip).include?(hash)
|
15
|
+
|
13
16
|
UI.message("Updating Android SDK license in #{license_file}...")
|
14
17
|
File.open(license_file, 'a') { |f| f.puts('', hash) }
|
15
18
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'yaml'
|
2
4
|
|
3
5
|
module Fastlane
|
@@ -5,7 +7,7 @@ module Fastlane
|
|
5
7
|
class FlutterGenerateBuildRunnerHelper
|
6
8
|
def self.build
|
7
9
|
Helper::FlutterHelper.flutter(
|
8
|
-
*%w
|
10
|
+
*%w[packages pub run build_runner build --delete-conflicting-outputs]
|
9
11
|
)
|
10
12
|
end
|
11
13
|
end
|
@@ -1,6 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fileutils'
|
2
4
|
require 'json'
|
3
|
-
require 'set'
|
4
5
|
require 'yaml'
|
5
6
|
|
6
7
|
require_relative 'flutter_helper'
|
@@ -10,101 +11,101 @@ module Fastlane
|
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
module Fastlane
|
15
|
+
module Helper
|
16
|
+
class FlutterGenerateIntlHelper
|
17
|
+
def self.generate(messages_filename, messages_locale = nil)
|
18
|
+
dart_files_dirname = File.dirname(messages_filename)
|
19
|
+
arb_files_dirname = File.join(dart_files_dirname, 'arb')
|
20
|
+
full_arb_filename = generate_arb_from_dart(
|
21
|
+
messages_filename, messages_locale, arb_files_dirname
|
22
|
+
)
|
20
23
|
|
21
|
-
|
24
|
+
arb_filenames = amend_arb_files(arb_files_dirname, full_arb_filename)
|
22
25
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
unless messages_locale
|
27
|
+
# Don't generate .dart for the ARB generated from original, unless it
|
28
|
+
# has its own locale.
|
29
|
+
arb_filenames.delete(full_arb_filename)
|
30
|
+
end
|
28
31
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
Fastlane::UI.message('Generating .dart files from .arb...')
|
33
|
+
Fastlane::Helper::FlutterHelper.flutter(
|
34
|
+
*%W[packages pub run intl_translation:generate_from_arb
|
35
|
+
--output-dir=#{dart_files_dirname}
|
36
|
+
--no-use-deferred-loading
|
37
|
+
#{messages_filename}] + arb_filenames
|
38
|
+
)
|
39
|
+
end
|
37
40
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
41
|
+
def self.amend_arb_files(arb_files_dirname, full_arb_filename)
|
42
|
+
full_arb_json = JSON.parse(File.read(full_arb_filename))
|
43
|
+
|
44
|
+
# Sort files for consistency, because generated messages_all.dart will
|
45
|
+
# have imports ordered as in the command line below.
|
46
|
+
arb_filenames = Dir.glob(File.join(arb_files_dirname, 'intl_*.arb')).sort
|
47
|
+
arb_filenames.each do |arb_filename|
|
48
|
+
arb_json = JSON.parse(File.read(arb_filename))
|
49
|
+
if arb_filename != full_arb_filename
|
50
|
+
Fastlane::UI.message("Amending #{arb_filename}...")
|
51
|
+
full_arb_json.each_pair do |k, v|
|
52
|
+
# Ignore @@keys. We don't want to copy @@locale over all files, and
|
53
|
+
# it's often unspecified to be inferred from file name.
|
54
|
+
arb_json[k] ||= v unless k.start_with?('@@')
|
55
|
+
end
|
56
|
+
arb_json.keep_if { |k| full_arb_json.key?(k) }
|
57
|
+
end
|
58
|
+
File.write(arb_filename, "#{JSON.pretty_generate(arb_json)}\n")
|
52
59
|
end
|
53
|
-
arb_json.keep_if { |k| full_arb_json.key?(k) }
|
54
60
|
end
|
55
|
-
File.write(arb_filename, JSON.pretty_generate(arb_json) + "\n")
|
56
|
-
end
|
57
|
-
end
|
58
61
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
+
def self.generate_arb_from_dart(dart_filename, dart_locale, arb_dirname)
|
63
|
+
arb_filename = File.join(arb_dirname, 'intl_messages.arb')
|
64
|
+
Fastlane::UI.message("Generating #{arb_filename} from #{dart_filename}...")
|
62
65
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
if File.exist?(arb_filename)
|
67
|
+
arb_file_was = File.read(arb_filename)
|
68
|
+
else
|
69
|
+
# The file may not exist on the first run. Then it's also probable that
|
70
|
+
# the output directory does not exist yet.
|
71
|
+
FileUtils.mkdir_p(arb_dirname)
|
72
|
+
end
|
70
73
|
|
71
|
-
|
72
|
-
|
73
|
-
extract_to_arb_options.push("--locale=#{dart_locale}")
|
74
|
-
end
|
74
|
+
extract_to_arb_options = ["--output-dir=#{arb_dirname}"]
|
75
|
+
extract_to_arb_options.push("--locale=#{dart_locale}") if dart_locale
|
75
76
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
)
|
80
|
-
|
81
|
-
# intl will update @@last_modified even if there are no updates; this
|
82
|
-
# leaves Git directory unnecessary dirty. If that's the only change,
|
83
|
-
# just restore the previous contents.
|
84
|
-
if arb_file_was
|
85
|
-
if restore_last_modified(arb_filename, arb_file_was)
|
86
|
-
Fastlane::UI.message(
|
87
|
-
"@@last_modified has been restored in #{arb_filename}"
|
77
|
+
Fastlane::Helper::FlutterHelper.flutter(
|
78
|
+
*%w[packages pub run intl_translation:extract_to_arb],
|
79
|
+
*extract_to_arb_options, dart_filename
|
88
80
|
)
|
81
|
+
|
82
|
+
# intl will update @@last_modified even if there are no updates; this
|
83
|
+
# leaves Git directory unnecessary dirty. If that's the only change,
|
84
|
+
# just restore the previous contents.
|
85
|
+
if arb_file_was && restore_last_modified(arb_filename, arb_file_was)
|
86
|
+
Fastlane::UI.message(
|
87
|
+
"@@last_modified has been restored in #{arb_filename}"
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
91
|
+
arb_filename
|
89
92
|
end
|
90
|
-
end
|
91
93
|
|
92
|
-
|
93
|
-
|
94
|
+
def self.restore_last_modified(filename, old_content)
|
95
|
+
new_content_tree = JSON.parse(File.read(filename))
|
96
|
+
old_content_tree = JSON.parse(old_content)
|
97
|
+
new_content_tree['@@last_modified'] = old_content_tree['@@last_modified']
|
98
|
+
|
99
|
+
# Use to_json to compare the objects deep and in consistent format.
|
100
|
+
if new_content_tree.to_json == old_content_tree.to_json
|
101
|
+
# Except for the @@last_modified attribute that we replaced
|
102
|
+
# above, the objects are identical. Restore previous timestamp.
|
103
|
+
File.write(filename, old_content)
|
104
|
+
return true
|
105
|
+
end
|
94
106
|
|
95
|
-
|
96
|
-
|
97
|
-
old_content_tree = JSON.parse(old_content)
|
98
|
-
new_content_tree['@@last_modified'] = old_content_tree['@@last_modified']
|
99
|
-
|
100
|
-
# Use to_json to compare the objects deep and in consistent format.
|
101
|
-
if new_content_tree.to_json == old_content_tree.to_json
|
102
|
-
# Except for the @@last_modified attribute that we replaced
|
103
|
-
# above, the objects are identical. Restore previous timestamp.
|
104
|
-
File.write(filename, old_content)
|
105
|
-
return true
|
107
|
+
false
|
108
|
+
end
|
106
109
|
end
|
107
|
-
|
108
|
-
false
|
109
110
|
end
|
110
111
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'shellwords'
|
2
4
|
require 'yaml'
|
3
5
|
|
@@ -28,10 +30,10 @@ module Fastlane
|
|
28
30
|
elsif ENV.include?('FLUTTER_ROOT')
|
29
31
|
# FLUTTER_ROOT is a standard environment variable from Flutter.
|
30
32
|
UI.message("Determined Flutter location as #{ENV['FLUTTER_ROOT']}" \
|
31
|
-
|
33
|
+
' because environment variable FLUTTER_ROOT points there' \
|
32
34
|
" (current directory is #{Dir.pwd}).")
|
33
35
|
ENV['FLUTTER_ROOT']
|
34
|
-
elsif flutter_binary = FastlaneCore::CommandExecutor.which('flutter')
|
36
|
+
elsif (flutter_binary = FastlaneCore::CommandExecutor.which('flutter'))
|
35
37
|
location = File.dirname(File.dirname(flutter_binary))
|
36
38
|
UI.message("Determined Flutter location as #{location} because"\
|
37
39
|
" 'flutter' executable in PATH is located there" \
|
@@ -39,9 +41,9 @@ module Fastlane
|
|
39
41
|
location
|
40
42
|
else
|
41
43
|
# Where we'd prefer to install flutter.
|
42
|
-
UI.message(
|
44
|
+
UI.message('Determined desired Flutter location as' \
|
43
45
|
" #{pinned_flutter_path} because that's where this fastlane" \
|
44
|
-
|
46
|
+
' plugin would install Flutter by default.')
|
45
47
|
pinned_flutter_path
|
46
48
|
end
|
47
49
|
)
|
@@ -65,9 +67,7 @@ module Fastlane
|
|
65
67
|
end
|
66
68
|
|
67
69
|
def self.import_path_for_test(file_to_import, relative_path)
|
68
|
-
unless file_to_import.start_with?('lib/')
|
69
|
-
return File.join(relative_path, file_to_import)
|
70
|
-
end
|
70
|
+
return File.join(relative_path, file_to_import) unless file_to_import.start_with?('lib/')
|
71
71
|
|
72
72
|
# Import file schema in tests have to match files in lib/ exactly. From
|
73
73
|
# Dart perspective, symbols in files imported via relative and
|
@@ -78,7 +78,7 @@ module Fastlane
|
|
78
78
|
# chances are, it's using "package:..." imports. Indeed, checking the
|
79
79
|
# file itself isn't sufficient to explore all of its dependencies, but
|
80
80
|
# we expect imports to be consistent in the project.
|
81
|
-
"#{package_specification}#{file_to_import['lib/'.size
|
81
|
+
"#{package_specification}#{file_to_import['lib/'.size..]}"
|
82
82
|
else
|
83
83
|
File.join(relative_path, file_to_import)
|
84
84
|
end
|
@@ -102,14 +102,14 @@ module Fastlane
|
|
102
102
|
end
|
103
103
|
|
104
104
|
unless wait_thread.value.success? || (ignore_error == true)
|
105
|
-
UI.shell_error!(
|
106
|
-
The following command has failed:
|
105
|
+
UI.shell_error!(<<~ERROR)
|
106
|
+
The following command has failed:
|
107
107
|
|
108
|
-
$ #{command}
|
109
|
-
[#{wait_thread.value}]
|
108
|
+
$ #{command}
|
109
|
+
[#{wait_thread.value}]
|
110
110
|
|
111
|
-
#{errors_thread.value}
|
112
|
-
ERROR
|
111
|
+
#{errors_thread.value}
|
112
|
+
ERROR
|
113
113
|
end
|
114
114
|
|
115
115
|
ignore_error
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-flutter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Sheremet
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: codecov
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -39,7 +39,21 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: fastlane
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 2.91.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.91.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - ">="
|
@@ -53,7 +67,7 @@ dependencies:
|
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: rake
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - ">="
|
@@ -67,7 +81,21 @@ dependencies:
|
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec_junit_formatter
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
101
|
- - ">="
|
@@ -84,18 +112,18 @@ dependencies:
|
|
84
112
|
name: rubocop
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
|
-
- -
|
115
|
+
- - "~>"
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
117
|
+
version: '1.64'
|
90
118
|
type: :development
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
|
-
- -
|
122
|
+
- - "~>"
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
124
|
+
version: '1.64'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
|
-
name: rubocop-
|
126
|
+
name: rubocop-rake
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
100
128
|
requirements:
|
101
129
|
- - ">="
|
@@ -109,7 +137,7 @@ dependencies:
|
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: '0'
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
140
|
+
name: rubocop-require_tools
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
114
142
|
requirements:
|
115
143
|
- - ">="
|
@@ -123,7 +151,7 @@ dependencies:
|
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: '0'
|
125
153
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
154
|
+
name: rubocop-rspec
|
127
155
|
requirement: !ruby/object:Gem::Requirement
|
128
156
|
requirements:
|
129
157
|
- - ">="
|
@@ -137,20 +165,20 @@ dependencies:
|
|
137
165
|
- !ruby/object:Gem::Version
|
138
166
|
version: '0'
|
139
167
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
168
|
+
name: simplecov
|
141
169
|
requirement: !ruby/object:Gem::Requirement
|
142
170
|
requirements:
|
143
171
|
- - ">="
|
144
172
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
173
|
+
version: '0'
|
146
174
|
type: :development
|
147
175
|
prerelease: false
|
148
176
|
version_requirements: !ruby/object:Gem::Requirement
|
149
177
|
requirements:
|
150
178
|
- - ">="
|
151
179
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
153
|
-
description:
|
180
|
+
version: '0'
|
181
|
+
description:
|
154
182
|
email: artem@sheremet.ch
|
155
183
|
executables: []
|
156
184
|
extensions: []
|
@@ -173,7 +201,7 @@ homepage: https://github.com/dotdoom/fastlane-plugin-flutter
|
|
173
201
|
licenses:
|
174
202
|
- MIT
|
175
203
|
metadata: {}
|
176
|
-
post_install_message:
|
204
|
+
post_install_message:
|
177
205
|
rdoc_options: []
|
178
206
|
require_paths:
|
179
207
|
- lib
|
@@ -188,8 +216,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
188
216
|
- !ruby/object:Gem::Version
|
189
217
|
version: '0'
|
190
218
|
requirements: []
|
191
|
-
rubygems_version: 3.
|
192
|
-
signing_key:
|
219
|
+
rubygems_version: 3.5.3
|
220
|
+
signing_key:
|
193
221
|
specification_version: 4
|
194
222
|
summary: Flutter actions plugin for Fastlane
|
195
223
|
test_files: []
|