Feature/logan updates (#20)
* turn off some Xlint warnings * static * ignore TypographyEllipsis * added GradleCompatible * Create JSON Models Generation.md * Update JSON Models Generation.md * Update JSON Models Generation.md * facebook supress removed
This commit is contained in:
parent
51cb1ddb55
commit
cddc715951
|
|
@ -0,0 +1,124 @@
|
|||
## Описание генератора 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 вручную.
|
||||
|
|
@ -13,9 +13,7 @@ gradle.projectsEvaluated {
|
|||
"-Xlint:deprecation" <<
|
||||
"-Xlint:finally" <<
|
||||
"-Xlint:overrides" <<
|
||||
"-Xlint:path" <<
|
||||
"-Xlint:unchecked" <<
|
||||
"-Werror"
|
||||
"-Xlint:path"
|
||||
}
|
||||
|
||||
def excludes = rootProject.extensions.findByName("staticAnalysisExcludes")
|
||||
|
|
|
|||
|
|
@ -204,7 +204,6 @@
|
|||
<issue id="TooDeepLayout" severity="warning"/>
|
||||
<issue id="TooManyViews" severity="warning"/>
|
||||
<issue id="TypographyDashes" severity="warning"/>
|
||||
<issue id="TypographyEllipsis" severity="error"/>
|
||||
<issue id="UnknownIdInLayout" severity="error"/>
|
||||
<issue id="UnlocalizedSms" severity="error"/>
|
||||
<issue id="UnusedIds" severity="error"/>
|
||||
|
|
@ -266,5 +265,6 @@
|
|||
<issue id="ViewConstructor" severity="ignore"/>
|
||||
<issue id="ViewHolder" severity="ignore"/>
|
||||
<issue id="WebViewLayout" severity="ignore"/>
|
||||
<issue id="TypographyEllipsis" severity="ignore"/>
|
||||
|
||||
</lint>
|
||||
Loading…
Reference in New Issue