gyro 1.4.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|