Removed necessary "libraries" nesting, removed old json generator
This commit is contained in:
parent
f8f1f2293c
commit
64424e9197
|
|
@ -1,124 +0,0 @@
|
|||
## Описание генератора JSON моделей
|
||||
|
||||
Генератор JSON моделей - это скрипт, который автоматически создает классы JSON моделей на основе описания их схемы в файле формата YAML.
|
||||
|
||||
Генерируется 2 типа классов:
|
||||
- классы, описывающие enum;
|
||||
- классы, описывающие модели.
|
||||
|
||||
Классы моделей размечаются для работы с библиотекой LoganSquare и наследуется от абстракного класса `ApiModel`, содержащего логику валидации.
|
||||
|
||||
Классы моделей содержат в себе:
|
||||
- конструктор без параметров;
|
||||
- конструктор со всеми возможными параметрами в случае, если модель не наследуется ни от какой другой модели;
|
||||
- приватные поля, описывающие параметры модели;
|
||||
- публичный `getter` и `setter` для каждого поля модели;
|
||||
- метод `validate` для валидации модели;
|
||||
- метод `equals` и `hashCode` на основе всех содержащихся полей;
|
||||
- метод `writeObject` и `readObject` для стандартной сериализации объекта;
|
||||
- метод `copy` для создания копии объекта. Создается только в случае, если модель не наследуется ни от какой другой модели.
|
||||
|
||||
**ВАЖНО!** Копирование через метод `copy` не гарантирует копирование всех объектов, содержащихся во всех полях.
|
||||
|
||||
## Подключение и использование генератора
|
||||
|
||||
Подключаем сабмодуль [BuildScripts](https://github.com/TouchInstinct/BuildScripts) в папку libraries.
|
||||
|
||||
Чтобы подключить скрипт, добавьте в конец файл `build.gradle` модуля следующую строку:
|
||||
```gradle
|
||||
apply from: "${rootDir}/libraries/BuildScripts/gradle/jsonModelsGeneration.gradle"
|
||||
```
|
||||
|
||||
Чтобы зарегистрировать YAML файлы для генерации моделей, в секцию `android` надо добавить:
|
||||
```gradle
|
||||
android {
|
||||
extensions.jsonModelsMapping = ["schemes/api_models.yaml -> ${defaulConfig.applicationId}.logic.api.model",
|
||||
"schemes/internal_models.yaml -> ${defaulConfig.applicationId}.logic.model"]
|
||||
}
|
||||
```
|
||||
- `schemes/api_models.yaml` - путь к файлу схемы. По умолчанию относительно папки модуля, но можно указать и абсолютный путь;
|
||||
- `->` - разделитель;
|
||||
- `${applicationId}.logic.api.model` - package-name моделей, которые будут сгенерированы на основе этого файла.
|
||||
|
||||
## Структура файла YAML
|
||||
|
||||
YAML файл может содержать 3 типа объектов: описание модели, описание enum, импортированные классы.
|
||||
|
||||
### Описание модели
|
||||
Описание начинается с `class MyModel:`, где `MyModel` - это имя класса, который будет сгенерирован.
|
||||
|
||||
Затем для класса идет описание параметров класса:
|
||||
- параметр `typeArguments: TResponse, TData` добавляет к классу указанные аргументы: `class MyModel<TResponse, TData>`;
|
||||
- параметр `extends: BaseResponse<String>` наследует класс от указанного класса: `class MyModel extends BaseResponse<String>`;
|
||||
- параметры, описывающие поля класса, например `name: string` добавляет поле типа `String` с названием `name`.
|
||||
|
||||
### Описание параметра поля класса
|
||||
В простом виде поле добавляется, как `name: string`. То есть, указывается имя поля и его тип.
|
||||
|
||||
Вообще, поле может быть описано следующими параметрами:
|
||||
1. Название параметра - это имя поля;
|
||||
2. `jsonName`, необязательное - имя параметра в разметке JSON, соответсвующее полю. По умолчанию берется ;
|
||||
3. `type`, обязательное - тип поля. Разрешенные типы:
|
||||
- строки `string`, `String`;
|
||||
- целые числа `int`, `Integer`, `long`, `Long`;
|
||||
- дробные числа `float`, `Float`, `double`, `Double`;
|
||||
- буленовские значения `boolean`, `Boolean`;
|
||||
- дата/время `date`, `datetime`, `DateTime`;
|
||||
- списки `List<*>`;
|
||||
- мапы `Map<String, *>;
|
||||
- описанные в этом же файле enum'ы;
|
||||
- описанные в этом же файле импортированные классы;
|
||||
4. `flags`, необязательное - флаги для валидации объекта. Перечисляются через запятую, могут быть:
|
||||
- `nullable` - в поле может прийти null. По умолчанию все поля считаются `non-null`;
|
||||
- `missable` - JSON может не содержать такого поля. По умолчанию все поля считаются `non-missable`;
|
||||
- `solid` - если поле содержит коллекцию, то все элементы в ней обязаны быть валидными. По умолчанию не валидные элементы исключаются из коллекции на этапе валидации;
|
||||
- `non-empty` - если поле содержит коллекцию, то она не должна быть пустой. По умолчанию пустые коллекции разрешены.
|
||||
|
||||
### Пример описания моделей:
|
||||
```yaml
|
||||
class SimpleModel:
|
||||
name: string
|
||||
age: int
|
||||
birthDate: date
|
||||
|
||||
class ComplexModel:
|
||||
id:
|
||||
type: long
|
||||
jsonName: object_id
|
||||
usersList:
|
||||
type: List<SimpleModel>
|
||||
flags: solid, non-empty
|
||||
hasSomeInfo:
|
||||
type: boolean
|
||||
jsonName: has_info
|
||||
flags: nullable
|
||||
```
|
||||
|
||||
### Описание enum'a
|
||||
Описание начинается с `enum MyEnum:`, где `MyEnum` - это имя enum'a, который будет сгенерирован.
|
||||
|
||||
Затем идет перечисление всех возможных значений в формате `VALUE: json_value`, где `VALUE` - имя значения в enum'e, а `json_value` - соответствующая этому значению строка в JSON.
|
||||
|
||||
Пример:
|
||||
```yaml
|
||||
enum SimpleEnum:
|
||||
MALE: male_gender
|
||||
FEMALE: female_gender
|
||||
```
|
||||
|
||||
### Описание импортированных классов
|
||||
Импортированные классы добавляются списком в разделе `imports`. Все классы должны быть указаны полным именем.
|
||||
|
||||
Пример:
|
||||
```yaml
|
||||
imports:
|
||||
- android.util.Pair
|
||||
- com.myproject.model.UserExtension
|
||||
|
||||
class MyModel:
|
||||
pair: Pair
|
||||
users: List<UserExtension>
|
||||
```
|
||||
Импортированные классы нужно использовать в двух случаях:
|
||||
1. Для них заргеистрированы конвертеры в LoganSquare;
|
||||
2. Это расширенные или кастомные модели, описанные для LoganSquare вручную.
|
||||
|
|
@ -257,7 +257,7 @@ getPmdTask = { sources ->
|
|||
def taskName = "pmd_${project.name}"
|
||||
tasks.create(taskName, Pmd) {
|
||||
pmdClasspath = configurations.pmd.asFileTree
|
||||
ruleSetFiles = files("${rootDir}/libraries/BuildScripts/pmd/rulesets/java/android.xml")
|
||||
ruleSetFiles = files "$rootDir/BuildScripts/pmd/rulesets/java/android.xml"
|
||||
ruleSets = []
|
||||
source files(sources)
|
||||
ignoreFailures = true
|
||||
|
|
@ -294,9 +294,9 @@ getLintTasks = {
|
|||
android.lintOptions.checkAllWarnings = true
|
||||
android.lintOptions.warningsAsErrors = false
|
||||
android.lintOptions.xmlReport = true
|
||||
android.lintOptions.xmlOutput = file("${project.buildDir}/reports/lint_report.xml")
|
||||
android.lintOptions.xmlOutput = file "$project.buildDir/reports/lint_report.xml"
|
||||
android.lintOptions.htmlReport = false
|
||||
android.lintOptions.lintConfig = file("${rootDir}/libraries/BuildScripts/lint/lint.xml")
|
||||
android.lintOptions.lintConfig = file "$rootDir/BuildScripts/lint/lint.xml"
|
||||
return lintTaskNames
|
||||
}
|
||||
|
||||
|
|
@ -309,7 +309,7 @@ getCheckstyleTask = { sources ->
|
|||
ignoreFailures = true
|
||||
showViolations = false
|
||||
source files(sources)
|
||||
configFile file("${rootDir}/libraries/BuildScripts/checkstyle/configuration/touchin_checkstyle.xml")
|
||||
configFile file("$rootDir/BuildScripts/checkstyle/configuration/touchin_checkstyle.xml")
|
||||
checkstyleClasspath = configurations.checkstyle.asFileTree
|
||||
classpath = files(System.getenv("ANDROID_HOME") + "/platforms/" + android.compileSdkVersion + "/android.jar") +
|
||||
files(System.properties.'java.home' + "/lib/rt.jar") +
|
||||
|
|
@ -332,7 +332,7 @@ getKotlinDetektTask = { isAndroidProject ->
|
|||
def input = "${rootDir}"
|
||||
def output = "${project.buildDir}/reports"
|
||||
def outputName = "kotlin-detekt"
|
||||
def config = "${rootDir}/libraries/BuildScripts/kotlin/detekt-config.yml"
|
||||
def config = "$rootDir/BuildScripts/kotlin/detekt-config.yml"
|
||||
|
||||
// TODO add excludes from rootProject.extensions.findByName("staticAnalysisExcludes")
|
||||
def filters = ".*src/test.*,.*/resources/.*,.*/tmp/.*"
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,7 +1,7 @@
|
|||
def getServerProjectSources
|
||||
def getAndroidProjectSources
|
||||
|
||||
apply from: "${rootDir}/libraries/BuildScripts/gradle/commonStaticAnalysis.gradle"
|
||||
apply from: "$rootDir/BuildScripts/gradle/commonStaticAnalysis.gradle"
|
||||
|
||||
gradle.projectsEvaluated {
|
||||
|
||||
|
|
@ -104,5 +104,3 @@ getAndroidProjectSources = { excludes ->
|
|||
}
|
||||
return sources
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue