From aff4e4e8022a31f83bb82db4d2ee9bef249e65e4 Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Thu, 15 Mar 2018 14:17:23 +0100 Subject: [PATCH 1/4] remove read only user info key --- lib/gyro/parser/xcdatamodel/attribute.rb | 9 ++------- .../android-java/inc/_attributes_enum.liquid | 2 +- .../inc/_attributes_getter_setter.liquid | 5 +---- .../inc/_attributes_properties.liquid | 4 +--- .../inc/_enum_getter_setter.liquid | 2 +- .../android-java/inc/_primitives.liquid | 2 +- .../inc/_relationships_getter_setter.liquid | 2 +- .../inc/_relationships_properties.liquid | 2 +- .../inc/_attributes_enum.liquid | 2 +- .../inc/_attributes_properties.liquid | 6 ++---- .../inc/_enum_getter_setter.liquid | 2 +- .../android-kotlin/inc/_primitives.liquid | 2 +- .../inc/_relationships_properties.liquid | 2 +- .../inc/_attributes_enum.liquid | 2 +- .../inc/_attributes_properties.liquid | 20 +++++++++---------- .../swift3/inc/_attributes_enum.liquid | 2 +- .../swift3/inc/_attributes_properties.liquid | 12 +++++------ spec/fixtures/java/ignored/Shop.java | 1 - spec/fixtures/kotlin/ignored/Shop.kt | 1 - spec/fixtures/swift/ignored/Shop.swift | 2 -- .../xcdatamodel/ignored.xcdatamodel/contents | 9 ++------- 21 files changed, 34 insertions(+), 57 deletions(-) diff --git a/lib/gyro/parser/xcdatamodel/attribute.rb b/lib/gyro/parser/xcdatamodel/attribute.rb index 23a92db..1d0fb7c 100644 --- a/lib/gyro/parser/xcdatamodel/attribute.rb +++ b/lib/gyro/parser/xcdatamodel/attribute.rb @@ -19,7 +19,7 @@ module XCDataModel # class Attribute attr_accessor :entity_name, :name, :type, :optional, :indexed, :default - attr_accessor :realm_ignored, :realm_read_only, :enum_type, :enum_values + attr_accessor :realm_ignored, :enum_type, :enum_values attr_accessor :json_key_path, :json_values, :transformer, :comment, :support_annotation, :json_ignored alias optional? optional @@ -36,7 +36,6 @@ def initialize(attribute_xml, entity_name) @default = attribute_xml.attributes['defaultValueString'].to_s @type = attribute_xml.attributes['attributeType'].to_s.downcase.tr(' ', '_').to_sym @realm_ignored = !Gyro::Parser::XCDataModel.user_info(attribute_xml, 'realmIgnored').empty? - @realm_read_only = Gyro::Parser::XCDataModel.user_info(attribute_xml, 'realmReadOnly') @enum_type = Gyro::Parser::XCDataModel.user_info(attribute_xml, 'enumType') @enum_values = Gyro::Parser::XCDataModel.user_info(attribute_xml, 'enumValues').split(',') @json_key_path = Gyro::Parser::XCDataModel.user_info(attribute_xml, 'JSONKeyPath') @@ -55,7 +54,7 @@ def to_h 'optional' => optional, 'indexed' => indexed, 'default' => default, - 'realm_ignored' => realm_ignored, 'realm_read_only' => realm_read_only, + 'realm_ignored' => realm_ignored, 'enum_type' => enum_type, 'enum_values' => enum_values, 'json_key_path' => json_key_path, 'json_values' => json_values, 'json_ignored' => json_ignored, @@ -71,10 +70,6 @@ def enum? !@enum_type.empty? end - def read_only? - !@realm_read_only.empty? - end - def default? !@default.empty? end diff --git a/lib/templates/android-java/inc/_attributes_enum.liquid b/lib/templates/android-java/inc/_attributes_enum.liquid index b3b50a1..73f2a08 100644 --- a/lib/templates/android-java/inc/_attributes_enum.liquid +++ b/lib/templates/android-java/inc/_attributes_enum.liquid @@ -2,7 +2,7 @@ public static final class Attributes { {%- for attribute in entity.attributes -%} - {%- if attribute.realm_ignored == false or attribute.read_only == false -%} + {%- if attribute.realm_ignored == false -%} {%- if attribute.comment.size > 0 %} // {{ attribute.comment }} {%- endif %} diff --git a/lib/templates/android-java/inc/_attributes_getter_setter.liquid b/lib/templates/android-java/inc/_attributes_getter_setter.liquid index 21d7ddc..8b1142e 100644 --- a/lib/templates/android-java/inc/_attributes_getter_setter.liquid +++ b/lib/templates/android-java/inc/_attributes_getter_setter.liquid @@ -1,6 +1,4 @@ {%- for attribute in entity.attributes %} - - {%- if attribute.realm_read_only.size == 0 %} {%- comment %} ******* CONVERT TYPE CAPTURE ******* {% endcomment -%} {%- capture visibility %} @@ -12,7 +10,7 @@ {%- endcapture %} {%- capture convert_type %} - {%- if attribute.realm_read_only.size == 0 and attribute.enum_type.size > 0 -%} + {%- if attribute.enum_type.size > 0 -%} String {%- else -%} {%- if params.use_wrappers.size > 0 and attribute.optional == true -%} @@ -54,5 +52,4 @@ {{ visibility }} void set{{ name | titleize }}({%- if annotation.size > 0 %}{{ annotation | replace: "|"," " }} {% endif %}final {{ convert_type }} {{ name }}) { this.{{ name }} = {{ name }}; } - {%- endif %} {%- endfor %} \ No newline at end of file diff --git a/lib/templates/android-java/inc/_attributes_properties.liquid b/lib/templates/android-java/inc/_attributes_properties.liquid index 7c7474a..8ecf482 100644 --- a/lib/templates/android-java/inc/_attributes_properties.liquid +++ b/lib/templates/android-java/inc/_attributes_properties.liquid @@ -1,8 +1,7 @@ {% for attribute in entity.attributes -%} - {%- if attribute.realm_read_only.size == 0 -%} {%- comment %} ******* CONVERT TYPE CAPTURE ******* {% endcomment -%} {%- capture convert_type -%} - {%- if attribute.realm_read_only.size == 0 and attribute.enum_type.size > 0 -%} + {%- if attribute.enum_type.size > 0 -%} String {%- else -%} {%- if params.use_wrappers == "true" and attribute.optional == true -%} @@ -49,5 +48,4 @@ @android.support.annotation.{{ attribute.support_annotation }} {%- endif %} private {{ convert_type }} {{ name }}{{ default_value }}; - {%- endif -%} {%- endfor -%} \ No newline at end of file diff --git a/lib/templates/android-java/inc/_enum_getter_setter.liquid b/lib/templates/android-java/inc/_enum_getter_setter.liquid index d8f7e36..9fe789d 100644 --- a/lib/templates/android-java/inc/_enum_getter_setter.liquid +++ b/lib/templates/android-java/inc/_enum_getter_setter.liquid @@ -1,6 +1,6 @@ {%- for attribute in entity.attributes %} - {%- if attribute.realm_read_only.size == 0 and attribute.enum_type.size > 0 %} + {%- if attribute.enum_type.size > 0 %} {% if params.support_annotations.size > 0 %} @android.support.annotation.Nullable {%- capture annotation -%}@android.support.annotation.NonNull {% endcapture -%} diff --git a/lib/templates/android-java/inc/_primitives.liquid b/lib/templates/android-java/inc/_primitives.liquid index a8c67c2..0072ebc 100644 --- a/lib/templates/android-java/inc/_primitives.liquid +++ b/lib/templates/android-java/inc/_primitives.liquid @@ -1,5 +1,5 @@ {%- capture convert_type %} - {%- if attribute.realm_read_only.size == 0 and attribute.enum_type.size > 0 -%} + {%- if attribute.enum_type.size > 0 -%} String {%- else -%} {%- if params.use_wrappers.size > 0 and attribute.optional == true -%} diff --git a/lib/templates/android-java/inc/_relationships_getter_setter.liquid b/lib/templates/android-java/inc/_relationships_getter_setter.liquid index 5a80369..f8b3d22 100644 --- a/lib/templates/android-java/inc/_relationships_getter_setter.liquid +++ b/lib/templates/android-java/inc/_relationships_getter_setter.liquid @@ -1,7 +1,7 @@ {%- for relationship in entity.relationships %} {%- if relationship.inverse == false %} {%- capture relationship_type %} - {%- if relationship.realm_read_only.size == 0 and relationship.enum_type.size > 0 -%} + {%- if relationship.enum_type.size > 0 -%} String {%- else %} {%- if relationship.destination.size == 0 %} diff --git a/lib/templates/android-java/inc/_relationships_properties.liquid b/lib/templates/android-java/inc/_relationships_properties.liquid index 4761b27..0aec795 100644 --- a/lib/templates/android-java/inc/_relationships_properties.liquid +++ b/lib/templates/android-java/inc/_relationships_properties.liquid @@ -1,6 +1,6 @@ {%- for relationship in entity.relationships -%} {%- capture relationship_type -%} - {%- if relationship.realm_read_only.size == 0 and relationship.enum_type.size > 0 -%} + {%- if relationship.enum_type.size > 0 -%} String {%- else -%} {%- if relationship.destination.size == 0 -%} diff --git a/lib/templates/android-kotlin/inc/_attributes_enum.liquid b/lib/templates/android-kotlin/inc/_attributes_enum.liquid index 35ad9ab..7281148 100644 --- a/lib/templates/android-kotlin/inc/_attributes_enum.liquid +++ b/lib/templates/android-kotlin/inc/_attributes_enum.liquid @@ -2,7 +2,7 @@ object Attributes { {%- for attribute in entity.attributes -%} - {%- if attribute.realm_ignored == false or attribute.read_only == false -%} + {%- if attribute.realm_ignored == false -%} {%- if attribute.comment.size > 0 %} // {{ attribute.comment }} {%- endif %} diff --git a/lib/templates/android-kotlin/inc/_attributes_properties.liquid b/lib/templates/android-kotlin/inc/_attributes_properties.liquid index 65af484..8654298 100644 --- a/lib/templates/android-kotlin/inc/_attributes_properties.liquid +++ b/lib/templates/android-kotlin/inc/_attributes_properties.liquid @@ -1,8 +1,7 @@ {% for attribute in entity.attributes -%} - {%- if attribute.realm_read_only.size == 0 -%} {%- comment %} ******* CONVERT TYPE CAPTURE ******* {% endcomment -%} {%- capture convert_type -%} - {%- if attribute.realm_read_only.size == 0 and attribute.enum_type.size > 0 -%} + {%- if attribute.enum_type.size > 0 -%} String {%- else -%} {%- include 'inc/type_converter' -%} @@ -10,7 +9,7 @@ {%- endcapture -%} {%- capture is_primitive %} - {%- if attribute.realm_read_only.size == 0 and attribute.enum_type.size > 0 -%} + {%- if attribute.enum_type.size > 0 -%} false {%- else -%} {%- include 'inc/type_primitives' -%} @@ -56,5 +55,4 @@ @SerializedName("{{ attribute.json_key_path }}") {%- endif %} var {{ name }}: {{ convert_type }}{{ nullable_type }}{{ default_value }} - {%- endif -%} {%- endfor -%} \ No newline at end of file diff --git a/lib/templates/android-kotlin/inc/_enum_getter_setter.liquid b/lib/templates/android-kotlin/inc/_enum_getter_setter.liquid index cdfc8ad..67ad680 100644 --- a/lib/templates/android-kotlin/inc/_enum_getter_setter.liquid +++ b/lib/templates/android-kotlin/inc/_enum_getter_setter.liquid @@ -1,6 +1,6 @@ {%- for attribute in entity.attributes %} - {%- if attribute.realm_read_only.size == 0 and attribute.enum_type.size > 0 %} + {%- if attribute.enum_type.size > 0 %} {%- assign name = attribute.name %} fun get{{ name | titleize }}Enum(): {{ attribute.enum_type }}? = {{ attribute.enum_type }}.get({{ name }}) diff --git a/lib/templates/android-kotlin/inc/_primitives.liquid b/lib/templates/android-kotlin/inc/_primitives.liquid index a8c67c2..0072ebc 100644 --- a/lib/templates/android-kotlin/inc/_primitives.liquid +++ b/lib/templates/android-kotlin/inc/_primitives.liquid @@ -1,5 +1,5 @@ {%- capture convert_type %} - {%- if attribute.realm_read_only.size == 0 and attribute.enum_type.size > 0 -%} + {%- if attribute.enum_type.size > 0 -%} String {%- else -%} {%- if params.use_wrappers.size > 0 and attribute.optional == true -%} diff --git a/lib/templates/android-kotlin/inc/_relationships_properties.liquid b/lib/templates/android-kotlin/inc/_relationships_properties.liquid index 869100d..ad2377c 100644 --- a/lib/templates/android-kotlin/inc/_relationships_properties.liquid +++ b/lib/templates/android-kotlin/inc/_relationships_properties.liquid @@ -1,6 +1,6 @@ {%- for relationship in entity.relationships -%} {%- capture relationship_type -%} - {%- if relationship.realm_read_only.size == 0 and relationship.enum_type.size > 0 -%} + {%- if relationship.enum_type.size > 0 -%} String {%- else -%} {%- if relationship.destination.size == 0 -%} diff --git a/lib/templates/swift3-variant/inc/_attributes_enum.liquid b/lib/templates/swift3-variant/inc/_attributes_enum.liquid index 864dd6d..feb48a5 100644 --- a/lib/templates/swift3-variant/inc/_attributes_enum.liquid +++ b/lib/templates/swift3-variant/inc/_attributes_enum.liquid @@ -2,7 +2,7 @@ {% if entity.attributes.size > 0 %} enum Attributes: String { {%- for attribute in entity.attributes -%} - {%- if attribute.realm_ignored or attribute.realm_read_only.size == 0 -%} + {%- if attribute.realm_ignored -%} {%- if attribute.comment.size > 0 %} /// {{ attribute.comment }} {%- endif %} diff --git a/lib/templates/swift3-variant/inc/_attributes_properties.liquid b/lib/templates/swift3-variant/inc/_attributes_properties.liquid index 6abca1d..e6c2f60 100644 --- a/lib/templates/swift3-variant/inc/_attributes_properties.liquid +++ b/lib/templates/swift3-variant/inc/_attributes_properties.liquid @@ -9,18 +9,16 @@ {%- include 'inc/type_converter' -%} {%- endcapture -%} - {%- if attribute.realm_read_only.size == 0 -%} - {%- if attribute.enum_values.size > 0 -%} - {%- comment -%} ******* GENERATE ENUM ATTRIBUTE PROPERTY ******* {% endcomment -%} - {%- include 'inc/enum_attribute_property' -%} - {%- else -%} - {%- if attribute.optional == true -%} - {% comment -%} ******* GENERATE OPTIONAL ATTRIBUTE PROPERTY ******* {% endcomment -%} - {%- include 'inc/optional_attribute_property' -%} - {%- else -%} - {%- comment -%} ******* GENERATE DEFAULT ATTRIBUTE PROPERTY ******* {% endcomment %} + {%- if attribute.enum_values.size > 0 -%} + {%- comment -%} ******* GENERATE ENUM ATTRIBUTE PROPERTY ******* {% endcomment -%} + {%- include 'inc/enum_attribute_property' -%} + {%- else -%} + {%- if attribute.optional == true -%} + {% comment -%} ******* GENERATE OPTIONAL ATTRIBUTE PROPERTY ******* {% endcomment -%} + {%- include 'inc/optional_attribute_property' -%} + {%- else -%} + {%- comment -%} ******* GENERATE DEFAULT ATTRIBUTE PROPERTY ******* {% endcomment %} dynamic var {{ attribute.name }}: {{ convert_type }} = {{ default_value }} - {%- endif -%} {%- endif -%} {%- endif -%} {%- endfor -%} diff --git a/lib/templates/swift3/inc/_attributes_enum.liquid b/lib/templates/swift3/inc/_attributes_enum.liquid index 6599068..78ae737 100644 --- a/lib/templates/swift3/inc/_attributes_enum.liquid +++ b/lib/templates/swift3/inc/_attributes_enum.liquid @@ -2,7 +2,7 @@ {% if entity.attributes.size > 0 %} enum Attributes: String { {%- for attribute in entity.attributes -%} - {%- if attribute.realm_ignored or attribute.realm_read_only.size == 0 -%} + {%- if attribute.realm_ignored == false -%} {%- if attribute.comment.size > 0 %} /// {{ attribute.comment }} {%- endif %} diff --git a/lib/templates/swift3/inc/_attributes_properties.liquid b/lib/templates/swift3/inc/_attributes_properties.liquid index 01b988f..52016f3 100644 --- a/lib/templates/swift3/inc/_attributes_properties.liquid +++ b/lib/templates/swift3/inc/_attributes_properties.liquid @@ -9,17 +9,17 @@ {%- include 'inc/type_converter' -%} {%- endcapture -%} - {%- if attribute.realm_read_only.size == 0 -%} - {%- if attribute.enum_values.size > 0 -%} - {%- comment -%} ******* GENERATE ENUM ATTRIBUTE PROPERTY ******* {% endcomment -%} - {%- include 'inc/enum_attribute_property' -%} - {%- else -%}{%- if attribute.optional == true -%} + {%- if attribute.enum_values.size > 0 -%} + {%- comment -%} ******* GENERATE ENUM ATTRIBUTE PROPERTY ******* {% endcomment -%} + {%- include 'inc/enum_attribute_property' -%} + {%- else -%} + {%- if attribute.optional == true -%} {% comment -%} ******* GENERATE OPTIONAL ATTRIBUTE PROPERTY ******* {% endcomment -%} {%- include 'inc/optional_attribute_property' -%} {%- else -%} {%- comment -%} ******* GENERATE DEFAULT ATTRIBUTE PROPERTY ******* {% endcomment %} @objc dynamic var {{ attribute.name }}: {{ convert_type }} = {{ default_value }} {%- if attribute.name == entity.identity_attribute %} /* Primary Key */{% endif -%} - {%- endif -%}{%- endif -%} + {%- endif -%} {%- endif -%} {%- endfor -%} diff --git a/spec/fixtures/java/ignored/Shop.java b/spec/fixtures/java/ignored/Shop.java index 4517e5f..d967dd6 100644 --- a/spec/fixtures/java/ignored/Shop.java +++ b/spec/fixtures/java/ignored/Shop.java @@ -11,7 +11,6 @@ public class Shop extends RealmObject { public static final class Attributes { public static final String NAME = "name"; - public static final String READ_ONLY = "readOnly"; private Attributes() { // Hide constructor diff --git a/spec/fixtures/kotlin/ignored/Shop.kt b/spec/fixtures/kotlin/ignored/Shop.kt index 0dbbeaf..6f85296 100644 --- a/spec/fixtures/kotlin/ignored/Shop.kt +++ b/spec/fixtures/kotlin/ignored/Shop.kt @@ -11,7 +11,6 @@ open class Shop : RealmObject() { object Attributes { const val NAME: String = "name" - const val READ_ONLY: String = "readOnly" } object Relationships { diff --git a/spec/fixtures/swift/ignored/Shop.swift b/spec/fixtures/swift/ignored/Shop.swift index 576c497..c2fc45e 100644 --- a/spec/fixtures/swift/ignored/Shop.swift +++ b/spec/fixtures/swift/ignored/Shop.swift @@ -6,8 +6,6 @@ import Foundation final class Shop: Object { enum Attributes: String { - case ignored = "ignored" - case ignored2 = "ignored2" case name = "name" } diff --git a/spec/fixtures/xcdatamodel/ignored.xcdatamodel/contents b/spec/fixtures/xcdatamodel/ignored.xcdatamodel/contents index 8b12ff2..0275102 100644 --- a/spec/fixtures/xcdatamodel/ignored.xcdatamodel/contents +++ b/spec/fixtures/xcdatamodel/ignored.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -23,17 +23,12 @@ - - - - - - + \ No newline at end of file From a4db484ff718ea7e9f90f52aa54aa4c08179b500 Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Thu, 15 Mar 2018 14:30:28 +0100 Subject: [PATCH 2/4] fix realmIgnored condition on swift templates --- lib/templates/swift3-variant/inc/_attributes_enum.liquid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/templates/swift3-variant/inc/_attributes_enum.liquid b/lib/templates/swift3-variant/inc/_attributes_enum.liquid index feb48a5..31446de 100644 --- a/lib/templates/swift3-variant/inc/_attributes_enum.liquid +++ b/lib/templates/swift3-variant/inc/_attributes_enum.liquid @@ -2,7 +2,7 @@ {% if entity.attributes.size > 0 %} enum Attributes: String { {%- for attribute in entity.attributes -%} - {%- if attribute.realm_ignored -%} + {%- if attribute.realm_ignored == false -%} {%- if attribute.comment.size > 0 %} /// {{ attribute.comment }} {%- endif %} From 09b9f6e8d5f7a6d804942e08ad9351300706d9fa Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Thu, 15 Mar 2018 14:31:04 +0100 Subject: [PATCH 3/4] update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14f1d45..a2dc883 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,9 @@ * Improve error and warning messages when targetting an xcdatamodeld. [Steven Watremez](https://github.com/StevenWatremez) [#53](https://github.com/NijiDigital/gyro/pull/53) +* Stop supporting `realmReadOnly` user info key. + [Steven Watremez](https://github.com/StevenWatremez) + [#57](https://github.com/NijiDigital/gyro/pull/57) ## 1.4.0 From cc402434746379ca6337273822caf536efa23c18 Mon Sep 17 00:00:00 2001 From: Steven Watremez Date: Thu, 15 Mar 2018 15:09:55 +0100 Subject: [PATCH 4/4] remove realmReadOnly documentation --- UserInfoKeys.md | 53 ++---------------------------------- documentation/read_only.png | Bin 16784 -> 0 bytes 2 files changed, 2 insertions(+), 51 deletions(-) delete mode 100644 documentation/read_only.png diff --git a/UserInfoKeys.md b/UserInfoKeys.md index bce0be2..1a46723 100644 --- a/UserInfoKeys.md +++ b/UserInfoKeys.md @@ -9,7 +9,6 @@ Below are details about how to annotate your `.xcdatamodel` entities and attribu - [Primary key](#primary-key) - [Ignore attribute](#ignore-attribute) -- [Read only](#read-only) - [Inverse Relationships](#inverse-relationships) - [Optionnals fields and wrapper types](#optionnals-fields-and-wrapper-types) - [Support Annotations](#support-annotations) @@ -143,56 +142,6 @@ final class Shop: Object { ---- - - -# Read only (DEPRECATED) - -
- Information about read only 'user info' -On iOS/macOS, you can define attributes which are not persisted and whose value is computed dynamically. -To do so, add the following 'user info' to **the attribute** - -| Key | Value | -|-----|-------| -| `realmReadOnly` | `the_code_source_to_generate` | - - -__Example__: On the `readOnly` attribute of the `Shop` entity: - -![Read Only](documentation/read_only.png) -
- -
-📑 Sample of the generated code in Objective-C (iOS) - -```objc -// DO NOT EDIT | Generated by gyro - -//////////////////////////////////////////////////////////////////////////////// - -#pragma mark - Imports - -#import "RLMShop.h" - -//////////////////////////////////////////////////////////////////////////////// - -#pragma mark - Implementation - -@implementation RLMShop - -#pragma mark - Superclass Overrides - -- (NSString *)readOnly -{ - return self.name; -} - -@end -``` -
- - --- @@ -570,6 +519,8 @@ extension Shop: Mappable { +--- + ## Combine JSONKeyPath and enums diff --git a/documentation/read_only.png b/documentation/read_only.png deleted file mode 100644 index 275d624df7bf40fe38dd8fac253350c72ffec198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16784 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 P_eWe2