metamodel 0.1.1 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +24 -19
- data/lib/metamodel/command/build/parser.rb +10 -11
- data/lib/metamodel/command/build.rb +23 -12
- data/lib/metamodel/command/clean.rb +1 -0
- data/lib/metamodel/command/generate.rb +10 -10
- data/lib/metamodel/command/init.rb +7 -4
- data/lib/metamodel/command.rb +13 -2
- data/lib/metamodel/config.rb +11 -11
- data/lib/metamodel/model/model.rb +40 -28
- data/lib/metamodel/model/property.rb +32 -17
- data/lib/metamodel/template/foreign_key.swift +4 -4
- data/lib/metamodel/template/instance_methods.swift +1 -1
- data/lib/metamodel/template/metamodel.swift +5 -6
- data/lib/metamodel/template/recordable.swift +1 -1
- data/lib/metamodel/template/static_methods.swift +8 -5
- data/lib/metamodel/version.rb +1 -1
- data/lib/metamodel.rb +2 -1
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36ad33602070abacabd6daa90047708d6888e35b
|
4
|
+
data.tar.gz: bfbdbeeab3881c3e592b62c1084dc505f7e68d7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d464c4eac3190573387c23fb4f2ddd28bb632fbd17833bf618e23bdd64b7c0247f8039020d46d11b87801d269d5321e486b6eae952923955b55fb3bc64404ab
|
7
|
+
data.tar.gz: e8a655ea0d4e244f3239a3b1c94ce8dd5b1b6391ab45af7483cbad83313b395b8e8e906800070c439bc7280bf6206f9e9780284d8310d8222fd449ee9f515b81
|
data/README.md
CHANGED
@@ -34,14 +34,22 @@ print(Person.all)
|
|
34
34
|
|
35
35
|
## Usage
|
36
36
|
|
37
|
-
Use
|
37
|
+
Use Metafile in project folder to define your model:
|
38
38
|
|
39
39
|
```ruby
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
attr :
|
44
|
-
attr :
|
40
|
+
metamodel_version '0.1.0'
|
41
|
+
|
42
|
+
define :Article do
|
43
|
+
attr :title
|
44
|
+
attr :content
|
45
|
+
|
46
|
+
has_many :comments
|
47
|
+
end
|
48
|
+
|
49
|
+
define :Comment do
|
50
|
+
attr :content
|
51
|
+
|
52
|
+
belongs_to :article
|
45
53
|
end
|
46
54
|
```
|
47
55
|
|
@@ -53,8 +61,6 @@ And then run `meta build` will automatically generate all the code you need.
|
|
53
61
|
sudo gem install metamodel --verbose
|
54
62
|
```
|
55
63
|
|
56
|
-
**System Requirements**: Current version of MetaModel requires macOS with Ruby 2.2.2 or above
|
57
|
-
|
58
64
|
## Quick Start
|
59
65
|
|
60
66
|
After installation , run `meta init` in your iOS project root folder which will make a `meta` directory in current folder.
|
@@ -65,21 +71,21 @@ $ meta init
|
|
65
71
|
|
66
72
|
Initialing MetaModel project
|
67
73
|
|
68
|
-
Creating `
|
74
|
+
Creating `Metafile` for MetaModel
|
69
75
|
```
|
70
76
|
|
71
77
|
Generate your model meta file with `meta generate`.
|
72
78
|
|
73
79
|
```shell
|
74
|
-
$ meta generate
|
80
|
+
$ meta generate Article
|
75
81
|
|
76
82
|
Generating model meta file
|
77
83
|
|
78
|
-
-> Adding `
|
84
|
+
-> Adding `Article` model to Metafile
|
79
85
|
|
80
|
-
[!] `
|
86
|
+
[!] Adding `Article` model scaffold to Metafile, use the command below to edit it.
|
81
87
|
|
82
|
-
vim
|
88
|
+
vim Metafile
|
83
89
|
```
|
84
90
|
|
85
91
|
Edit meta file using vim, Emacs or other editor and run `meta build`.
|
@@ -90,14 +96,13 @@ $ meta build
|
|
90
96
|
Building MetaModel.framework in project
|
91
97
|
Existing project `./metamodel/MetaModel.xcodeproj`
|
92
98
|
|
93
|
-
Analyzing
|
94
|
-
-> Resolving `
|
99
|
+
Analyzing Metafile
|
100
|
+
-> Resolving `Article`
|
101
|
+
-> Resolving `Comment`
|
95
102
|
|
96
103
|
Generating model files
|
97
|
-
-> Using
|
98
|
-
|
99
|
-
Generating MetaModel.framework
|
100
|
-
-> MetaModel.framework located in current folder
|
104
|
+
-> Using Article.swift file
|
105
|
+
-> Using Comment.swift file
|
101
106
|
|
102
107
|
[!] Please drag MetaModel.framework into Embedded Binaries phrase.
|
103
108
|
```
|
@@ -14,14 +14,9 @@ module MetaModel
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def parse
|
17
|
-
UI.section "Analyzing
|
18
|
-
|
19
|
-
|
20
|
-
metas.each do |meta_file|
|
21
|
-
UI.message '-> '.green + "Resolving `#{File.basename(meta_file)}`"
|
22
|
-
meta_code = File.read(meta_path + meta_file)
|
23
|
-
eval meta_code
|
24
|
-
end
|
17
|
+
UI.section "Analyzing Metafile" do
|
18
|
+
metafile_path = config.metafile_path
|
19
|
+
eval File.read(metafile_path)
|
25
20
|
end
|
26
21
|
@models
|
27
22
|
end
|
@@ -34,6 +29,7 @@ module MetaModel
|
|
34
29
|
end
|
35
30
|
|
36
31
|
def define(model_name)
|
32
|
+
UI.message '-> '.green + "Resolving `#{model_name.to_s.camelize}`"
|
37
33
|
@models << Model.new(model_name)
|
38
34
|
yield
|
39
35
|
end
|
@@ -42,17 +38,20 @@ module MetaModel
|
|
42
38
|
current_model.properties << Property.new(key, type, args)
|
43
39
|
end
|
44
40
|
|
45
|
-
def has_one(name, model)
|
41
|
+
def has_one(name, model = nil)
|
42
|
+
model = name.to_s.singularize.camelize if model.nil?
|
46
43
|
current_model.relation_properties << Property.new(name, model, :has_one)
|
47
44
|
end
|
48
45
|
|
49
|
-
def has_many(name, model)
|
46
|
+
def has_many(name, model = nil)
|
47
|
+
model = name.to_s.singularize.camelize if model.nil?
|
50
48
|
property = Property.new(name, model, :has_many)
|
51
49
|
raise Informative, "Property type in has_many relation can't be optional" if property.is_optional?
|
52
50
|
current_model.relation_properties << property
|
53
51
|
end
|
54
52
|
|
55
|
-
def belongs_to(name, model)
|
53
|
+
def belongs_to(name, model = nil)
|
54
|
+
model = name.to_s.singularize.camelize if model.nil?
|
56
55
|
current_model.relation_properties << Property.new(name, model, :belongs_to)
|
57
56
|
current_model.properties << Property.new("#{name}_id".camelize, "Int", :foreign, :default => 0)
|
58
57
|
end
|
@@ -6,9 +6,10 @@ module MetaModel
|
|
6
6
|
require 'metamodel/command/build/parser'
|
7
7
|
require 'metamodel/command/build/renderer'
|
8
8
|
|
9
|
-
self.summary = ""
|
9
|
+
self.summary = "Build a MetaModel.framework from Metafile"
|
10
10
|
self.description = <<-DESC
|
11
|
-
|
11
|
+
Clone a metamodel project template from GitHub, parsing Metafile, validating models,
|
12
|
+
generate model swift file and build MetaModel.framework.
|
12
13
|
DESC
|
13
14
|
|
14
15
|
attr_accessor :models
|
@@ -35,7 +36,7 @@ module MetaModel
|
|
35
36
|
else
|
36
37
|
UI.section "Cloning MetaModel project into `./metamodel` folder" do
|
37
38
|
Git.clone(config.metamodel_template_uri, 'metamodel', :depth => 1)
|
38
|
-
UI.message "Using
|
39
|
+
UI.message "Using `#{metamodel_xcode_project}` to build module"
|
39
40
|
end
|
40
41
|
end
|
41
42
|
end
|
@@ -49,12 +50,14 @@ module MetaModel
|
|
49
50
|
existing_types = @models.map { |m| m.properties.map { |property| property.type } }.flatten.uniq
|
50
51
|
unsupported_types = existing_types - supported_types
|
51
52
|
raise Informative, "Unsupported types #{unsupported_types}" unless unsupported_types == []
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
|
54
|
+
@models.each do |main|
|
55
|
+
main.relation_properties.each do |property|
|
56
|
+
@models.each do |secondary|
|
57
|
+
property.relation_model = secondary if property.type == secondary.name
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
58
61
|
end
|
59
62
|
|
60
63
|
def render_model_files
|
@@ -110,7 +113,7 @@ module MetaModel
|
|
110
113
|
|
111
114
|
def validate!
|
112
115
|
super
|
113
|
-
raise Informative, 'No
|
116
|
+
raise Informative, 'No Metafile in current directory' unless config.metafile_in_dir(Pathname.pwd)
|
114
117
|
end
|
115
118
|
|
116
119
|
private
|
@@ -125,14 +128,22 @@ module MetaModel
|
|
125
128
|
end
|
126
129
|
end
|
127
130
|
|
131
|
+
CURRENT_SUPPORTED_BUILT_IN_TYPES = %w[
|
132
|
+
Int
|
133
|
+
Double
|
134
|
+
String
|
135
|
+
Bool
|
136
|
+
NSDate
|
137
|
+
]
|
138
|
+
|
128
139
|
def built_in_types
|
129
|
-
|
140
|
+
CURRENT_SUPPORTED_BUILT_IN_TYPES.map do |t|
|
130
141
|
[t, "#{t}?"]
|
131
142
|
end.flatten
|
132
143
|
end
|
133
144
|
|
134
145
|
def supported_types
|
135
|
-
@models.reduce(
|
146
|
+
@models.reduce(CURRENT_SUPPORTED_BUILT_IN_TYPES) { |types, model|
|
136
147
|
types << model.name.to_s
|
137
148
|
}.map { |type|
|
138
149
|
[type, "#{type}?"]
|
@@ -10,34 +10,34 @@ module MetaModel
|
|
10
10
|
|
11
11
|
def initialize(argv)
|
12
12
|
@model_name = argv.shift_argument
|
13
|
-
@
|
13
|
+
@metafile_path = config.metafile_path
|
14
14
|
super
|
15
15
|
end
|
16
16
|
|
17
17
|
def run
|
18
18
|
verify_meta_exists!
|
19
|
-
UI.section "Generating model
|
19
|
+
UI.section "Generating model scaffold" do
|
20
20
|
title_options = { :verbose_prefix => '-> '.green }
|
21
|
-
UI.titled_section "Adding `#{
|
22
|
-
@
|
21
|
+
UI.titled_section "Adding `#{@model_name.camelize} model to Metafile", title_options do
|
22
|
+
@metafile_path.open('a') do |source|
|
23
|
+
source.puts model_template(@model_name)
|
24
|
+
end
|
23
25
|
end
|
24
|
-
UI.notice "`#{
|
25
|
-
UI.message "vim
|
26
|
+
UI.notice "Adding `#{@model_name.camelize}` model scaffold to Metafile, use the command below to edit it.\n"
|
27
|
+
UI.message "vim Metafile"
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
29
31
|
private
|
30
32
|
|
31
33
|
def model_template(model)
|
32
|
-
|
33
|
-
|
34
|
-
modelfile << <<-TEMPLATE.strip_heredoc
|
34
|
+
<<-TEMPLATE.strip_heredoc
|
35
|
+
|
35
36
|
define :#{model} do
|
36
37
|
# define #{model} model like this
|
37
38
|
# attr nickname, :string
|
38
39
|
end
|
39
40
|
TEMPLATE
|
40
|
-
modelfile
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -9,20 +9,23 @@ module MetaModel
|
|
9
9
|
DESC
|
10
10
|
|
11
11
|
def initialize(argv)
|
12
|
-
@
|
12
|
+
@metafile_path = Pathname.pwd + 'Metafile'
|
13
13
|
@project_path = argv.shift_argument
|
14
14
|
super
|
15
15
|
end
|
16
16
|
|
17
17
|
def validate!
|
18
18
|
super
|
19
|
-
raise Informative, 'Existing
|
19
|
+
raise Informative, 'Existing Metafile in directory' unless config.metafile_in_dir(Pathname.pwd).nil?
|
20
20
|
end
|
21
21
|
|
22
22
|
def run
|
23
23
|
UI.section "Initialing MetaModel project" do
|
24
|
-
UI.section "Creating `
|
25
|
-
FileUtils.
|
24
|
+
UI.section "Creating `Metafile` for MetaModel" do
|
25
|
+
FileUtils.touch(@metafile_path)
|
26
|
+
@metafile_path.open('w') do |source|
|
27
|
+
source.puts "metamodel_version '#{VERSION}'\n\n"
|
28
|
+
end
|
26
29
|
end
|
27
30
|
end
|
28
31
|
end
|
data/lib/metamodel/command.rb
CHANGED
@@ -16,8 +16,19 @@ module MetaModel
|
|
16
16
|
self.description = 'MetaModel, the Model generator.'
|
17
17
|
self.plugin_prefixes = %w(claide meta)
|
18
18
|
|
19
|
+
METAMODEL_COMMAND_ALIAS = {
|
20
|
+
"g" => "generate",
|
21
|
+
"i" => "init",
|
22
|
+
"b" => "build",
|
23
|
+
"c" => "clean"
|
24
|
+
}
|
25
|
+
|
19
26
|
def self.run(argv)
|
20
|
-
|
27
|
+
if METAMODEL_COMMAND_ALIAS[argv.first]
|
28
|
+
super([METAMODEL_COMMAND_ALIAS[argv.first]] + argv[1..-1])
|
29
|
+
else
|
30
|
+
super(argv)
|
31
|
+
end
|
21
32
|
end
|
22
33
|
|
23
34
|
def initialize(argv)
|
@@ -34,7 +45,7 @@ module MetaModel
|
|
34
45
|
#
|
35
46
|
# @return [void]
|
36
47
|
def verify_meta_exists!
|
37
|
-
unless config.
|
48
|
+
unless config.metefile_exist?
|
38
49
|
raise Informative, "No `meta' folder found in the project directory."
|
39
50
|
end
|
40
51
|
end
|
data/lib/metamodel/config.rb
CHANGED
@@ -46,7 +46,7 @@ module MetaModel
|
|
46
46
|
current_path = Pathname.new(current_dir)
|
47
47
|
unless @installation_root
|
48
48
|
until current_path.root?
|
49
|
-
if
|
49
|
+
if metafile_in_dir(current_path)
|
50
50
|
@installation_root = current_path
|
51
51
|
break
|
52
52
|
else
|
@@ -77,33 +77,33 @@ module MetaModel
|
|
77
77
|
"./metamodel/MetaModel.xcodeproj"
|
78
78
|
end
|
79
79
|
|
80
|
-
# Returns whether or not
|
80
|
+
# Returns whether or not metafile is in current project.
|
81
81
|
#
|
82
82
|
# @return [Bool]
|
83
83
|
#
|
84
|
-
def
|
85
|
-
Pathname.new(
|
84
|
+
def metefile_exist?
|
85
|
+
Pathname.new(metafile_path).exist?
|
86
86
|
end
|
87
87
|
|
88
|
-
# Returns the path of the
|
88
|
+
# Returns the path of the Metafile.
|
89
89
|
#
|
90
90
|
# @return [Pathname]
|
91
91
|
# @return [Nil]
|
92
92
|
#
|
93
|
-
def
|
94
|
-
@
|
93
|
+
def metafile_path
|
94
|
+
@metafile_in_dir ||= installation_root + 'Metafile'
|
95
95
|
end
|
96
96
|
|
97
|
-
# Returns the path of the
|
97
|
+
# Returns the path of the Metafile in the given dir if any exists.
|
98
98
|
#
|
99
99
|
# @param [Pathname] dir
|
100
100
|
# The directory where to look for the meta.
|
101
101
|
#
|
102
|
-
# @return [Pathname] The path of the
|
102
|
+
# @return [Pathname] The path of the metafile.
|
103
103
|
# @return [Nil] If not meta was found in the given dir
|
104
104
|
#
|
105
|
-
def
|
106
|
-
candidate = dir + '
|
105
|
+
def metafile_in_dir(dir)
|
106
|
+
candidate = dir + 'Metafile'
|
107
107
|
if candidate.exist?
|
108
108
|
return candidate
|
109
109
|
end
|
@@ -6,7 +6,7 @@ module MetaModel
|
|
6
6
|
attr_reader :relation_properties
|
7
7
|
|
8
8
|
def initialize(name)
|
9
|
-
@name = name
|
9
|
+
@name = name.to_s
|
10
10
|
@properties = []
|
11
11
|
@relation_properties = []
|
12
12
|
|
@@ -14,7 +14,7 @@ module MetaModel
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def properties_exclude_id
|
17
|
-
@properties.select { |property| property.name !=
|
17
|
+
@properties.select { |property| property.name != "id" }
|
18
18
|
end
|
19
19
|
|
20
20
|
def foreign_id
|
@@ -22,7 +22,7 @@ module MetaModel
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def table_name
|
25
|
-
name.
|
25
|
+
name.tableize
|
26
26
|
end
|
27
27
|
|
28
28
|
def relation_name
|
@@ -38,7 +38,7 @@ module MetaModel
|
|
38
38
|
def validate
|
39
39
|
property_keys = @properties.map { |property| property.name }
|
40
40
|
|
41
|
-
unless property_keys.include?
|
41
|
+
unless property_keys.include? "id"
|
42
42
|
property_id = Property.new(:id, :int, :unique, :default => 0)
|
43
43
|
@properties << property_id
|
44
44
|
end
|
@@ -48,38 +48,28 @@ module MetaModel
|
|
48
48
|
self.hash.to_s(16)
|
49
49
|
end
|
50
50
|
|
51
|
-
def property_key_value_pairs
|
52
|
-
@properties
|
51
|
+
def property_key_value_pairs(cast = false)
|
52
|
+
key_value_pairs_with_property @properties, cast
|
53
53
|
end
|
54
54
|
|
55
|
-
def
|
56
|
-
|
55
|
+
def property_key_value_pairs_without_property(property)
|
56
|
+
key_value_pairs_with_property @properties.select { |element| element.name != property }
|
57
57
|
end
|
58
58
|
|
59
|
-
def property_exclude_id_key_value_pairs(
|
60
|
-
|
61
|
-
if cast
|
62
|
-
result = properties_exclude_id.map { |property| "#{property.name.to_s}: #{property.type_without_optional == "Int" ? "Int(#{property.name.to_s})" : property.name.to_s}" }.join(", ")
|
63
|
-
else
|
64
|
-
result = properties_exclude_id.map { |property| "#{property.name.to_s}: #{property.name.to_s}" }.join(", ")
|
65
|
-
end
|
66
|
-
return result unless prefix
|
67
|
-
return result.length > 0 ? ", #{result}" : ""
|
59
|
+
def property_exclude_id_key_value_pairs(cast = false)
|
60
|
+
key_value_pairs_with_property properties_exclude_id, cast
|
68
61
|
end
|
69
62
|
|
70
|
-
def
|
71
|
-
key_type_pairs_with_property
|
63
|
+
def property_key_type_pairs
|
64
|
+
key_type_pairs_with_property @properties
|
72
65
|
end
|
73
66
|
|
74
|
-
def
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
}.join(", ")
|
81
|
-
return result unless prefix
|
82
|
-
return result.length > 0 ? ", #{result}" : ""
|
67
|
+
def property_key_type_pairs_without_property(property)
|
68
|
+
key_type_pairs_with_property @properties.select { |element| element.name != property }
|
69
|
+
end
|
70
|
+
|
71
|
+
def property_exclude_id_key_type_pairs
|
72
|
+
key_type_pairs_with_property properties_exclude_id
|
83
73
|
end
|
84
74
|
|
85
75
|
def build_table
|
@@ -98,7 +88,29 @@ module MetaModel
|
|
98
88
|
end
|
99
89
|
|
100
90
|
table + "(_id INTEGER PRIMARY KEY, #{(main_sql + foreign_sql).compact.join(", ")});"
|
91
|
+
|
101
92
|
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def key_value_pairs_with_property(properties, cast = false)
|
97
|
+
properties.map do |property|
|
98
|
+
if cast
|
99
|
+
"#{property.name}: #{property.type_without_optional}(#{property.name})"
|
100
|
+
else
|
101
|
+
"#{property.name}: #{property.name}"
|
102
|
+
end
|
103
|
+
end.join(", ")
|
104
|
+
end
|
105
|
+
|
106
|
+
def key_type_pairs_with_property(properties)
|
107
|
+
properties.map do |property|
|
108
|
+
has_default_value = property.has_default_value?
|
109
|
+
default_value = property.type_without_optional == "String" ? "\"#{property.default_value}\"" : property.default_value
|
110
|
+
"#{property.name} #{property.name}: #{property.type.to_s}#{if has_default_value then " = " + "#{default_value}" end}"
|
111
|
+
end.join(", ")
|
112
|
+
end
|
113
|
+
|
102
114
|
end
|
103
115
|
|
104
116
|
end
|
@@ -1,14 +1,15 @@
|
|
1
1
|
module MetaModel
|
2
2
|
|
3
3
|
class Property
|
4
|
-
attr_reader :json_key
|
5
4
|
attr_accessor :name
|
6
|
-
|
7
|
-
attr_reader
|
5
|
+
attr_accessor :relation_model
|
6
|
+
attr_reader :json_key
|
7
|
+
attr_reader :type
|
8
|
+
attr_reader :modifiers
|
8
9
|
|
9
10
|
def initialize(json_key, type = :string, *modifiers)
|
10
11
|
@json_key = json_key
|
11
|
-
@name = json_key.to_s.camelize(:lower)
|
12
|
+
@name = json_key.to_s.camelize(:lower)
|
12
13
|
@type = convert_symbol_to_type type
|
13
14
|
|
14
15
|
@modifiers = {}
|
@@ -34,20 +35,39 @@ module MetaModel
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def database_type
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
38
|
+
case type_without_optional
|
39
|
+
when "String" then "TEXT"
|
40
|
+
when "Int" then "INTEGER"
|
41
|
+
when "Bool" then "INTEGER"
|
42
|
+
when "Double" then "REAL"
|
43
|
+
when "NSDate" then "REAL"
|
44
|
+
else raise Informative, "Unsupported type #{self.type}"
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
48
|
def real_type
|
48
|
-
|
49
|
+
case type_without_optional
|
50
|
+
when "String" then "String"
|
51
|
+
when "Int" then "Int64"
|
52
|
+
when "Bool" then "Int64"
|
53
|
+
when "Double" then "Double"
|
54
|
+
when "NSDate" then "Double"
|
55
|
+
else raise Informative, "Unsupported type #{self.type}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def convert_symbol_to_type(symbol)
|
60
|
+
case symbol
|
61
|
+
when :int then "Int"
|
62
|
+
when :double then "Double"
|
63
|
+
when :bool then "Bool"
|
64
|
+
when :string then "String"
|
65
|
+
when :date then "NSDate"
|
66
|
+
else symbol.to_s.camelize
|
67
|
+
end
|
49
68
|
end
|
50
69
|
|
70
|
+
|
51
71
|
def is_array?
|
52
72
|
@type.pluralize == str
|
53
73
|
end
|
@@ -89,11 +109,6 @@ module MetaModel
|
|
89
109
|
end
|
90
110
|
|
91
111
|
private
|
92
|
-
|
93
|
-
def convert_symbol_to_type(symbol)
|
94
|
-
symbol.to_s.capitalize
|
95
|
-
end
|
96
|
-
|
97
112
|
end
|
98
113
|
|
99
114
|
end
|
@@ -5,12 +5,12 @@
|
|
5
5
|
element.update(#{model.foreign_id}: id)
|
6
6
|
}
|
7
7
|
|
8
|
-
func create#{property.type}(
|
9
|
-
return #{property.type}.create(
|
8
|
+
func create#{property.type}(#{property.relation_model.property_key_type_pairs_without_property model.foreign_id}) -> #{property.type}? {
|
9
|
+
return #{property.type}.create(#{property.relation_model.property_key_value_pairs_without_property model.foreign_id}, #{model.foreign_id}: self.id)
|
10
10
|
}
|
11
11
|
|
12
12
|
func delete#{property.type}(id: Int) {
|
13
|
-
#{property.type}.filter(.#{model.foreign_id}, value: id).findBy(id: id).first?.delete
|
13
|
+
#{property.type}.filter(.#{model.foreign_id}, value: id).findBy(id: id).first?.delete
|
14
14
|
}
|
15
15
|
var #{property.name}: [#{property.type}] {
|
16
16
|
get {
|
@@ -46,7 +46,7 @@
|
|
46
46
|
return #{property.type}.find(id)
|
47
47
|
}
|
48
48
|
set {
|
49
|
-
#{property.type}.filter(.#{model.name.
|
49
|
+
#{property.type}.filter(.#{model.name.camelize(:lower)}Id, value: id).deleteAll
|
50
50
|
guard var newValue = newValue else { return }
|
51
51
|
newValue.update(articleId: id)
|
52
52
|
}
|
@@ -39,7 +39,7 @@ public extension <%= model.name %> {
|
|
39
39
|
if let _ = <%= model.name %>.find(id) {
|
40
40
|
update([<% column_values = model.properties.map do |property| %><% ".#{property.name}: #{property.name}" %><% end %><%= column_values.join(", ") %>])
|
41
41
|
} else {
|
42
|
-
<%= model.name %>.create(
|
42
|
+
<%= model.name %>.create(<%= model.property_key_value_pairs %>)
|
43
43
|
}
|
44
44
|
return self
|
45
45
|
}
|
@@ -17,8 +17,6 @@ let db = try! Connection("\(path)/metamodel_db.sqlite3")
|
|
17
17
|
public class MetaModel {
|
18
18
|
public static func initialize() {
|
19
19
|
validateMetaModelTables()
|
20
|
-
<% models.each do |model| %><%= "#{model.name}.initialize()" %>
|
21
|
-
<% end %>
|
22
20
|
}
|
23
21
|
static func validateMetaModelTables() {
|
24
22
|
createMetaModelTable()
|
@@ -26,12 +24,13 @@ public class MetaModel {
|
|
26
24
|
<% models.each do |model| %><%= """if infos[#{model.name}.tableName] != \"#{model.hash_value}\" {
|
27
25
|
updateMetaModelTableInfos(#{model.name}.tableName, hashValue: \"#{model.hash_value}\")
|
28
26
|
#{model.name}.deinitialize()
|
27
|
+
#{model.name}.initialize()
|
29
28
|
}""" %>
|
30
29
|
<% end %>
|
31
30
|
}
|
32
31
|
}
|
33
32
|
|
34
|
-
func executeSQL(sql: String, verbose: Bool =
|
33
|
+
func executeSQL(sql: String, verbose: Bool = false, suppress: Bool = false, success: (() -> ())? = nil) -> Statement? {
|
35
34
|
if verbose {
|
36
35
|
print("-> Begin Transaction")
|
37
36
|
}
|
@@ -54,9 +53,9 @@ func executeSQL(sql: String, verbose: Bool = true, success: (() -> ())? = nil) -
|
|
54
53
|
} catch let error {
|
55
54
|
let endDate = NSDate()
|
56
55
|
let interval = endDate.timeIntervalSinceDate(startDate) * 1000
|
56
|
+
print("\tSQL (\(interval.format("0.2"))ms) \(sql)")
|
57
|
+
print("\t\(error)")
|
57
58
|
if verbose {
|
58
|
-
print("\tSQL (\(interval.format("0.2"))ms) \(sql)")
|
59
|
-
print("\t\(error)")
|
60
59
|
print("-> Rollback transaction")
|
61
60
|
print("\n")
|
62
61
|
}
|
@@ -64,7 +63,7 @@ func executeSQL(sql: String, verbose: Bool = true, success: (() -> ())? = nil) -
|
|
64
63
|
return nil
|
65
64
|
}
|
66
65
|
|
67
|
-
func executeScalarSQL(sql: String, verbose: Bool = false, success: (() -> ())? = nil) -> Binding? {
|
66
|
+
func executeScalarSQL(sql: String, verbose: Bool = false, suppress: Bool = false, success: (() -> ())? = nil) -> Binding? {
|
68
67
|
if verbose {
|
69
68
|
print("-> Begin Transaction")
|
70
69
|
}
|
@@ -2,6 +2,6 @@ extension <%= model.name %>: Recordable {
|
|
2
2
|
public init(values: Array<Optional<Binding>>) {
|
3
3
|
<% model.properties.each_with_index do |property, index| %><%= """let #{property.name}: #{property.real_type} = values[#{index+1}] as! #{property.real_type}""" %>
|
4
4
|
<% end %>
|
5
|
-
self.init(
|
5
|
+
self.init(<%= model.property_key_value_pairs true %>)
|
6
6
|
}
|
7
7
|
}
|
@@ -3,10 +3,13 @@ public extension <%= model.name %> {
|
|
3
3
|
let deleteAllSQL = "DELETE FROM \(tableName.unwrapped)"
|
4
4
|
executeSQL(deleteAllSQL)
|
5
5
|
}
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
|
7
|
+
static var count: Int {
|
8
|
+
get {
|
9
|
+
let countSQL = "SELECT count(*) FROM \(tableName.unwrapped)"
|
10
|
+
guard let count = executeScalarSQL(countSQL) as? Int64 else { return 0 }
|
11
|
+
return Int(count)
|
12
|
+
}
|
10
13
|
}
|
11
14
|
|
12
15
|
static func new(<%= model.property_key_type_pairs %>) -> <%= model.name %> {
|
@@ -14,7 +17,7 @@ public extension <%= model.name %> {
|
|
14
17
|
}
|
15
18
|
|
16
19
|
static func create(<%= model.property_key_type_pairs %>) -> <%= model.name %>? {
|
17
|
-
if <%= model.properties.select { |p| p.name.
|
20
|
+
if <%= model.properties.select { |p| p.name.downcase.end_with? "id" }.map { |p| "#{p.name} == 0" }.join(" || ") %> { return nil }
|
18
21
|
|
19
22
|
var columnsSQL: [<%= model.name %>.Column] = []
|
20
23
|
var valuesSQL: [Unwrapped] = []
|
data/lib/metamodel/version.rb
CHANGED
data/lib/metamodel.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.5
|
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-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: claide
|
@@ -59,17 +59,23 @@ dependencies:
|
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: '1.2'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
62
|
+
name: activesupport
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
|
-
- - "
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 4.2.6
|
68
|
+
- - "<"
|
66
69
|
- !ruby/object:Gem::Version
|
67
70
|
version: '5.0'
|
68
71
|
type: :runtime
|
69
72
|
prerelease: false
|
70
73
|
version_requirements: !ruby/object:Gem::Requirement
|
71
74
|
requirements:
|
72
|
-
- - "
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 4.2.6
|
78
|
+
- - "<"
|
73
79
|
- !ruby/object:Gem::Version
|
74
80
|
version: '5.0'
|
75
81
|
- !ruby/object:Gem::Dependency
|
@@ -183,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
189
|
version: '0'
|
184
190
|
requirements: []
|
185
191
|
rubyforge_project:
|
186
|
-
rubygems_version: 2.
|
192
|
+
rubygems_version: 2.5.1
|
187
193
|
signing_key:
|
188
194
|
specification_version: 4
|
189
195
|
summary: The Cocoa models generator.
|