class Fastlane::Helper::FlutterGenerateIntlHelper

Public Class Methods

amend_arb_files(arb_files_dirname, full_arb_filename) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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