Class: Fastlane::Helper::FlutterGenerateIntlHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/fastlane/plugin/flutter/helper/flutter_generate_intl_helper.rb

Class Method Summary collapse

Class Method Details

.amend_arb_files(arb_files_dirname, full_arb_filename) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/fastlane/plugin/flutter/helper/flutter_generate_intl_helper.rb', line 38

def self.amend_arb_files(arb_files_dirname, full_arb_filename)
  full_arb_json = JSON.parse(File.read(full_arb_filename))

  # Sort files for consistency, because generated messages_all.dart will
  # have imports ordered as in the command line below.
  arb_filenames = Dir.glob(File.join(arb_files_dirname, 'intl_*.arb')).sort
  arb_filenames.each do |arb_filename|
    arb_json = JSON.parse(File.read(arb_filename))
    if arb_filename != full_arb_filename
      Fastlane::UI.message("Amending #{arb_filename}...")
      full_arb_json.each_pair do |k, v|
        # Ignore @@keys. We don't want to copy @@locale over all files, and
        # it's often unspecified to be inferred from file name.
        arb_json[k] ||= v unless k.start_with?('@@')
      end
      arb_json.keep_if { |k| full_arb_json.key?(k) }
    end
    File.write(arb_filename, JSON.pretty_generate(arb_json) + "\n")
  end
end

.generate(messages_filename, messages_locale = nil) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/fastlane/plugin/flutter/helper/flutter_generate_intl_helper.rb', line 14

def self.generate(messages_filename, messages_locale = nil)
  dart_files_dirname = File.dirname(messages_filename)
  arb_files_dirname = File.join(dart_files_dirname, 'arb')
  full_arb_filename = generate_arb_from_dart(
    messages_filename, messages_locale, arb_files_dirname
  )

  arb_filenames = amend_arb_files(arb_files_dirname, full_arb_filename)

  unless messages_locale
    # Don't generate .dart for the ARB generated from original, unless it
    # has its own locale.
    arb_filenames.delete(full_arb_filename)
  end

  Fastlane::UI.message('Generating .dart files from .arb...')
  Fastlane::Helper::FlutterHelper.flutter(
    *%W(packages pub run intl_translation:generate_from_arb
        --output-dir=#{dart_files_dirname}
        --no-use-deferred-loading
        #{messages_filename}) + arb_filenames
  )
end

.generate_arb_from_dart(dart_filename, dart_locale, arb_dirname) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/fastlane/plugin/flutter/helper/flutter_generate_intl_helper.rb', line 59

def self.generate_arb_from_dart(dart_filename, dart_locale, arb_dirname)
  arb_filename = File.join(arb_dirname, 'intl_messages.arb')
  Fastlane::UI.message("Generating #{arb_filename} from #{dart_filename}...")

  if File.exist?(arb_filename)
    arb_file_was = File.read(arb_filename)
  else
    # The file may not exist on the first run. Then it's also probable that
    # the output directory does not exist yet.
    FileUtils.mkdir_p(arb_dirname)
  end

  extract_to_arb_options = ["--output-dir=#{arb_dirname}"]
  if dart_locale
    extract_to_arb_options.push("--locale=#{dart_locale}")
  end

  Fastlane::Helper::FlutterHelper.flutter(
    *%w(packages pub run intl_translation:extract_to_arb),
    *extract_to_arb_options, dart_filename
  )

  # intl will update @@last_modified even if there are no updates; this
  # leaves Git directory unnecessary dirty. If that's the only change,
  # just restore the previous contents.
  if arb_file_was
    if restore_last_modified(arb_filename, arb_file_was)
      Fastlane::UI.message(
        "@@last_modified has been restored in #{arb_filename}"
      )
    end
  end

  arb_filename
end

.restore_last_modified(filename, old_content) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/fastlane/plugin/flutter/helper/flutter_generate_intl_helper.rb', line 95

def self.restore_last_modified(filename, old_content)
  new_content_tree = JSON.parse(File.read(filename))
  old_content_tree = JSON.parse(old_content)
  new_content_tree['@@last_modified'] = old_content_tree['@@last_modified']

  # Use to_json to compare the objects deep and in consistent format.
  if new_content_tree.to_json == old_content_tree.to_json
    # Except for the @@last_modified attribute that we replaced
    # above, the objects are identical. Restore previous timestamp.
    File.write(filename, old_content)
    return true
  end

  false
end