metamodel 0.1.7 → 0.1.8
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/lib/metamodel/command/build.rb +4 -2
- data/lib/metamodel/record/association.rb +8 -0
- data/lib/metamodel/record/model.rb +13 -8
- data/lib/metamodel/template/foreign_key.swift +5 -5
- data/lib/metamodel/template/helper.swift +1 -1
- data/lib/metamodel/template/metamodel.swift +0 -54
- data/lib/metamodel/template/model_delete.swift +7 -5
- data/lib/metamodel/template/model_initialize.swift +1 -1
- data/lib/metamodel/template/model_query.swift +15 -19
- data/lib/metamodel/template/model_update.swift +25 -8
- data/lib/metamodel/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 150f0889587f6a3379d1dd291465dc4aea20c5c0
|
4
|
+
data.tar.gz: 616832c86c039688d8c06fdcc59076aa8745704f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6a3cd5f7a04e4284887c52574cb50a7622f6aece76de076881176c1a803dffd785e5d9778d8d94aa7de6e4fcb2c0f038ad8acafa897e2be9adba9648b7b341e
|
7
|
+
data.tar.gz: 8b2e17fc792955ce237d907e71024a1637fa70d414716c49ffe98419b10f7efa44bf3e0a8634edfe3fe0caa30e95476ce649de3df52f4769b0f9c7cfe4b112c9
|
@@ -82,14 +82,16 @@ module MetaModel
|
|
82
82
|
BITCODE_GENERATION_MODE=bitcode \
|
83
83
|
ONLY_ACTIVE_ARCH=NO \
|
84
84
|
CODE_SIGNING_REQUIRED=NO \
|
85
|
-
CODE_SIGN_IDENTITY=
|
85
|
+
CODE_SIGN_IDENTITY= \
|
86
|
+
clean build"
|
86
87
|
build_iphonesimulator = "xcodebuild -scheme MetaModel \
|
87
88
|
-project MetaModel/MetaModel.xcodeproj \
|
88
89
|
-configuration Release -sdk iphonesimulator \
|
89
90
|
-derivedDataPath './metamodel' \
|
90
91
|
ONLY_ACTIVE_ARCH=NO \
|
91
92
|
CODE_SIGNING_REQUIRED=NO \
|
92
|
-
CODE_SIGN_IDENTITY=
|
93
|
+
CODE_SIGN_IDENTITY= \
|
94
|
+
clean build"
|
93
95
|
result = system "#{build_iphoneos} > /dev/null &&
|
94
96
|
#{build_iphonesimulator} > /dev/null"
|
95
97
|
|
@@ -37,6 +37,14 @@ module MetaModel
|
|
37
37
|
result
|
38
38
|
end
|
39
39
|
|
40
|
+
def secondary_model_instance
|
41
|
+
case relation
|
42
|
+
when :has_many, :has_one then "#{secondary_model.name}.findBy(#{major_model.foreign_id}: id)"
|
43
|
+
when :belongs_to then "#{secondary_model.name}.findBy(id: #{secondary_model.foreign_id})"
|
44
|
+
else ""
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
40
48
|
#-------------------------------------------------------------------------#
|
41
49
|
|
42
50
|
# @!group Validation
|
@@ -13,6 +13,10 @@ module MetaModel
|
|
13
13
|
validate
|
14
14
|
end
|
15
15
|
|
16
|
+
def contains?(property)
|
17
|
+
@properties.select { |prop| prop.name == property }.size > 0
|
18
|
+
end
|
19
|
+
|
16
20
|
def properties_exclude_id
|
17
21
|
@properties.select { |property| property.name != "id" }
|
18
22
|
end
|
@@ -57,16 +61,16 @@ module MetaModel
|
|
57
61
|
key_value_pairs_with_property properties_exclude_id, cast
|
58
62
|
end
|
59
63
|
|
60
|
-
def property_key_type_pairs
|
61
|
-
key_type_pairs_with_property @properties
|
64
|
+
def property_key_type_pairs(remove_extra_param = true, use_default_value = false)
|
65
|
+
key_type_pairs_with_property @properties, remove_extra_param, use_default_value
|
62
66
|
end
|
63
67
|
|
64
|
-
def
|
65
|
-
key_type_pairs_with_property
|
68
|
+
def property_exclude_id_key_type_pairs(remove_extra_param = true, use_default_value = false)
|
69
|
+
key_type_pairs_with_property properties_exclude_id, remove_extra_param, use_default_value
|
66
70
|
end
|
67
71
|
|
68
|
-
def
|
69
|
-
key_type_pairs_with_property
|
72
|
+
def property_key_type_pairs_without_property(property)
|
73
|
+
key_type_pairs_with_property @properties.select { |element| element.name != property }
|
70
74
|
end
|
71
75
|
|
72
76
|
def build_table
|
@@ -99,13 +103,14 @@ module MetaModel
|
|
99
103
|
end.join(", ")
|
100
104
|
end
|
101
105
|
|
102
|
-
def key_type_pairs_with_property(properties)
|
106
|
+
def key_type_pairs_with_property(properties, remove_extra_param = true, use_default_value = false)
|
103
107
|
properties.enum_for(:each_with_index).map do |property, index|
|
104
108
|
has_default_value = property.has_default_value?
|
105
109
|
default_value = property.type_without_optional == "String" ? "\"#{property.default_value}\"" : property.default_value
|
106
110
|
|
107
111
|
result = "#{property.name}: #{property.type.to_s}#{if has_default_value then " = " + "#{default_value}" end}"
|
108
|
-
|
112
|
+
result = "#{property.name}: #{property.type.to_s} = #{property.type_without_optional}DefaultValue" if use_default_value
|
113
|
+
if index == 0 && remove_extra_param
|
109
114
|
"#{property.name} #{result}"
|
110
115
|
else
|
111
116
|
result
|
@@ -11,11 +11,11 @@
|
|
11
11
|
}
|
12
12
|
|
13
13
|
func delete#{association.type}(id: Int) {
|
14
|
-
#{association.type}.
|
14
|
+
#{association.type}.findBy(#{model.foreign_id}: id).first?.delete
|
15
15
|
}
|
16
16
|
var #{association.name}: [#{association.type}] {
|
17
17
|
get {
|
18
|
-
return #{association.type}.filter(
|
18
|
+
return #{association.type}.filter(id: id).result
|
19
19
|
}
|
20
20
|
set {
|
21
21
|
#{association.name}.forEach { (element) in
|
@@ -32,7 +32,7 @@
|
|
32
32
|
<%= """public extension #{model.name} {
|
33
33
|
var #{association.name}: #{association.type}? {
|
34
34
|
get {
|
35
|
-
return #{association.
|
35
|
+
return #{association.secondary_model_instance}.first
|
36
36
|
}
|
37
37
|
set {
|
38
38
|
guard let newValue = newValue else { return }
|
@@ -44,10 +44,10 @@
|
|
44
44
|
<%= """public extension #{model.name} {
|
45
45
|
var #{association.name}: #{association.type}? {
|
46
46
|
get {
|
47
|
-
return #{association.
|
47
|
+
return #{association.secondary_model_instance}.first
|
48
48
|
}
|
49
49
|
set {
|
50
|
-
#{association.type}.
|
50
|
+
#{association.type}.findBy(#{model.foreign_id}: id).deleteAll
|
51
51
|
guard var newValue = newValue else { return }
|
52
52
|
newValue.update(#{model.foreign_id}: id)
|
53
53
|
}
|
@@ -29,57 +29,3 @@ public class MetaModel {
|
|
29
29
|
<% end %>
|
30
30
|
}
|
31
31
|
}
|
32
|
-
|
33
|
-
func executeSQL(sql: String, verbose: Bool = false, suppress: Bool = false, success: (() -> ())? = nil) -> Statement? {
|
34
|
-
if verbose {
|
35
|
-
print("-> Begin Transaction")
|
36
|
-
}
|
37
|
-
let startDate = NSDate()
|
38
|
-
do {
|
39
|
-
let result = try db.run(sql)
|
40
|
-
let endDate = NSDate()
|
41
|
-
let interval = endDate.timeIntervalSinceDate(startDate) * 1000
|
42
|
-
|
43
|
-
if verbose {
|
44
|
-
print("\tSQL (\(interval.format("0.2"))ms) \(sql)")
|
45
|
-
print("-> Commit Transaction")
|
46
|
-
print("\n")
|
47
|
-
}
|
48
|
-
if let success = success {
|
49
|
-
success()
|
50
|
-
}
|
51
|
-
|
52
|
-
return result
|
53
|
-
} catch let error {
|
54
|
-
let endDate = NSDate()
|
55
|
-
let interval = endDate.timeIntervalSinceDate(startDate) * 1000
|
56
|
-
print("\tSQL (\(interval.format("0.2"))ms) \(sql)")
|
57
|
-
print("\t\(error)")
|
58
|
-
if verbose {
|
59
|
-
print("-> Rollback transaction")
|
60
|
-
print("\n")
|
61
|
-
}
|
62
|
-
}
|
63
|
-
return nil
|
64
|
-
}
|
65
|
-
|
66
|
-
func executeScalarSQL(sql: String, verbose: Bool = false, suppress: Bool = false, success: (() -> ())? = nil) -> Binding? {
|
67
|
-
if verbose {
|
68
|
-
print("-> Begin Transaction")
|
69
|
-
}
|
70
|
-
let startDate = NSDate()
|
71
|
-
let result = db.scalar(sql)
|
72
|
-
let endDate = NSDate()
|
73
|
-
let interval = endDate.timeIntervalSinceDate(startDate) * 1000
|
74
|
-
if verbose {
|
75
|
-
print("\tSQL (\(interval.format("0.2"))ms) \(sql)")
|
76
|
-
print("-> Commit Transaction")
|
77
|
-
print("\n")
|
78
|
-
}
|
79
|
-
|
80
|
-
if let success = success {
|
81
|
-
success()
|
82
|
-
}
|
83
|
-
|
84
|
-
return result
|
85
|
-
}
|
@@ -4,17 +4,19 @@ public extension <%= model.name %> {
|
|
4
4
|
var delete: Bool {
|
5
5
|
get {
|
6
6
|
let deleteSQL = "DELETE FROM \(<%= model.name %>.tableName.unwrapped) \(itself)"
|
7
|
-
executeSQL(deleteSQL)
|
7
|
+
executeSQL(deleteSQL)<% model.associations.each do |association| %>
|
8
|
+
<%= association.secondary_model_instance + ".delete" if association.dependent == :destroy %>
|
9
|
+
<%= association.secondary_model_instance + ".update(#{model.foreign_id}: 0)" if association.dependent == :nullify && model.contains?(model.foreign_id) %>
|
10
|
+
<% end %>
|
8
11
|
return true
|
9
12
|
}
|
10
13
|
}
|
11
|
-
static
|
12
|
-
let deleteAllSQL = "DELETE FROM \(tableName.unwrapped)"
|
13
|
-
executeSQL(deleteAllSQL)
|
14
|
-
}
|
14
|
+
static var deleteAll: Bool { get { return <%= model.relation_name %>().deleteAll } }
|
15
15
|
}
|
16
16
|
|
17
17
|
public extension <%= model.relation_name %> {
|
18
|
+
var delete: Bool { get { return deleteAll } }
|
19
|
+
|
18
20
|
var deleteAll: Bool {
|
19
21
|
get {
|
20
22
|
self.result.forEach { $0.delete }
|
@@ -9,7 +9,7 @@ public struct <%= model.name %> {
|
|
9
9
|
var unwrapped: String { get { return self.rawValue.unwrapped } }
|
10
10
|
}
|
11
11
|
|
12
|
-
public init(<%= model.property_key_type_pairs %>) {
|
12
|
+
public init(<%= model.property_key_type_pairs false %>) {
|
13
13
|
<% model.properties.each do |property| %><%= """self.#{property.name} = #{property.name}" %>
|
14
14
|
<% end %>
|
15
15
|
}
|
@@ -29,20 +29,14 @@ public extension <%= model.name %> {
|
|
29
29
|
return <%= model.relation_name %>().find(id).first
|
30
30
|
}
|
31
31
|
|
32
|
-
static func findBy(
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
static func findBy(#{property.name} #{property.name}: #{property.type_without_optional}) -\> #{model.name}? {
|
37
|
-
return #{model.relation_name}().findBy(#{property.name}: #{property.name}).first
|
38
|
-
}
|
39
|
-
""" %><% end %>
|
40
|
-
static func filter(column: <%= model.name %>.Column, value: Any) -> <%= model.relation_name %> {
|
41
|
-
return <%= model.relation_name %>().filter([column: value])
|
32
|
+
static func findBy(<%= model.property_key_type_pairs(true, true) %>) -> <%= model.relation_name %> {
|
33
|
+
var attributes: [<%= model.name %>.Column: Any] = [:]
|
34
|
+
<% model.properties.each do |property| %><%= "if (#{property.name} != #{property.type_without_optional}DefaultValue) { attributes[.#{property.name}] = #{property.name} }" %>
|
35
|
+
<% end %>return <%= model.relation_name %>().filter(attributes)
|
42
36
|
}
|
43
37
|
|
44
|
-
static func filter(
|
45
|
-
return <%= model.
|
38
|
+
static func filter(<%= model.property_key_type_pairs(true, true) %>) -> <%= model.relation_name %> {
|
39
|
+
return findBy(<%= model.property_key_value_pairs %>)
|
46
40
|
}
|
47
41
|
|
48
42
|
static func limit(length: UInt, offset: UInt = 0) -> <%= model.relation_name %> {
|
@@ -76,17 +70,19 @@ public extension <%= model.name %> {
|
|
76
70
|
|
77
71
|
public extension <%= model.relation_name %> {
|
78
72
|
func find(id: Int) -> Self {
|
79
|
-
return
|
73
|
+
return findBy(id: id)
|
74
|
+
}
|
75
|
+
|
76
|
+
func findBy(<%= model.property_key_type_pairs(true, true) %>) -> Self {
|
77
|
+
var attributes: [<%= model.name %>.Column: Any] = [:]
|
78
|
+
<% model.properties.each do |property| %><%= "if (#{property.name} != #{property.type_without_optional}DefaultValue) { attributes[.#{property.name}] = #{property.name} }" %>
|
79
|
+
<% end %>return self.filter(attributes)
|
80
80
|
}
|
81
81
|
|
82
|
-
func
|
83
|
-
return
|
82
|
+
func filter(<%= model.property_key_type_pairs(true, true) %>) -> Self {
|
83
|
+
return findBy(<%= model.property_key_value_pairs %>)
|
84
84
|
}
|
85
85
|
|
86
|
-
<% model.properties_exclude_id.each do |property| %><%= """func findBy(#{property.name} #{property.name}: #{property.type_without_optional}) -\> Self {
|
87
|
-
return self.filter([.#{property.name}: #{property.name}])
|
88
|
-
}""" %>
|
89
|
-
<% end %>
|
90
86
|
func filter(conditions: [<%= model.name %>.Column: Any]) -> Self {
|
91
87
|
for (column, value) in conditions {
|
92
88
|
let columnSQL = "\(expandColumn(column))"
|
@@ -1,11 +1,14 @@
|
|
1
1
|
// MARK: - Update
|
2
2
|
|
3
3
|
public extension <%= model.name %> {
|
4
|
-
|
5
|
-
|
4
|
+
mutating func update(<%= model.property_exclude_id_key_type_pairs(true, true) %>) {
|
5
|
+
var attributes: [<%= model.name %>.Column: Any] = [:]
|
6
|
+
<% model.properties_exclude_id.each do |property| %><%= "if (#{property.name} != #{property.type_without_optional}DefaultValue) { attributes[.#{property.name}] = #{property.name} }" %>
|
7
|
+
<% end %>
|
8
|
+
self.update(attributes)
|
6
9
|
}
|
7
|
-
|
8
|
-
mutating func update(attributes: [<%= model.name %>.Column: Any])
|
10
|
+
|
11
|
+
mutating func update(attributes: [<%= model.name %>.Column: Any]) {
|
9
12
|
var setSQL: [String] = []
|
10
13
|
if let attributes = attributes as? [<%= model.name %>.Column: Unwrapped] {
|
11
14
|
for (key, value) in attributes {
|
@@ -24,8 +27,8 @@ public extension <%= model.name %> {
|
|
24
27
|
}
|
25
28
|
}
|
26
29
|
}
|
27
|
-
return self
|
28
30
|
}
|
31
|
+
|
29
32
|
var save: <%= model.name %> {
|
30
33
|
mutating get {
|
31
34
|
if let _ = <%= model.name %>.find(id) {
|
@@ -36,13 +39,27 @@ public extension <%= model.name %> {
|
|
36
39
|
return self
|
37
40
|
}
|
38
41
|
}
|
42
|
+
|
43
|
+
var commit: <%= model.name %> {
|
44
|
+
mutating get {
|
45
|
+
return save
|
46
|
+
}
|
47
|
+
}
|
39
48
|
}
|
40
49
|
|
41
50
|
public extension <%= model.relation_name %> {
|
42
|
-
public func updateAll(
|
43
|
-
|
51
|
+
public func updateAll(<%= model.property_exclude_id_key_type_pairs(true, true) %>) -> Self {
|
52
|
+
return update(<%= model.property_exclude_id_key_value_pairs %>)
|
53
|
+
}
|
54
|
+
|
55
|
+
public func update(<%= model.property_exclude_id_key_type_pairs(true, true) %>) -> Self {
|
56
|
+
var attributes: [<%= model.name %>.Column: Any] = [:]
|
57
|
+
<% model.properties_exclude_id.each do |property| %><%= "if (#{property.name} != #{property.type_without_optional}DefaultValue) { attributes[.#{property.name}] = #{property.name} }" %>
|
58
|
+
<% end %>
|
59
|
+
result.forEach { (element) in
|
44
60
|
var element = element
|
45
|
-
element.update(
|
61
|
+
element.update(attributes)
|
46
62
|
}
|
63
|
+
return self
|
47
64
|
}
|
48
65
|
}
|
data/lib/metamodel/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metamodel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Draveness Zuo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: claide
|