class EL_APPLICATION
Client examples: AUTOTEST_APP ; BINARY_DECODE_APP ; CHECK_LOCALE_STRINGS_COMMAND ; CLASS_RENAMING_COMMAND ; CODEC_GENERATOR ; DIAGNOSTICS_APP ; EIFFEL_LOOP_TEST_SET ; FIND_AND_REPLACE_COMMAND ; HORSE_RACE_APP ; HTML_BODY_WORD_COUNTER ; ID3_FRAME_CODE_CLASS_GENERATOR ; JOBSERVE_SEARCHER ; MEDIA_PLAYER_DUMMY_APP ; NOTE_EDITOR_COMMAND ; PRIMES_BENCHMARK_APP ; UPGRADE_LOG_FILTERS_COMMAND ; VCF_CONTACT_COMMAND ; VCF_CONTACT_NAME_SWITCHER ; VCF_CONTACT_SPLITTER
Sub-application for a root class conforming to EL_MULTI_APPLICATION_ROOT
To create a localized sub-application redefine new_locale as follows:
new_locale: EL_ENGLISH_DEFAULT_LOCALE_IMP do create Result.make end
eiffel.ecf
EL_APPLICATION* EL_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] UNDEFINE_PATTERN_COUNTER_APP PYXIS_TRANSLATION_TREE_COMPILER_APP PYXIS_ECF_CONVERTER_APP WINZIP_SOFTWARE_PACKAGE_BUILDER_APP CHECK_LOCALE_STRINGS_APP GITHUB_MANAGER_APP ENCODING_CHECK_APP FEATURE_EDITOR_APP ID3_FRAME_CODE_CLASS_GENERATOR_APP EL_LOGGED_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] CLASS_DESCENDANTS_APP LIBRARY_OVERRIDE_APP REPOSITORY_PUBLISHER_SUB_APPLICATION* [C -> REPOSITORY_PUBLISHER] REPOSITORY_SOURCE_LINK_EXPANDER_APP REPOSITORY_NOTE_LINK_CHECKER_APP EIFFEL_VIEW_APP IMP_CLASS_LOCATION_NORMALIZER_APP EL_REGRESSION_TESTABLE_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] SOURCE_TREE_CLASS_RENAME_APP CODEC_GENERATOR_APP CODEBASE_STATISTICS_APP ECF_TO_PECF_APP FIND_AND_REPLACE_APP NOTE_EDITOR_APP NOTE_DATE_FIXER_APP SOURCE_TREE_EDIT_COMMAND_LINE_SUB_APP* UPGRADE_DEFAULT_POINTER_SYNTAX_APP EL_VERSION_APP EL_LOGGED_APPLICATION* EL_LOGGED_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] EL_REGRESSION_TESTABLE_APPLICATION* CODE_HIGHLIGHTING_TEST_APP SOURCE_TREE_EDITING_SUB_APPLICATION* UPGRADE_LOG_FILTERS_APP SOURCE_FILE_NAME_NORMALIZER_APP SOURCE_LOG_LINE_REMOVER_APP CLASS_PREFIX_REMOVAL_APP EL_REGRESSION_TESTABLE_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] EL_AUTOTEST_APPLICATION* [EQA_TYPES -> TUPLE create default_create end] EL_REGRESSION_AUTOTEST_SUB_APPLICATION* [EQA_TYPES -> TUPLE create default_create end] AUTOTEST_APP EDITOR_AUTOTEST_APP EL_STANDARD_UNINSTALL_APP
toolkit.ecf
EL_APPLICATION* BINARY_DECODE_APP EL_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] USER_AGENT_APP XML_TO_PYXIS_APP YOUTUBE_VIDEO_DOWNLOADER_APP EL_DEBIAN_PACKAGER_APP DUPLICITY_BACKUP_APP DUPLICITY_RESTORE_APP FILE_TREE_TRANSFORM_SCRIPT_APP PYXIS_TO_XML_APP EL_LOGGED_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] THUNDERBIRD_BOOK_EXPORTER_APP CAD_MODEL_SLICER_APP FILTER_INVALID_UTF_8_APP JOBSERVE_SEARCH_APP PRAAT_GCC_SOURCE_TO_MSVC_CONVERTOR_APP LOCALIZATION_COMMAND_SHELL_APP EL_REGRESSION_TESTABLE_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] THUNDERBIRD_WWW_EXPORTER_APP UNDATED_PHOTO_FINDER_APP VCF_CONTACT_SPLITTER_APP VCF_CONTACT_NAME_SWITCHER_APP FTP_BACKUP_APP FILE_MANIFEST_APP HTML_BODY_WORD_COUNTER_APP PYXIS_ENCRYPTER_APP PYXIS_TREE_TO_XML_COMPILER_APP TESTABLE_LOCALIZED_THUNDERBIRD_SUB_APPLICATION* [READER -> TB_MULTI_LANG_ACCOUNT_READER create make_from_file end] LOCALIZED_THUNDERBIRD_BOOK_EXPORTER_APP LOCALIZED_THUNDERBIRD_TO_BODY_EXPORTER_APP EL_COMMAND_SHELL_APPLICATION* [C -> EL_APPLICATION_COMMAND_SHELL] CRYPTO_COMMAND_SHELL_APP EL_VERSION_APP EL_LOGGED_APPLICATION* EL_LOGGED_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] EL_AUTOTEST_APPLICATION* [EQA_TYPES -> TUPLE create default_create end] AUTOTEST_APP CAD_MODEL_AUTOTEST_APP EL_REGRESSION_TESTABLE_APPLICATION* FTP_TEST_APP EL_REGRESSION_TESTABLE_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] EL_STANDARD_UNINSTALL_APP
manage-mp3.ecf
EL_APPLICATION* EL_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] TANGO_MP3_FILE_COLLATOR_APP EL_DEBIAN_PACKAGER_APP GENERATE_RBOX_DATABASE_FIELD_ENUM_APP ID3_EDITOR_APP EL_LOGGED_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] MP3_AUDIO_SIGNATURE_READER_APP RHYTHMBOX_MUSIC_MANAGER_APP EL_VERSION_APP EL_LOGGED_APPLICATION* EL_LOGGED_COMMAND_LINE_APPLICATION* [C -> EL_COMMAND] EL_AUTOTEST_APPLICATION* [EQA_TYPES -> TUPLE create default_create end] EL_REGRESSION_AUTOTEST_SUB_APPLICATION* [EQA_TYPES -> TUPLE create default_create end] AUTOTEST_APP EL_STANDARD_UNINSTALL_APP
note
description: "Sub-application for a root class conforming to [$source EL_MULTI_APPLICATION_ROOT]"
notes: "[
To create a localized sub-application redefine `new_locale' as follows:
new_locale: EL_ENGLISH_DEFAULT_LOCALE_IMP
do
create Result.make
end
]"
descendants: "See end of class"
author: "Finnian Reilly"
copyright: "Copyright (c) 2001-2022 Finnian Reilly"
contact: "finnian at eiffel hyphen loop dot com"
license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
date: "2023-01-23 13:13:14 GMT (Monday 23rd January 2023)"
revision: "65"
deferred class
EL_APPLICATION
inherit
EL_FALLIBLE
export
{NONE} all
end
EL_SOLITARY
rename
make as make_solitary
end
EL_MODULE_BUILD_INFO; EL_MODULE_EXCEPTION; EL_MODULE_EXECUTABLE; EL_MODULE_DIRECTORY
EL_MODULE_FILE_SYSTEM; EL_MODULE_LIO; EL_MODULE_OS_RELEASE; EL_MODULE_OS
EL_SHARED_BASE_OPTION
EL_SHARED_APPLICATION_OPTION
feature {EL_FACTORY_CLIENT} -- Initialization
initialize
--
deferred
end
make
--
do
make_default
across App_directory_list as list loop
if not list.item.exists then
create_app_directory (list.item)
end
end
init_console
if not (App_option.no_app_header or Base_option.silent) then
io_put_header
end
if help_requested then
print_help
elseif not is_valid_platform then
print_platform_help (0)
else
do_application
end
end
make_default
do
make_solitary
-- Necessary to redefine `Build_info' as type `BUILD_INFO' if the project root class is `Current'
call (Build_info)
Exception.catch ({EXCEP_CONST}.Signal_exception)
across standard_options as opt loop
do_nothing
end
end
feature -- Access
default_option_name: STRING
-- lower case generator with `_app' removed from tail
do
Result := generator
Result.to_lower
if Result.ends_with ("_app") then
Result.remove_tail (4)
end
end
description: READABLE_STRING_GENERAL
deferred
end
exit_code: INTEGER
option_name: READABLE_STRING_GENERAL
-- Command option name
do
Result := default_option_name
end
options_help: EL_APPLICATION_HELP_LIST
do
create Result.make (11)
across standard_options as options loop
across options.item.help_table as help loop
Result.extend (help.key, help.item.description, help.item.default_value)
end
end
end
unwrapped_description: ZSTRING
-- description unwrapped as a single line
do
create Result.make_from_general (description)
Result.replace_character ('%N', ' ')
end
user_config_dir: DIR_PATH
local
s: EL_ZSTRING_ROUTINES
do
Result := Directory.App_configuration #+ s.as_zstring (option_name)
end
feature -- Basic operations
run
--
deferred
end
print_help
do
options_help.print_to_lio
if not is_valid_platform then
lio.put_line ("WARNING")
lio.put_spaces (4)
print_platform_help (4)
end
end
print_platform_help (indent_count: INTEGER)
local
s: EL_ZSTRING_ROUTINES
do
lio.put_labeled_substitution (
s.character_string ('-') + option_name,
"this option is not designed for use on %S", [ OS_release.description]
)
lio.put_new_line
end
feature -- Status query
ask_user_to_quit: BOOLEAN
--
do
Result := App_option.ask_user_to_quit
end
help_requested: BOOLEAN
-- `True' if user requested help or other information
do
Result := App_option.help
end
is_same_option (name: ZSTRING): BOOLEAN
do
Result := name.same_string_general (option_name)
end
is_valid_platform: BOOLEAN
do
Result := True
end
feature -- Element change
set_exit_code (a_exit_code: INTEGER)
do
exit_code := a_exit_code
end
feature {EL_APPLICATION} -- Factory routines
new_application_mutex: EL_APPLICATION_MUTEX_I
do
create {EL_APPLICATION_MUTEX_IMP} Result.make_for_application_mode (option_name)
end
new_command_options: EL_APPLICATION_COMMAND_OPTIONS
do
create Result.make
end
new_configuration: detachable EL_APPLICATION_CONFIGURATION
-- redefine to create configuration singleton just before `initialization' routine is called
do
end
new_option_name: ZSTRING
do
create Result.make_from_general (option_name)
end
feature {NONE} -- Implementation
call (object: ANY)
-- For initializing once routines
do
end
create_app_directory (data_dir: DIR_PATH)
-- create cache, configuration and data user directories
local
legacy: like Directory.Legacy_table
do
legacy := Directory.Legacy_table
-- If a differing legacy data directory exists already, move it to standard location
if legacy.has_key (data_dir) and then legacy.found_item.exists and then legacy.found_item /~ data_dir then
-- migrate from legacy directories
migrate (legacy.found_item, data_dir)
else
File_system.make_directory (data_dir)
end
end
do_application
local
ctrl_c_pressed: BOOLEAN; l_timer: EL_EXECUTION_TIMER
do
if ctrl_c_pressed then
on_operating_system_signal
else
if App_option.show_benchmarks then
create l_timer.make; l_timer.start
internal_timer := l_timer
end
read_command_options
if has_error then
print_errors
else
call (new_configuration)
initialize; run
if attached internal_timer as timer then
show_benchmarks (timer)
end
if Ask_user_to_quit then
lio.put_new_line
io.put_string ("<RETURN TO QUIT>")
io.read_character
end
end
end
rescue
-- NOTE: Windows does not trigger an exception on Ctrl-C
if Exception.is_termination_signal then
ctrl_c_pressed := True
retry
elseif attached Exception.last_exception.cause as cause then
lio.put_labeled_substitution (
cause.generator, "{%S}.%S Line %S", [cause.type_name, cause.recipient_name, cause.line_number]
)
lio.put_new_line
end
end
init_console
local
list: like visible_types_list
do
list := visible_types_list
if not list.all_conform then
list.log_error (lio, "Error in function `visible_types'")
end
Console.show_all (list.to_array)
end
io_put_header
local
build_version, test: STRING
do
lio.put_new_line
test := "test"
if App_option.test then
build_version := test
else
build_version := Build_info.version.out
end
lio.put_labeled_string ("Executable", Executable.name)
lio.put_labeled_string (" Version", build_version)
lio.put_new_line
lio.put_labeled_string ("Class", generator)
lio.put_labeled_string (" Option", option_name)
lio.put_new_line
lio.put_string_field ("Description", description)
lio.put_new_line_X2
end
migrate (legacy, standard: DIR_PATH)
-- migrate legacy paths to standard
require
legacy_exists: legacy.exists
do
File_system.make_directory (standard.parent)
OS.move_to_directory (legacy, standard.parent)
File_system.delete_if_empty (legacy.parent)
end
on_operating_system_signal
--
do
end
read_command_options
-- read command line options
do
end
show_benchmarks (timer: EL_EXECUTION_TIMER)
-- show execution times and average execution time since last version update
local
timer_data: RAW_FILE; data_version: NATURAL; i, data_count: INTEGER
sum_elapsed_times: DOUBLE; file_path: FILE_PATH
do
file_path := Directory.App_data.joined_file_tuple ([option_name, "show_benchmarks.dat"])
timer.stop
across (";Average ").split (';') as l_prefix loop
lio.put_labeled_string (l_prefix.item + "Execution time", timer.elapsed_time.out)
lio.put_new_line
if l_prefix.is_first then
-- Set average elapsed time from previous runs
if file_path.exists then
create timer_data.make_open_read (file_path)
timer_data.read_natural
data_version := timer_data.last_natural
data_count := (timer_data.count - {PLATFORM}.Natural_32_bytes) // {PLATFORM}.Real_64_bytes
from i := 1 until i > data_count loop
timer_data.read_double
sum_elapsed_times := sum_elapsed_times + timer_data.last_double
i := i + 1
end
else
File_system.make_directory (file_path.parent)
create timer_data.make_open_write (file_path)
timer_data.put_natural_32 (Build_info.version_number)
data_version := Build_info.version_number
end
timer_data.close
if Build_info.version_number > data_version then
-- Reset file to zero items
create timer_data.make_open_write (file_path)
timer_data.put_natural_32 (Build_info.version_number)
sum_elapsed_times := 0; data_count := 0
else
create timer_data.make_open_append (file_path)
end
timer_data.put_double (timer.elapsed_millisecs)
timer_data.close
lio.put_integer_field ("Previous runs", data_count)
lio.put_new_line
sum_elapsed_times := sum_elapsed_times + timer.elapsed_millisecs
data_count := data_count + 1
timer.set_elapsed_millisecs (sum_elapsed_times / data_count)
end
end
end
standard_options: EL_DEFAULT_COMMAND_OPTION_LIST
-- Standard command line options
do
create Result.make (<< Base_option, new_command_options >>)
end
visible_types: TUPLE
-- types with lio output visible in console
-- See: {EL_CONSOLE_MANAGER_I}.show_all
do
create Result
end
visible_types_list: EL_TUPLE_TYPE_LIST [EL_MODULE_LIO]
do
create Result.make_from_tuple (visible_types)
ensure
all_conform_to_EL_MODULE_LIO: Result.all_conform
end
feature {NONE} -- Internal attributes
internal_timer: detachable EL_EXECUTION_TIMER
feature {EL_DESKTOP_ENVIRONMENT_I} -- Constants
App_directory_list: EL_ARRAYED_LIST [DIR_PATH]
once
Result := Directory.app_list
end
note
descendants: "[
**eiffel.ecf**
EL_APPLICATION*
[$source EL_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source UNDEFINE_PATTERN_COUNTER_APP]
[$source PYXIS_TRANSLATION_TREE_COMPILER_APP]
[$source PYXIS_ECF_CONVERTER_APP]
[$source WINZIP_SOFTWARE_PACKAGE_BUILDER_APP]
[$source CHECK_LOCALE_STRINGS_APP]
[$source GITHUB_MANAGER_APP]
[$source ENCODING_CHECK_APP]
[$source FEATURE_EDITOR_APP]
[$source ID3_FRAME_CODE_CLASS_GENERATOR_APP]
[$source EL_LOGGED_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source CLASS_DESCENDANTS_APP]
[$source LIBRARY_OVERRIDE_APP]
[$source REPOSITORY_PUBLISHER_SUB_APPLICATION]* [C -> [$source REPOSITORY_PUBLISHER]]
[$source REPOSITORY_SOURCE_LINK_EXPANDER_APP]
[$source REPOSITORY_NOTE_LINK_CHECKER_APP]
[$source EIFFEL_VIEW_APP]
[$source IMP_CLASS_LOCATION_NORMALIZER_APP]
[$source EL_REGRESSION_TESTABLE_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source SOURCE_TREE_CLASS_RENAME_APP]
[$source CODEC_GENERATOR_APP]
[$source CODEBASE_STATISTICS_APP]
[$source ECF_TO_PECF_APP]
[$source FIND_AND_REPLACE_APP]
[$source NOTE_EDITOR_APP]
[$source NOTE_DATE_FIXER_APP]
[$source SOURCE_TREE_EDIT_COMMAND_LINE_SUB_APP]*
[$source UPGRADE_DEFAULT_POINTER_SYNTAX_APP]
[$source EL_VERSION_APP]
[$source EL_LOGGED_APPLICATION]*
[$source EL_LOGGED_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source EL_REGRESSION_TESTABLE_APPLICATION]*
[$source CODE_HIGHLIGHTING_TEST_APP]
[$source SOURCE_TREE_EDITING_SUB_APPLICATION]*
[$source UPGRADE_LOG_FILTERS_APP]
[$source SOURCE_FILE_NAME_NORMALIZER_APP]
[$source SOURCE_LOG_LINE_REMOVER_APP]
[$source CLASS_PREFIX_REMOVAL_APP]
[$source EL_REGRESSION_TESTABLE_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source EL_AUTOTEST_APPLICATION]* [EQA_TYPES -> [$source TUPLE] create default_create end]
[$source EL_REGRESSION_AUTOTEST_SUB_APPLICATION]* [EQA_TYPES -> [$source TUPLE] create default_create end]
[$source AUTOTEST_APP]
[$source EDITOR_AUTOTEST_APP]
[$source EL_STANDARD_UNINSTALL_APP]
**toolkit.ecf**
EL_APPLICATION*
[$source BINARY_DECODE_APP]
[$source EL_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source USER_AGENT_APP]
[$source XML_TO_PYXIS_APP]
[$source YOUTUBE_VIDEO_DOWNLOADER_APP]
[$source EL_DEBIAN_PACKAGER_APP]
[$source DUPLICITY_BACKUP_APP]
[$source DUPLICITY_RESTORE_APP]
[$source FILE_TREE_TRANSFORM_SCRIPT_APP]
[$source PYXIS_TO_XML_APP]
[$source EL_LOGGED_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source THUNDERBIRD_BOOK_EXPORTER_APP]
[$source CAD_MODEL_SLICER_APP]
[$source FILTER_INVALID_UTF_8_APP]
[$source JOBSERVE_SEARCH_APP]
[$source PRAAT_GCC_SOURCE_TO_MSVC_CONVERTOR_APP]
[$source LOCALIZATION_COMMAND_SHELL_APP]
[$source EL_REGRESSION_TESTABLE_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source THUNDERBIRD_WWW_EXPORTER_APP]
[$source UNDATED_PHOTO_FINDER_APP]
[$source VCF_CONTACT_SPLITTER_APP]
[$source VCF_CONTACT_NAME_SWITCHER_APP]
[$source FTP_BACKUP_APP]
[$source FILE_MANIFEST_APP]
[$source HTML_BODY_WORD_COUNTER_APP]
[$source PYXIS_ENCRYPTER_APP]
[$source PYXIS_TREE_TO_XML_COMPILER_APP]
[$source TESTABLE_LOCALIZED_THUNDERBIRD_SUB_APPLICATION]* [READER -> [$source TB_MULTI_LANG_ACCOUNT_READER] create make_from_file end]
[$source LOCALIZED_THUNDERBIRD_BOOK_EXPORTER_APP]
[$source LOCALIZED_THUNDERBIRD_TO_BODY_EXPORTER_APP]
[$source EL_COMMAND_SHELL_APPLICATION]* [C -> [$source EL_APPLICATION_COMMAND_SHELL]]
[$source CRYPTO_COMMAND_SHELL_APP]
[$source EL_VERSION_APP]
[$source EL_LOGGED_APPLICATION]*
[$source EL_LOGGED_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source EL_AUTOTEST_APPLICATION]* [EQA_TYPES -> [$source TUPLE] create default_create end]
[$source AUTOTEST_APP]
[$source CAD_MODEL_AUTOTEST_APP]
[$source EL_REGRESSION_TESTABLE_APPLICATION]*
[$source FTP_TEST_APP]
[$source EL_REGRESSION_TESTABLE_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source EL_STANDARD_UNINSTALL_APP]
**manage-mp3.ecf**
EL_APPLICATION*
[$source EL_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source TANGO_MP3_FILE_COLLATOR_APP]
[$source EL_DEBIAN_PACKAGER_APP]
[$source GENERATE_RBOX_DATABASE_FIELD_ENUM_APP]
[$source ID3_EDITOR_APP]
[$source EL_LOGGED_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source MP3_AUDIO_SIGNATURE_READER_APP]
[$source RHYTHMBOX_MUSIC_MANAGER_APP]
[$source EL_VERSION_APP]
[$source EL_LOGGED_APPLICATION]*
[$source EL_LOGGED_COMMAND_LINE_APPLICATION]* [C -> [$source EL_COMMAND]]
[$source EL_AUTOTEST_APPLICATION]* [EQA_TYPES -> [$source TUPLE] create default_create end]
[$source EL_REGRESSION_AUTOTEST_SUB_APPLICATION]* [EQA_TYPES -> [$source TUPLE] create default_create end]
[$source AUTOTEST_APP]
[$source EL_STANDARD_UNINSTALL_APP]
]"
end