gyro 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/gyro +5 -1
- data/lib/gyro/log.rb +12 -11
- data/lib/gyro/parser/xcdatamodel/attribute.rb +2 -2
- data/lib/gyro/parser/xcdatamodel/relationship.rb +5 -4
- data/lib/gyro/parser/xcdatamodel/xcdatamodel.rb +11 -5
- data/lib/gyro/template.rb +57 -33
- data/lib/gyro/version.rb +1 -1
- data/lib/templates/android-java/README.md +8 -6
- data/lib/templates/android-java/inc/_relationships_enum.liquid +3 -0
- data/lib/templates/android-kotlin/README.md +12 -10
- data/lib/templates/android-kotlin/enum.liquid +1 -1
- data/lib/templates/android-kotlin/inc/_relationships_enum.liquid +3 -0
- data/lib/templates/{decodable → anviking-decodable}/README.md +0 -0
- data/lib/templates/{decodable → anviking-decodable}/entity.liquid +0 -0
- data/lib/templates/{decodable → anviking-decodable}/entity_filename.liquid +0 -0
- data/lib/templates/{decodable → anviking-decodable}/enum.liquid +0 -0
- data/lib/templates/{decodable → anviking-decodable}/enum_filename.liquid +0 -0
- data/lib/templates/config.yml +25 -0
- data/lib/templates/swift3-variant/README.md +5 -5
- data/lib/templates/swift3-variant/entity.liquid +3 -0
- data/lib/templates/swift3-variant/inc/_attributes_enum.liquid +1 -1
- data/lib/templates/swift3-variant/inc/_relationships_enum.liquid +3 -0
- data/lib/templates/swift3/README.md +10 -2
- data/lib/templates/swift3/entity.liquid +1 -1
- data/lib/templates/swift3/enum.liquid +1 -1
- data/lib/templates/swift3/inc/_attributes_enum.liquid +1 -1
- data/lib/templates/swift3/inc/_attributes_properties.liquid +1 -1
- data/lib/templates/swift3/inc/_enum_attribute_property.liquid +3 -3
- data/lib/templates/swift3/inc/_ignored_properties.liquid +1 -1
- data/lib/templates/swift3/inc/_indexed_properties.liquid +1 -1
- data/lib/templates/swift3/inc/_inverse_properties.liquid +3 -3
- data/lib/templates/swift3/inc/_optional_attribute_property.liquid +2 -2
- data/lib/templates/swift3/inc/_primary_key.liquid +1 -1
- data/lib/templates/swift3/inc/_relationship_properties.liquid +2 -2
- data/lib/templates/swift3/inc/_relationships_enum.liquid +1 -1
- metadata +7 -8
- data/lib/templates/android.alias +0 -10
- data/lib/templates/swift4.alias +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bf0426491e18b9a47860737ea3d6dc2747f9873
|
4
|
+
data.tar.gz: 076fc086a2c155072ef315cf2eacbe9618dd8c4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ffac77775f2eb5aabe39c3b59a9e7c895fdcc936945652e48f2c8c7f3a8fc4f780b430a302dd9e47541e5ebef8bdad4e983a1af71df60e2f51fae3c8af97a047
|
7
|
+
data.tar.gz: 30b87e1da934dbbf2f297962013eac1d384d8424ca5cb65f61d988c4663d5f0775cdcf605a1a1486be43a47c9fe7904a860bda396efd71661650f218a97c08da
|
data/bin/gyro
CHANGED
@@ -76,6 +76,7 @@ rescue OptionParser::ParseError => e
|
|
76
76
|
exit 1
|
77
77
|
end
|
78
78
|
|
79
|
+
# Model directory parsing
|
79
80
|
if options[:model].nil?
|
80
81
|
Gyro::Log.info('No model provided, trying to find one in the local directory…')
|
81
82
|
options[:model] = Gyro::Parser::XCDataModel.find_in_dir(dir)
|
@@ -90,6 +91,8 @@ else
|
|
90
91
|
Gyro::Log.success("Using #{basename} in #{dirname}")
|
91
92
|
end
|
92
93
|
|
94
|
+
xcdatamodel_dir = Pathname.new(options[:model])
|
95
|
+
|
93
96
|
# Liquid Templates
|
94
97
|
if options[:template].nil?
|
95
98
|
# Generate JSON if no -t is specified
|
@@ -114,12 +117,13 @@ end
|
|
114
117
|
puts <<-INFO.gsub(/ \|/, '')
|
115
118
|
|
|
116
119
|
|#===================================
|
120
|
+
|# Model : #{xcdatamodel_dir}
|
117
121
|
|# Template : #{template_dir}
|
118
122
|
|# Output Dir : #{output_dir}
|
119
123
|
|# Params : #{options[:params].inspect}
|
120
124
|
|#===================================
|
121
125
|
INFO
|
122
126
|
|
123
|
-
xcdatamodel = Gyro::Parser::XCDataModel::XCDataModel.new(
|
127
|
+
xcdatamodel = Gyro::Parser::XCDataModel::XCDataModel.new(xcdatamodel_dir)
|
124
128
|
gen = Gyro::Generator::Liquid.new(template_dir, output_dir, options[:params])
|
125
129
|
gen.generate(xcdatamodel)
|
data/lib/gyro/log.rb
CHANGED
@@ -16,30 +16,30 @@ module Gyro
|
|
16
16
|
# Print nice and colored output for various error/success/title messages of Gyro
|
17
17
|
#
|
18
18
|
module Log
|
19
|
-
@
|
20
|
-
def self.
|
21
|
-
@
|
19
|
+
@in_test_context = false
|
20
|
+
def self.in_test_context=(value)
|
21
|
+
@in_test_context = value
|
22
22
|
end
|
23
23
|
|
24
24
|
def self.title(str) # bg yellow
|
25
|
-
puts "\n#{str.colorize(:gray, :blue)}" unless @
|
25
|
+
puts "\n#{str.colorize(:gray, :blue)}" unless @in_test_context
|
26
26
|
end
|
27
27
|
|
28
28
|
def self.error(str)
|
29
|
-
puts "! #{str}".colorize(:red, :bold) unless @
|
29
|
+
puts "! #{str}".colorize(:red, :bold) unless @in_test_context
|
30
30
|
end
|
31
31
|
|
32
32
|
def self.info(str)
|
33
|
-
puts "> #{str}".colorize(:yellow, :bold) unless @
|
33
|
+
puts "> #{str}".colorize(:yellow, :bold) unless @in_test_context
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.success(str)
|
37
|
-
puts "√ #{str}".colorize(:green, :bold) unless @
|
37
|
+
puts "√ #{str}".colorize(:green, :bold) unless @in_test_context
|
38
38
|
end
|
39
39
|
|
40
|
-
def self.fail!(message
|
40
|
+
def self.fail!(message)
|
41
41
|
Gyro::Log.error message
|
42
|
-
raise message if
|
42
|
+
raise message if @in_test_context
|
43
43
|
exit 1
|
44
44
|
end
|
45
45
|
end
|
@@ -51,8 +51,9 @@ class String
|
|
51
51
|
ANSI_COLORS = %i[black red green yellow blue magenta cyan gray white].freeze
|
52
52
|
ANSI_MODES = %i[normal bold faint italic underline blink].freeze
|
53
53
|
|
54
|
-
def colorize(fg = :
|
55
|
-
|
54
|
+
def colorize(fg = :normal, *options)
|
55
|
+
fg_idx = ANSI_COLORS.index(fg)
|
56
|
+
fg_code = fg_idx.nil? ? ANSI_MODES.index(fg_idx) : 30 + fg_idx
|
56
57
|
other_codes = options.map do |opt|
|
57
58
|
bg = ANSI_COLORS.index(opt)
|
58
59
|
bg.nil? ? ANSI_MODES.index(opt) : 40 + bg
|
@@ -116,13 +116,13 @@ module Gyro
|
|
116
116
|
# rubocop:disable Style/GuardClause
|
117
117
|
if @type == :undefined || @type.empty?
|
118
118
|
msg = %(The attribute "#{@name}" from "#{@entity_name}" has no type - please fix it)
|
119
|
-
Gyro::Log.fail!(msg
|
119
|
+
Gyro::Log.fail!(msg)
|
120
120
|
end
|
121
121
|
if !@json_key_path.empty? && !@enum_values.empty? && (@enum_values.size != @json_values.size)
|
122
122
|
message = %(The attribute "#{@name}" from "#{@entity_name}" is wrongly annotated:) +
|
123
123
|
%(when declaring an type with enum and JSONKeyPath, you must have the same number of items) +
|
124
124
|
%(in the 'enumValues' and 'JSONValues' annotations.)
|
125
|
-
Gyro::Log.fail!(message
|
125
|
+
Gyro::Log.fail!(message)
|
126
126
|
end
|
127
127
|
# rubocop:enable Style/GuardClause
|
128
128
|
end
|
@@ -18,7 +18,7 @@ module Gyro
|
|
18
18
|
# One Relationship between attributes in the xcdatamodel
|
19
19
|
#
|
20
20
|
class Relationship
|
21
|
-
attr_accessor :entity_name, :name, :type, :optional, :deletion_rule
|
21
|
+
attr_accessor :entity_name, :name, :type, :optional, :deletion_rule, :comment
|
22
22
|
attr_accessor :inverse_name, :inverse_type, :json_key_path, :support_annotation, :json_ignored
|
23
23
|
attr_accessor :realm_ignored
|
24
24
|
attr_accessor :destination
|
@@ -38,6 +38,7 @@ module Gyro
|
|
38
38
|
@realm_ignored = Gyro::Parser::XCDataModel.user_info(relationship_xml, 'realmIgnored').empty? ? false : true
|
39
39
|
@json_ignored = Gyro::Parser::XCDataModel.user_info(relationship_xml, 'JSONIgnored').empty? ? false : true
|
40
40
|
@support_annotation = Gyro::Parser::XCDataModel.user_info(relationship_xml, 'supportAnnotation')
|
41
|
+
@comment = Gyro::Parser::XCDataModel.user_info(relationship_xml, 'comment')
|
41
42
|
load_type(relationship_xml)
|
42
43
|
@destination = Gyro::Parser::XCDataModel.user_info(relationship_xml, 'destination')
|
43
44
|
search_for_error
|
@@ -45,7 +46,7 @@ module Gyro
|
|
45
46
|
|
46
47
|
def to_h
|
47
48
|
{ 'entity_name' => entity_name, 'name' => name, 'type' => type.to_s,
|
48
|
-
'optional' => optional, 'deletion_rule' => deletion_rule,
|
49
|
+
'optional' => optional, 'deletion_rule' => deletion_rule, 'comment' => comment,
|
49
50
|
'inverse_name' => inverse_name, 'inverse_type' => inverse_type,
|
50
51
|
'json_key_path' => json_key_path, 'json_ignored' => json_ignored,
|
51
52
|
'support_annotation' => support_annotation,
|
@@ -72,12 +73,12 @@ module Gyro
|
|
72
73
|
# rubocop:disable Style/GuardClause
|
73
74
|
if inverse_type.empty? && destination.empty?
|
74
75
|
message = %(The relationship "#{@name}" from "#{@entity_name}" is wrong - please fix it)
|
75
|
-
Gyro::Log.fail!(message
|
76
|
+
Gyro::Log.fail!(message)
|
76
77
|
end
|
77
78
|
if !destination.empty? && type != :to_many
|
78
79
|
message = %(The relationship "#{@name}" from "#{@entity_name}" is wrong - ) +
|
79
80
|
%(please set a 'No Value' relationship as 'To Many')
|
80
|
-
Gyro::Log.fail!(message
|
81
|
+
Gyro::Log.fail!(message)
|
81
82
|
end
|
82
83
|
# rubocop:enable Style/GuardClause
|
83
84
|
end
|
@@ -36,12 +36,18 @@ module Gyro
|
|
36
36
|
attr_accessor :entities
|
37
37
|
|
38
38
|
def initialize(xcdatamodel_dir)
|
39
|
-
|
40
|
-
Gyro::Log.fail!(
|
39
|
+
is_xcdatamodeld = xcdatamodel_dir.extname != '.xcdatamodeld'
|
40
|
+
Gyro::Log.fail!(%(Please target an '.xcdatamodel' file inside your xcdatamodeld)) unless is_xcdatamodeld
|
41
|
+
if xcdatamodel_dir.parent.extname == '.xcdatamodeld'
|
42
|
+
xcdatamodeld_info_message = 'You are using an xcdatamodeld, ' \
|
43
|
+
'please be sure you target the correct version of your xcdatamodel.' \
|
44
|
+
' Current version used by gyro is: ' + xcdatamodel_dir.basename.to_path
|
45
|
+
Gyro::Log.info(xcdatamodeld_info_message)
|
46
|
+
end
|
47
|
+
file_contents = xcdatamodel_dir + 'contents'
|
48
|
+
Gyro::Log.fail!('Unable to find contents of xcdatamodel') unless file_contents.exist?
|
41
49
|
@entities = {}
|
42
|
-
|
43
|
-
document_xml = Document.new(file)
|
44
|
-
file.close
|
50
|
+
document_xml = File.open(file_contents) { |file| Document.new(file) }
|
45
51
|
load_entities(document_xml)
|
46
52
|
end
|
47
53
|
|
data/lib/gyro/template.rb
CHANGED
@@ -12,24 +12,56 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
require 'yaml'
|
16
|
+
|
15
17
|
module Gyro
|
16
18
|
# Gyro Template Helper
|
17
19
|
#
|
18
20
|
module Template
|
21
|
+
# Print template list representation
|
22
|
+
#
|
19
23
|
def self.print_list
|
20
|
-
Gyro::Template.directory.children.
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
24
|
+
directories = Gyro::Template.directory.children.select(&:directory?).map(&:basename).map(&:to_s)
|
25
|
+
deprecated = select_deprecated_templates(directories)
|
26
|
+
non_deprecated = select_non_deprecated_templates(directories)
|
27
|
+
print_templates(non_deprecated.sort + deprecated.sort)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Select deprecated templates from the config file
|
31
|
+
#
|
32
|
+
# @param [Array<String>] directories
|
33
|
+
# The array of directories name
|
34
|
+
# @return [Array<String>]
|
35
|
+
# The array of deprecated templates
|
36
|
+
#
|
37
|
+
def self.select_deprecated_templates(directories)
|
38
|
+
config['deprecated'].select { |t| config['alias'].key?(t) || directories.include?(t) }
|
39
|
+
end
|
40
|
+
|
41
|
+
# Select non deprecated templates from the template directory and the config file
|
42
|
+
#
|
43
|
+
# @param [Array<String>] directories
|
44
|
+
# The array of directories name
|
45
|
+
# @return [Array<String>]
|
46
|
+
# The array of non deprecated templates
|
47
|
+
#
|
48
|
+
def self.select_non_deprecated_templates(directories)
|
49
|
+
(directories + config['alias'].keys).reject { |t| config['deprecated'].include?(t) }
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.print_templates(array)
|
53
|
+
array.each do |name|
|
54
|
+
alias_target = Gyro::Template.resolve_alias(name)
|
55
|
+
is_deprecated = config['deprecated'].include?(name)
|
56
|
+
txt = [' - ']
|
57
|
+
txt << name.colorize(is_deprecated ? :gray : :normal)
|
58
|
+
if alias_target
|
59
|
+
txt << ' (alias for '.colorize(:gray, :faint)
|
60
|
+
txt << alias_target.colorize(:gray)
|
61
|
+
txt << ')'.colorize(:gray, :faint)
|
32
62
|
end
|
63
|
+
txt << ' (deprecated)'.colorize(:yellow) if is_deprecated
|
64
|
+
puts txt.join
|
33
65
|
end
|
34
66
|
end
|
35
67
|
|
@@ -50,28 +82,14 @@ module Gyro
|
|
50
82
|
|
51
83
|
# @param [Pathname] entry
|
52
84
|
# The alias to resolve
|
53
|
-
# @return [
|
54
|
-
#
|
85
|
+
# @return [String]
|
86
|
+
# The alias target name
|
55
87
|
# Or nil if the entry does not correspond to a valid template alias
|
56
88
|
#
|
57
|
-
def self.resolve_alias(
|
58
|
-
|
59
|
-
return nil
|
60
|
-
|
61
|
-
target = entry.open(&:readline).chomp # Only read the first line of the file, the rest is ignored
|
62
|
-
return nil if File.basename(target) != target || target.include?('..') # Security measure
|
63
|
-
[base, target]
|
64
|
-
end
|
65
|
-
|
66
|
-
# Resolve alias by name
|
67
|
-
#
|
68
|
-
# @return [(String, String)]
|
69
|
-
# A 2-items array of [the alias name, the alias target name]
|
70
|
-
# Or nil if the name does not correspond to a valid template alias
|
71
|
-
#
|
72
|
-
def self.resolve_alias_name(name)
|
73
|
-
path = Gyro::Template.directory + (name + '.alias')
|
74
|
-
resolve_alias(path)
|
89
|
+
def self.resolve_alias(name)
|
90
|
+
target = config['alias'][name]
|
91
|
+
return nil unless target
|
92
|
+
target
|
75
93
|
end
|
76
94
|
|
77
95
|
# @param [String] template_param
|
@@ -108,9 +126,15 @@ module Gyro
|
|
108
126
|
# The path to the template corresponding to that name or path
|
109
127
|
#
|
110
128
|
def self.find_by_name(name)
|
111
|
-
|
129
|
+
target = Gyro::Template.resolve_alias(name)
|
112
130
|
template_dir = Gyro::Template.directory + (target || name)
|
113
131
|
return template_dir if template_dir.directory?
|
114
132
|
end
|
133
|
+
|
134
|
+
# Hash of Yaml config for templates
|
135
|
+
#
|
136
|
+
def self.config
|
137
|
+
@config ||= YAML.load_file(Gyro::Template.directory + 'config.yml')
|
138
|
+
end
|
115
139
|
end
|
116
140
|
end
|
data/lib/gyro/version.rb
CHANGED
@@ -8,13 +8,15 @@
|
|
8
8
|
|
9
9
|
If you want to use this template you need to work with `Realm`.
|
10
10
|
|
11
|
-
#
|
11
|
+
# Customization
|
12
12
|
|
13
|
-
|
13
|
+
You can use the following parameters to inject custom values to this template (using `--param KEY:VALUE` on the command line):
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
| Parameter Key | Description |
|
16
|
+
|---------------|-------------|
|
17
|
+
| `package` | The Android package in which the generated files will be generated (e.g. "`com.gyro.model.realm`") |
|
18
|
+
| `use_wrappers` | Define this to `true` if you want to use wrapper types (e.g. `Boolean`) instead of primitive types (e.g. `boolean`) when your attribute is **optional** inside xcdatamodel |
|
19
|
+
| `support_annotations` | Define this to `true` to generate `@android.support.annotation`s for properties (e.g. `@android.support.annotation.IntRange(from=0,to=255)`, `@android.support.annotation.Nullable`, etc) |
|
18
20
|
|
19
21
|
# Usage
|
20
22
|
|
@@ -161,4 +163,4 @@ public class Product extends RealmObject {
|
|
161
163
|
this.price = price;
|
162
164
|
}
|
163
165
|
}
|
164
|
-
```
|
166
|
+
```
|
@@ -3,6 +3,9 @@
|
|
3
3
|
public static final class Relationships {
|
4
4
|
{%- for relationship in entity.relationships -%}
|
5
5
|
{%- if relationship.inverse == false %}
|
6
|
+
{%- if relationship.comment.size > 0 %}
|
7
|
+
// {{ relationship.comment }}
|
8
|
+
{%- endif %}
|
6
9
|
public static final String {{ relationship.name | snake_case | upcase }} = "{{ relationship.name }}";
|
7
10
|
{%- endif -%}
|
8
11
|
{%- endfor %}
|
@@ -8,11 +8,13 @@
|
|
8
8
|
|
9
9
|
If you want to use this template you need to work with `Realm`.
|
10
10
|
|
11
|
-
#
|
11
|
+
# Customization
|
12
12
|
|
13
|
-
|
13
|
+
You can use the following parameters to inject custom values to this template (using `--param KEY:VALUE` on the command line):
|
14
14
|
|
15
|
-
|
15
|
+
| Parameter Key | Description |
|
16
|
+
|---------------|-------------|
|
17
|
+
| `package` | The Android package in which the generated files will be generated (e.g. "`com.gyro.model.realm`") |
|
16
18
|
|
17
19
|
# Usage
|
18
20
|
|
@@ -35,20 +37,20 @@ package com.gyro.model.realm
|
|
35
37
|
|
36
38
|
import io.realm.RealmObject
|
37
39
|
|
38
|
-
class FidelityCard: RealmObject() {
|
40
|
+
open class FidelityCard: RealmObject() {
|
39
41
|
|
40
42
|
object Attributes {
|
41
|
-
const val IDENTIFIER: String = "identifier"
|
42
|
-
const val POINTS: String = "points"
|
43
|
+
const val IDENTIFIER: String = "identifier"
|
44
|
+
const val POINTS: String = "points"
|
43
45
|
}
|
44
46
|
|
45
47
|
object Relationships {
|
46
|
-
const val USER: String = "user"
|
48
|
+
const val USER: String = "user"
|
47
49
|
}
|
48
50
|
|
49
|
-
private var identifier: Short = 0
|
50
|
-
private var points: Integer = 0
|
51
|
-
private var user: User? = null
|
51
|
+
private var identifier: Short = 0
|
52
|
+
private var points: Integer = 0
|
53
|
+
private var user: User? = null
|
52
54
|
}
|
53
55
|
```
|
54
56
|
|
@@ -21,7 +21,7 @@ enum class {{ attribute.enum_type }}(val jsonValue: String) {
|
|
21
21
|
|
22
22
|
companion object {
|
23
23
|
@JvmStatic
|
24
|
-
fun get(jsonValue: String): {{ attribute.enum_type }}? {
|
24
|
+
fun get(jsonValue: String?): {{ attribute.enum_type }}? {
|
25
25
|
return {{ attribute.enum_type }}.values().firstOrNull { it.jsonValue == jsonValue }
|
26
26
|
}
|
27
27
|
}
|
@@ -3,6 +3,9 @@
|
|
3
3
|
object Relationships {
|
4
4
|
{%- for relationship in entity.relationships -%}
|
5
5
|
{%- if relationship.inverse == false %}
|
6
|
+
{%- if relationship.comment.size > 0 %}
|
7
|
+
// {{ relationship.comment }}
|
8
|
+
{%- endif %}
|
6
9
|
const val {{ relationship.name | snake_case | upcase }}: String = "{{ relationship.name }}"
|
7
10
|
{%- endif -%}
|
8
11
|
{%- endfor %}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
alias:
|
2
|
+
# The template named 'android-java' was originally just named `android`
|
3
|
+
# and was written in Java before Kotlin even existed.
|
4
|
+
#
|
5
|
+
# So this alias exists mainly for compatibility reasons, so that people
|
6
|
+
# who used `-t android` in previous versions of `gyro` can still continue
|
7
|
+
# to do so and that this new update of gyro doesn't break their setup.
|
8
|
+
android: android-java
|
9
|
+
# The template named 'anviking-decodable' was originally just named 'decodable'
|
10
|
+
# as it was made to generate JSON parsing code using the Anviking/Decodable pod.
|
11
|
+
#
|
12
|
+
# But now that Swift 4 has protocol Decodable, this template name is confusing,
|
13
|
+
# so we decided to rename it anviking-decodable and deprecate the old name,
|
14
|
+
# so that when we have time to create a template for Swift 4's Codable there
|
15
|
+
# won't be any risk of confusion.
|
16
|
+
decodable: anviking-decodable
|
17
|
+
# It happens that the `swift3` template is also compatible with Swift 4 without any change.
|
18
|
+
# So we can use the same template for both Swift 3 and Swift 4
|
19
|
+
swift4: swift3
|
20
|
+
deprecated:
|
21
|
+
- object-mapper
|
22
|
+
- swift3-variant
|
23
|
+
- android # renamed android-java
|
24
|
+
- decodable # renamed anviking-decodable
|
25
|
+
|
@@ -10,9 +10,11 @@
|
|
10
10
|
|
11
11
|
When you need to work with `ObjectMapper` and `Realm` together
|
12
12
|
|
13
|
-
#
|
13
|
+
# Description
|
14
14
|
|
15
|
-
In this template optional Realm objects (Attributes - RealmOptional - or Relationships - List<> -) are var properties
|
15
|
+
In this template optional Realm objects (Attributes - RealmOptional - or Relationships - List<> -) are var properties.
|
16
|
+
|
17
|
+
This is not recommanded by Realm, and not conform to the Realm documentation (and can lead to bad behaviors with Realm if you happen to affect a new `List` or `RealmOptional` instance to those properties) but sadly this is required to work with the deprecated `ObjectMapper` template.
|
16
18
|
|
17
19
|
```
|
18
20
|
// Attribute generation
|
@@ -32,8 +34,6 @@ In this template optional Realm objects (Attributes - RealmOptional - or Relatio
|
|
32
34
|
{%- endif %}
|
33
35
|
```
|
34
36
|
|
35
|
-
This is not recommanded by Realm, and not conform to the Realm documentation (and can lead to bad behaviors with Realm if you happen to affect a new `List` or `RealmOptional` instance to those properties) but sadly this is required to work with the deprecated `ObjectMapper` template.
|
36
|
-
|
37
37
|
# Generated Code
|
38
38
|
|
39
39
|
`Product.swift`
|
@@ -60,4 +60,4 @@ final class Product: Object {
|
|
60
60
|
var users = List<Users>()
|
61
61
|
}
|
62
62
|
|
63
|
-
```
|
63
|
+
```
|
@@ -4,7 +4,7 @@
|
|
4
4
|
{%- for attribute in entity.attributes -%}
|
5
5
|
{%- if attribute.realm_ignored or attribute.realm_read_only.size == 0 -%}
|
6
6
|
{%- if attribute.comment.size > 0 %}
|
7
|
-
|
7
|
+
/// {{ attribute.comment }}
|
8
8
|
{%- endif %}
|
9
9
|
case {{ attribute.name }} = "{{ attribute.name | escape_quotes }}"
|
10
10
|
{%- endif %}
|
@@ -11,6 +11,9 @@
|
|
11
11
|
{%- endif -%}
|
12
12
|
{%- endcapture -%}
|
13
13
|
{%- assign relationship_name = relationship_name %}
|
14
|
+
{%- if relationship.comment.size > 0 %}
|
15
|
+
/// {{ relationship.comment }}
|
16
|
+
{%- endif %}
|
14
17
|
case {{ relationship_name | uncapitalize }} = "{{ relationship_name | escape_quotes }}"
|
15
18
|
{%- endfor %}
|
16
19
|
}
|
@@ -11,9 +11,17 @@
|
|
11
11
|
This template is the reference for swift 3 with Realm generation code. This template is compatible with swift 4.
|
12
12
|
You can use it when you need to work with `Realm`
|
13
13
|
|
14
|
-
#
|
14
|
+
# Customization
|
15
15
|
|
16
|
-
|
16
|
+
You can use the following parameters to inject custom values to this template (using `--param KEY:VALUE` on the command line):
|
17
|
+
|
18
|
+
| Parameter Key | Description |
|
19
|
+
|---------------|-------------|
|
20
|
+
| `public` | If set to true, every generated model and properties will be declared `public`. Otherwise it will not be annotated with access scope keyword, so will default to `internal` |
|
21
|
+
|
22
|
+
# Description
|
23
|
+
|
24
|
+
In this template, optional Realm objects (Attributes - RealmOptional - or Relationships - List<> -) are `let` properties (which is conform to the Realm documentation). This is the template to use when you use RealmSwift.
|
17
25
|
|
18
26
|
```
|
19
27
|
// Attribute generation
|
@@ -3,7 +3,7 @@
|
|
3
3
|
import RealmSwift
|
4
4
|
import Foundation
|
5
5
|
|
6
|
-
final class {{ entity.name }}: Object {
|
6
|
+
{% if params.public %}public {% endif %}final class {{ entity.name }}: Object {
|
7
7
|
{%- include 'inc/attributes_enum' -%}
|
8
8
|
{% include 'inc/relationships_enum' -%}
|
9
9
|
{% include 'inc/attributes_properties' %}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{%- if attribute.enum_type.size > 0 -%}
|
2
2
|
/* DO NOT EDIT | Generated by gyro */
|
3
3
|
|
4
|
-
enum {{ params.prefix }}{{ attribute.enum_type }}: String {
|
4
|
+
{% if params.public %}public {% endif %}enum {{ params.prefix }}{{ attribute.enum_type }}: String {
|
5
5
|
{%- for value in attribute.enum_values %}
|
6
6
|
{%- if attribute.enum_values.size > 0 %}
|
7
7
|
{% assign jsonKey = value -%}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
{% if entity.attributes.size > 0 %}
|
3
|
-
enum Attributes: String {
|
3
|
+
{% if params.public %}public {% endif %}enum Attributes: String {
|
4
4
|
{%- for attribute in entity.attributes -%}
|
5
5
|
{%- if attribute.realm_ignored or attribute.realm_read_only.size == 0 -%}
|
6
6
|
{%- if attribute.comment.size > 0 %}
|
@@ -18,7 +18,7 @@
|
|
18
18
|
{%- include 'inc/optional_attribute_property' -%}
|
19
19
|
{%- else -%}
|
20
20
|
{%- comment -%} ******* GENERATE DEFAULT ATTRIBUTE PROPERTY ******* {% endcomment %}
|
21
|
-
@objc dynamic var {{ attribute.name }}: {{ convert_type }} = {{ default_value }} {%- if attribute.name == entity.identity_attribute %} /* Primary Key */{% endif -%}
|
21
|
+
@objc {% if params.public %}public {% endif %}dynamic var {{ attribute.name }}: {{ convert_type }} = {{ default_value }} {%- if attribute.name == entity.identity_attribute %} /* Primary Key */{% endif -%}
|
22
22
|
{%- endif -%}{%- endif -%}
|
23
23
|
{%- endif -%}
|
24
24
|
{%- endfor -%}
|
@@ -1,13 +1,13 @@
|
|
1
1
|
{%- if attribute.optional == true %}
|
2
2
|
|
3
|
-
@objc dynamic var {{ attribute.name }}: String?
|
3
|
+
@objc {% if params.public %}public {% endif %}dynamic var {{ attribute.name }}: String?
|
4
4
|
{%- else %}
|
5
5
|
|
6
|
-
@objc dynamic var {{ attribute.name }}: String = ""
|
6
|
+
@objc {% if params.public %}public {% endif %}dynamic var {{ attribute.name }}: String = ""
|
7
7
|
{%- endif %}
|
8
8
|
{%- assign enum_type = attribute.enum_type %}
|
9
9
|
{%- assign enum_name = attribute.name %}
|
10
|
-
var {{ enum_name }}Enum: {{ enum_type | delete_objc_prefix }}? {
|
10
|
+
{% if params.public %}public {% endif %}var {{ enum_name }}Enum: {{ enum_type | delete_objc_prefix }}? {
|
11
11
|
get {
|
12
12
|
{%- if attribute.optional == true %}
|
13
13
|
guard let {{ attribute.name }} = {{ attribute.name }},
|
@@ -1,6 +1,6 @@
|
|
1
1
|
{%- if entity.has_ignored == true %}
|
2
2
|
// Specify properties to ignore (Realm won't persist these)
|
3
|
-
override static func ignoredProperties() -> [String] {
|
3
|
+
override {% if params.public %}public {% endif %}static func ignoredProperties() -> [String] {
|
4
4
|
return [
|
5
5
|
{%- capture enum_ignored_properties -%}
|
6
6
|
{%- for attribute in entity.attributes -%}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
{%- if entity.has_indexed_attributes == true %}
|
2
2
|
// Specify properties to index
|
3
|
-
override static func indexedProperties() -> [String] {
|
3
|
+
override {% if params.public %}public {% endif %}static func indexedProperties() -> [String] {
|
4
4
|
return [
|
5
5
|
{%- capture enum_indexed_properties -%}
|
6
6
|
{%- for attribute in entity.attributes -%}
|
@@ -2,10 +2,10 @@
|
|
2
2
|
{%- if relationship.inverse == true %}
|
3
3
|
{% assign name_size = relationship.name | size | minus: 1 %}
|
4
4
|
{%- if relationship.type == "to_many" %}
|
5
|
-
let {{ relationship.name | truncate: name_size, '' }}s = LinkingObjects(fromType: {{ relationship.inverse_type }}.self, property: "{{ relationship.inverse_name }}")
|
5
|
+
{% if params.public %}public {% endif %}let {{ relationship.name | truncate: name_size, '' }}s = LinkingObjects(fromType: {{ relationship.inverse_type }}.self, property: "{{ relationship.inverse_name }}")
|
6
6
|
{%- else %}
|
7
|
-
let {{ relationship.name | truncate: name_size, '' }}s = LinkingObjects(fromType: {{ relationship.inverse_type }}.self, property: "{{ relationship.inverse_name }}")
|
8
|
-
var {{ relationship.name | truncate: name_size, '' }}: {{ relationship.inverse_type }}? { return {{ relationship.name | truncate: name_size, '' }}s.first }
|
7
|
+
{% if params.public %}public {% endif %}let {{ relationship.name | truncate: name_size, '' }}s = LinkingObjects(fromType: {{ relationship.inverse_type }}.self, property: "{{ relationship.inverse_name }}")
|
8
|
+
{% if params.public %}public {% endif %}var {{ relationship.name | truncate: name_size, '' }}: {{ relationship.inverse_type }}? { return {{ relationship.name | truncate: name_size, '' }}s.first }
|
9
9
|
{%- endif -%}
|
10
10
|
{%- endif -%}
|
11
11
|
{%- endfor -%}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
{%- if attribute.is_number == true or attribute.is_bool == true %}
|
2
|
-
let {{ attribute.name }} = RealmOptional<{{ convert_type }}>(){%- if attribute.name == entity.identity_attribute %} /* Primary Key */{% endif -%}
|
2
|
+
{% if params.public %}public {% endif %}let {{ attribute.name }} = RealmOptional<{{ convert_type }}>(){%- if attribute.name == entity.identity_attribute %} /* Primary Key */{% endif -%}
|
3
3
|
{%- else %}
|
4
|
-
@objc dynamic var {{ attribute.name }}: {{ convert_type }}?{%- if attribute.name == entity.identity_attribute %} /* Primary Key */{% endif -%}
|
4
|
+
@objc {% if params.public %}public {% endif %}dynamic var {{ attribute.name }}: {{ convert_type }}?{%- if attribute.name == entity.identity_attribute %} /* Primary Key */{% endif -%}
|
5
5
|
{%- endif -%}
|
@@ -1,9 +1,9 @@
|
|
1
1
|
{%- for relationship in entity.relationships -%}
|
2
2
|
{%- if relationship.inverse == false %}
|
3
3
|
{%- if relationship.type == "to_many" %}
|
4
|
-
let {{ relationship.name }} = List<{{ relationship.inverse_type }}>()
|
4
|
+
{% if params.public %}public {% endif %}let {{ relationship.name }} = List<{{ relationship.inverse_type }}>()
|
5
5
|
{%- else %}
|
6
|
-
@objc dynamic var {{ relationship.name }}: {{ relationship.inverse_type }}?
|
6
|
+
@objc {% if params.public %}public {% endif %}dynamic var {{ relationship.name }}: {{ relationship.inverse_type }}?
|
7
7
|
{%- endif %}
|
8
8
|
{%- endif %}
|
9
9
|
{%- endfor -%}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
{%- if entity.relationships.size > 0 and entity.has_only_inverse == false %}
|
2
|
-
enum Relationships: String {
|
2
|
+
{% if params.public %}public {% endif %}enum Relationships: String {
|
3
3
|
{%- for relationship in entity.relationships %}
|
4
4
|
{%- capture relationship_name -%}
|
5
5
|
{%- if relationship.inverse == true -%}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gyro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NijiDigital
|
@@ -109,12 +109,12 @@ files:
|
|
109
109
|
- lib/templates/android-kotlin/inc/_type_converter.liquid
|
110
110
|
- lib/templates/android-kotlin/inc/_type_defaults.liquid
|
111
111
|
- lib/templates/android-kotlin/inc/_type_primitives.liquid
|
112
|
-
- lib/templates/
|
113
|
-
- lib/templates/decodable/
|
114
|
-
- lib/templates/decodable/
|
115
|
-
- lib/templates/decodable/
|
116
|
-
- lib/templates/decodable/
|
117
|
-
- lib/templates/
|
112
|
+
- lib/templates/anviking-decodable/README.md
|
113
|
+
- lib/templates/anviking-decodable/entity.liquid
|
114
|
+
- lib/templates/anviking-decodable/entity_filename.liquid
|
115
|
+
- lib/templates/anviking-decodable/enum.liquid
|
116
|
+
- lib/templates/anviking-decodable/enum_filename.liquid
|
117
|
+
- lib/templates/config.yml
|
118
118
|
- lib/templates/object-mapper/README.md
|
119
119
|
- lib/templates/object-mapper/entity.liquid
|
120
120
|
- lib/templates/object-mapper/entity_filename.liquid
|
@@ -154,7 +154,6 @@ files:
|
|
154
154
|
- lib/templates/swift3/inc/_relationship_properties.liquid
|
155
155
|
- lib/templates/swift3/inc/_relationships_enum.liquid
|
156
156
|
- lib/templates/swift3/inc/_type_converter.liquid
|
157
|
-
- lib/templates/swift4.alias
|
158
157
|
homepage: https://github.com/NijiDigital/gyro
|
159
158
|
licenses:
|
160
159
|
- Apache-2.0
|
data/lib/templates/android.alias
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
android-java
|
2
|
-
|
3
|
-
=== Note ===
|
4
|
-
|
5
|
-
The template named 'android-java' was originally just named `android`
|
6
|
-
and was written in Java before Kotlin even existed.
|
7
|
-
|
8
|
-
So this alias exists mainly for compatibility reasons, so that people
|
9
|
-
who used `-t android` in previous versions of `gyro` can still continue
|
10
|
-
to do so and that this new update of gyro doesn't break their setup.
|