Last version: 1.5.1
brew tap daskioff/jessica
brew install daskioff/jessica/jessica
brew upgrade daskioff/jessica/jessica
brew reinstall daskioff/jessica/jessica
brew uninstall --force daskioff/jessica/jessica
jessica help <command> - Помощь по команде
| Command | Description |
|---|---|
version |
Выводит номер текущей версии приложения |
| setup | Конфигурация проекта |
| readme | Создание необходимых файлов и шаблонов для генерации README.md файла |
| struct | Создание и описание структуры проекта |
| generator | Генерация файлов для проекта |
Формат jessica <command> [action] [args]
jessica setup
jessica readme
jessica generator pull github.com/daskioff/jessica_templates newapp`
jessica generator gen newapp
Пример находится в папке ExampleXcodeProj
Примеры шаблонов для команды generator можно посмотреть в разных ветках репозитория
Конфигурация проекта, чтобы использовать остальные команды кроме version и setup.
Запрашиваются только недостающие поля (для обновления всей конфигурации можно использовать параметры)
| Params | Description |
|---|---|
--force, --f |
Полное обновление конфигурации |
user_name– Имя пользователя
company_name– Имя компании (Для шаблонов)project_type– Тип проекта [iOS|other]readme_template_filename– Имя файла для шаблона README файлаcustom_project_struct_use– Использовать или нет кастомную структуру проектаcustom_project_struct_description– Описание структуры проектаcustom_project_struct_description_template_filename– Имя файла с шаблоном описания структуры проектаtemplates_use– Использовать шаблоны или нетtemplates_folder_name– Имя папки, содержащей шаблоны
ios_dependencies_gemfile_use– Использовать Gemfile или нетios_dependencies_podfile_use– Использовать Podfile или нетios_xcodeproj_filename– Имя xcodeproj файла проектаios_target_name_code– Название таргета кода проектаios_folder_name_code– Путь до папки с кодом проектаios_target_name_unit_tests– Название таргета unit тестов проектаios_folder_name_unit_tests– Путь до папки unit тестов проектаios_target_name_ui_tests– Название таргета ui тестов проектаios_folder_name_ui_tests– Путь до папки ui тестов проекта
other_project_name– Название проектаother_project_folder_name– Путь до папки с кодом проекта
Поддержка актуальности README.md файла
Пока есть недостающие данные – они будут запрашиваться, все последующие вызовы будут просто обновлять файл README.md по шаблону
Для iOS проекта
- Будут запрошены:
- Версия xcode, с которой проект последний раз собирался. Ответ будет сохранен в файл
.xcode-version - Версия swift. Ответ будет сохранен в файл
.swift-version
- Версия xcode, с которой проект последний раз собирался. Ответ будет сохранен в файл
- Будут созданы:
- Файл
Gemfileс первоначальными зависимостями - Файл
Podfileс первоначальными зависимостями - Файл readme_template_filename, описывающий шаблон результирующего файла
README.md
- Файл
Переменные, используемые при генерации README.md из шаблона readme_template_filename:
- Для всех типов проектов:
projectName– Имя проекта
- Для iOS проекта:
xcodeVersion– Версия xcode из файлаswiftVersion– Версия swift из файлаgemFileDependencies– Список зависимостей GemfilepodFileDependencies– Список зависимостей проекта Podfile
Если файл описания структуры templates_folder_name существует, он подключается в конец файла readme_template_filename
Создание и описание структуры проекта.
| Action | Description |
|---|---|
gen |
Генерация структуры проекта, описанной в конфигурационном файле проекта |
example |
Пример описания структуры проекта в конфигурационном файле |
- Генерация структуры проекта
- Создание шаблона custom_project_struct_description_template_filename описания структуры проекта. В шаблоне доступны все те же переменные, что и для readme_template_filename файла
Выводит пример описания структуры в конфигурационном файле
custom_project_struct_description:
- Data:
- Entities
- Domain:
- Entities
- Presentation:
- Resources:
- Fonts
- Components:
- Cells
- Flows
- ViewControllers
- SupportГенерация файлов из шаблонов для проекта.
| Action | Description |
|---|---|
list |
Список шаблонов |
pull git_url [branch] |
Клонирование репозитория в папку шаблонов |
gen TEMPLATE_NAME MODULE_NAME [PARAMS] [CUSTOM_KEYS] |
Генерация |
Находит и выводит список всех доступных шаблонов из папки шаблонов, указанной в файле конфигурации по ключу templates_folder_name, доступных для генерации с помощью действия gen
Пример использования
jessica generator pull github.com/daskioff/jessica_templates
или
jessica generator pull github.com/daskioff/jessica_templates my
или
jessica generator pull https://github.com/daskioff/jessica_templates.git
После указания действия gen необходимо указать имя шаблона и имя генерируемого модуля (необязательно). Далее перечисляются параметры, кастомные ключи и значения, которые доступны в шаблоне по ключу {{.custom.имя_переданного_ключа}}
jessica generator gen repository User --nomock userCusomKey1:Value1 userCustom2:value2
Название шаблона – это имя папки с файлом templates.yml, которая находится в общей папке шаблонов проекта templates_folder_name.
Структура файла templates.yml. Доступно 5 секций:
variables– optionalquestions– optionalcode_files– requiredtest_files– optionalmock_files– optional
Секция содержит переменные, которые можно использовать по ключу {{.var.VariableName}}.
variables:
key1: value1
key2: "{{.var.key1}}value2"Секция содержит вопросы, ответы на которые можно использовать в шаблоне по ключу {{.answers.KeyName}}. Формат описания вопроса в файле шаблона:
| Name | Type | Description |
|---|---|---|
key |
string | Ключ, по которому будет доступен ответ в генерируемом шаблоне |
text |
string | Текст вопроса |
required |
bool | Обязательно ли требуется непустой ответ на вопрос |
Каждая секция, описывающая файлы, может содержать список генерируемых файлов. В значениях можно использовать значения, описанные ниже в разделе "Шаблонные значения". Описание каждого файла содержит:
| Name | Type | Description |
|---|---|---|
name |
string | Суффикс генерируемого файла. Название модуля должно быть указано явно! (Например, {{.moduleInfo.name}}) |
template_path |
string | Путь внутри папки шаблона, относительно файла, описывающего шаблон |
output_path |
string | Выходной путь сгенерированного файла, возможно использование переменных |
rewrite |
bool | Значение true или false, означающее стоит ли перезаписывать генерируемый файл, если файл с таким именем по сохраняемому пути уже существует. Если ключ не указан, то значение будет запрошено во время выполнения |
По умолчанию генерируются все секции, code_files является обязательной всегда. Другие можно отключить передав params:
--notest– для отключения генерации секцииtest_files--nomock– для отключения генерации секцииmock_files
- Все значения по ключу Variables
- Все значения по ключу Custom
- Все значения по ключу Answers
- Все значения по ключу ModuleInfo
projectName– Имя проекта, для которого генерируетсяprojectCodeFolderPath– Путь до папки с основным кодом проекта от корняprojectTestsName– Имя таргета с тестами проекта из файла конфигурации (Для проектов типа iOS)projectTestsCodeFolderPath– Путь до папки с тестами проекта из файла конфигурации (Для проектов типа iOS)projectUITestsName– Имя таргета с ui тестами проекта из файла конфигурации (Для проектов типа iOS)projectUITestsCodeFolderPath– Путь до папки с ui тестами проекта из файла конфигурации (Для проектов типа iOS)
variables:
basePathData: Layers/DataLayer/Entities
key2: "{{.var.basePathData}}/val2"
questions:
- {key: versionApi,
text: "Enter API version: ",
required: true}
- {key: entryPoint,
text: "Enter Entry point: ",
required: true}
- {key: entityName,
text: "Enter Entity name: ",
required: true}
- {key: suffix,
text: "Enter suffix for module name: ",
required: false}
code_files:
- {name: {{.moduleInfo.name}}BaseUseCase.swift,
template_path: code/baseUseCase.swift,
output_path: "{{.projectCodeFolderPath}}/{{.var.basePathData}}/base/{{.moduleInfo.name}}",
rewrite: true}
- {name: "{{.moduleInfo.name}}{{.answers.suffix}}UseCase.swift",
template_path: code/usecase.swift,
output_path: "{{.projectCodeFolderPath}}/{{.var.basePathData}}/base/{{.moduleInfo.name}}/usecases",
rewrite: false}
test_files:
- {name: "{{.moduleInfo.name}}{{.answers.suffix}}UseCaseImplTests.swift",
template_path: tests/useCaseImplTests.swift,
output_path: "{{.projectTestsName}}/Layers/DataLayer/Entities/{{.moduleInfo.name}}"}
mock_files:
- {name: "PartialMock{{.moduleInfo.name}}Repository.swift",
template_path: mocks/partialMockUseCaseImpl.swift,
output_path: "{{.projectTestsName}}/Mocks/{{.moduleInfo.name}}"}Переменные необходимо использовать с помощью конструкции {{.VariableName}}. Подробнее про используемый шаблонизатор можно прочитать здесь
| VariableName | Type | Description |
|---|---|---|
date |
string | Текущая дата в формате dd.MM.yyyy |
year |
int | Текущий год |
fileName |
string | Имя сгенерированного файла |
projectName |
string | Имя проекта, для которого генерируется |
projectCodeFolderPath |
string | Путь до папки с основным кодом проекта от корня |
| VariableName | Type | Description |
|---|---|---|
projectTestsName |
string | Имя таргета с UNIT тестами, если задан в конфиге, иначе значение совпадает со значением по ключу projectName |
projectTestsCodeFolderPath |
string | Путь до папки с UNIT тестами, если задан в конфиге, иначе значение совпадает со значением по ключу projectCodeFolderPath |
projectUITestsName |
string | Имя таргета с UI тестами, если задан в конфиге, иначе значение совпадает со значением по ключу projectName |
projectUITestsCodeFolderPath |
string | Путь до папки с UI тестами, если задан в конфиге, иначе значение совпадает со значением по ключу projectCodeFolderPath |
Использовать {{.var.VariableName}}
Содержит ключи и значения, описанные в файле шаблона в секции variables, тип значения всегда string
Использовать {{.custom.VariableName}}
Содержит ключи и значения, переданные при запуске, тип значения всегда string
Например:
jessica generator gen usecase User key1:Value1
В шаблоне можно будет использовать как {{.custom.key1}}
Использовать {{.answers.VariableName}}
Содержит ключи, указанные при описании вопроса, и ответы, которые дал пользователь, тип значения всегда string
Например, в шаблоне описать вопрос:
questions:
- {key: versionApi,
text: "Enter API version: ",
required: true}
В шаблоне можно будет использовать как {{.answers.versionApi}}
Использовать {{.moduleInfo.VariableName}}
| VariableName | Type | Description |
|---|---|---|
name |
string | Имя модуля, которое было передано при генерации (Например, UserModule) |
nameCapitalize |
string | Имя модуля, которое было передано при генерации, но с первой Прописной буквы (Например, UserModule) |
nameFirstLower |
string | Имя модуля, которое было передано при генерации, но с первой строчной буквы (Например, userModule) |
nameUppercase |
string | Имя модуля, которое было передано при генерации, но со всеми ПРОПИСНЫМИ буквами (Например, USERMODULE) |
nameLowercase |
string | Имя модуля, которое было передано при генерации, но со всеми строчными буквами (Например, usermodule) |
Использовать {{.developer.VariableName}}
| VariableName | Type | Description |
|---|---|---|
name |
string | Имя разработчика из глобального файла конфигурации |
companyName |
string | Имя компании из локального файла конфигурации |
DaskiOFF, waydeveloper@gmail.com
Jessica is available under the MIT license. See the LICENSE file for more info.