moblues 0.1.0 → 0.2.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/README.md +7 -5
- data/lib/moblues/cli.rb +3 -4
- data/lib/moblues/generator/base/model.rb +24 -0
- data/lib/moblues/generator/base/type.rb +63 -0
- data/lib/moblues/generator/objc/base.rb +67 -0
- data/lib/moblues/generator/objc/human.rb +27 -0
- data/lib/moblues/generator/{human_header.h.erb → objc/human_header.h.erb} +0 -0
- data/lib/moblues/generator/{human_implementation.m.erb → objc/human_implementation.m.erb} +0 -0
- data/lib/moblues/generator/objc/machine.rb +31 -0
- data/lib/moblues/generator/{machine_header.h.erb → objc/machine_header.h.erb} +2 -2
- data/lib/moblues/generator/{machine_implementation.m.erb → objc/machine_implementation.m.erb} +0 -0
- data/lib/moblues/generator/objc/type.rb +24 -0
- data/lib/moblues/generator/swift/base.rb +39 -0
- data/lib/moblues/generator/swift/human.rb +18 -0
- data/lib/moblues/generator/swift/human.swift.erb +4 -0
- data/lib/moblues/generator/swift/machine.rb +18 -0
- data/lib/moblues/generator/swift/machine.swift.erb +12 -0
- data/lib/moblues/generator.rb +9 -4
- data/lib/moblues/reader/type.rb +3 -37
- data/lib/moblues/version.rb +1 -1
- data/lib/moblues.rb +20 -4
- data/spec/features/moblues_spec.rb +35 -16
- data/spec/lib/moblues/cli_spec.rb +12 -2
- data/spec/lib/moblues/generator/base/model_spec.rb +27 -0
- data/spec/lib/moblues/generator/base/type_spec.rb +46 -0
- data/spec/lib/moblues/generator/objc/human_spec.rb +54 -0
- data/spec/lib/moblues/generator/{machine_spec.rb → objc/machine_spec.rb} +9 -8
- data/spec/lib/moblues/generator/objc/type_spec.rb +23 -0
- data/spec/lib/moblues/generator/swift/human_spec.rb +34 -0
- data/spec/lib/moblues/generator/swift/machine_spec.rb +57 -0
- data/spec/lib/moblues/reader/type_spec.rb +3 -54
- data/spec/moblues_spec.rb +46 -12
- data/spec/resources/expected/{Author.h → objc/Author.h} +0 -0
- data/spec/resources/expected/{Author.m → objc/Author.m} +0 -0
- data/spec/resources/expected/{_Author.h → objc/_Author.h} +0 -0
- data/spec/resources/expected/{_Author.m → objc/_Author.m} +0 -0
- data/spec/resources/expected/{_Book.h → objc/_Book.h} +0 -0
- data/spec/resources/expected/{_Book.m → objc/_Book.m} +0 -0
- data/spec/resources/expected/{_Person.h → objc/_Person.h} +0 -0
- data/spec/resources/expected/{_Person.m → objc/_Person.m} +0 -0
- data/spec/resources/expected/{_Team.h → objc/_Team.h} +0 -0
- data/spec/resources/expected/{_Team.m → objc/_Team.m} +0 -0
- data/spec/resources/expected/{human → objc/human}/Playable.h +0 -0
- data/spec/resources/expected/{human → objc/human}/Playable.m +0 -0
- data/spec/resources/expected/{human → objc/human}/Playlist.h +0 -0
- data/spec/resources/expected/{human → objc/human}/Playlist.m +0 -0
- data/spec/resources/expected/{human → objc/human}/Track.h +0 -0
- data/spec/resources/expected/{human → objc/human}/Track.m +0 -0
- data/spec/resources/expected/{human → objc/human}/User.h +0 -0
- data/spec/resources/expected/{human → objc/human}/User.m +0 -0
- data/spec/resources/expected/{machine → objc/machine}/_Playable.h +0 -0
- data/spec/resources/expected/{machine → objc/machine}/_Playable.m +0 -0
- data/spec/resources/expected/{machine → objc/machine}/_Playlist.h +0 -0
- data/spec/resources/expected/{machine → objc/machine}/_Playlist.m +0 -0
- data/spec/resources/expected/{machine → objc/machine}/_Track.h +0 -0
- data/spec/resources/expected/{machine → objc/machine}/_Track.m +0 -0
- data/spec/resources/expected/{machine → objc/machine}/_User.h +0 -0
- data/spec/resources/expected/{machine → objc/machine}/_User.m +0 -0
- data/spec/resources/expected/swift/Author.swift +4 -0
- data/spec/resources/expected/swift/_Author.swift +11 -0
- data/spec/resources/expected/swift/_Book.swift +8 -0
- data/spec/resources/expected/swift/human/Playable.swift +4 -0
- data/spec/resources/expected/swift/human/Playlist.swift +5 -0
- data/spec/resources/expected/swift/human/Track.swift +4 -0
- data/spec/resources/expected/swift/human/User.swift +4 -0
- data/spec/resources/expected/swift/machine/_Playable.swift +8 -0
- data/spec/resources/expected/swift/machine/_Playlist.swift +8 -0
- data/spec/resources/expected/swift/machine/_Track.swift +9 -0
- data/spec/resources/expected/swift/machine/_User.swift +10 -0
- data/spec/resources/factories/data_model/attribute_factory.rb +28 -0
- data/spec/resources/factories/data_model/relationship_factory.rb +15 -0
- data/spec/resources/fixtures.rb +10 -10
- data/spec/resources/tmp/{human → objc/human}/Playlist.h +0 -0
- data/spec/resources/tmp/{human → objc/human}/Playlist.m +0 -0
- data/spec/resources/tmp/swift/.gitkeep +0 -0
- data/spec/resources/tmp/swift/human/Playlist.swift +5 -0
- metadata +113 -76
- data/lib/moblues/generator/base.rb +0 -65
- data/lib/moblues/generator/human.rb +0 -25
- data/lib/moblues/generator/machine.rb +0 -36
- data/lib/moblues/generator/model.rb +0 -23
- data/spec/lib/moblues/generator/human_spec.rb +0 -74
- data/spec/lib/moblues/generator/model_spec.rb +0 -27
- data/spec/resources/tmp/_Team.h +0 -18
- data/spec/resources/tmp/_Team.m +0 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1f22698058e9f78222db4f63caa41e57b48356fc
|
|
4
|
+
data.tar.gz: 2e597a01de3f94ebac46c69c4453804f0b063ad5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 519ccda057113e8d835581c6d495698628b2c1f9d0f8f005017a2c969e0dbc1bfdf0f00dc4c79d8fd19d3a5fba66fd352c30384cdec7c31526bf57400a9423a7
|
|
7
|
+
data.tar.gz: 249f7ffa4ab130fdb8c8b6daf50b7868f9a229b98b1d8cb0045e54e9bd5cff8baeed4d8400f30d132895b769ad3a68f93db1dee4c552340c32916449d867ea24
|
data/README.md
CHANGED
|
@@ -24,14 +24,16 @@ Or install it yourself as:
|
|
|
24
24
|
|
|
25
25
|
```
|
|
26
26
|
Usage:
|
|
27
|
-
|
|
27
|
+
moblues generate --human=HUMAN --machine=MACHINE --model=MODEL
|
|
28
28
|
|
|
29
29
|
Options:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
--model=MODEL # Core Data model path
|
|
31
|
+
--human=HUMAN # Path where the human files will be stored
|
|
32
|
+
--machine=MACHINE # Path where the machine files will be stored
|
|
33
|
+
[--lang=LANG] # The language used to generate the files (objc or swift)
|
|
34
|
+
# Default: objc
|
|
33
35
|
|
|
34
|
-
generate the machine and human files
|
|
36
|
+
generate the machine and human files for entities contained in a Core Data model
|
|
35
37
|
```
|
|
36
38
|
|
|
37
39
|
## Contributing
|
data/lib/moblues/cli.rb
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
require 'thor'
|
|
2
|
-
require 'moblues/reader/model'
|
|
3
|
-
require 'moblues/generator/model'
|
|
4
2
|
|
|
5
3
|
module Moblues
|
|
6
4
|
class CLI < Thor
|
|
7
|
-
desc 'generate', 'generate the machine and human files'
|
|
5
|
+
desc 'generate', 'generate the machine and human files for entities contained in a Core Data model'
|
|
8
6
|
option :model, :required => true, :desc => 'Core Data model path'
|
|
9
7
|
option :human, :required => true, :desc => 'Path where the human files will be stored'
|
|
10
8
|
option :machine, :required => true, :desc => 'Path where the machine files will be stored'
|
|
9
|
+
option :lang, :default => 'objc', :desc => 'The language used to generate the files (objc or swift)'
|
|
11
10
|
def generate
|
|
12
|
-
Moblues.generate(options[:model], options[:human], options[:machine])
|
|
11
|
+
Moblues.generate(options[:model], options[:human], options[:machine], options[:lang].to_sym)
|
|
13
12
|
end
|
|
14
13
|
end
|
|
15
14
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Moblues
|
|
2
|
+
module Generator
|
|
3
|
+
module Base
|
|
4
|
+
class Model
|
|
5
|
+
def initialize(params)
|
|
6
|
+
@human = params.fetch(:human)
|
|
7
|
+
@machine = params.fetch(:machine)
|
|
8
|
+
@human_dir = params.fetch(:human_dir)
|
|
9
|
+
@machine_dir = params.fetch(:machine_dir)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def generate(entities)
|
|
13
|
+
entities.each do |entity|
|
|
14
|
+
human.generate(human_dir, entity)
|
|
15
|
+
machine.generate(machine_dir, entity)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
attr_reader :human, :machine, :human_dir, :machine_dir
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Moblues
|
|
2
|
+
module Generator
|
|
3
|
+
module Base
|
|
4
|
+
class Type
|
|
5
|
+
SWIFT = {
|
|
6
|
+
attribute_types:
|
|
7
|
+
{
|
|
8
|
+
string: 'String',
|
|
9
|
+
number: 'NSNumber',
|
|
10
|
+
decimal: 'NSDecimalNumber',
|
|
11
|
+
date: 'NSDate',
|
|
12
|
+
data: 'NSData',
|
|
13
|
+
id: 'AnyObject'
|
|
14
|
+
},
|
|
15
|
+
relationship_types:
|
|
16
|
+
{
|
|
17
|
+
to_many: 'NSSet',
|
|
18
|
+
to_many_ordered: 'NSOrderedSet',
|
|
19
|
+
suffix: ''
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
OBJC = {
|
|
24
|
+
attribute_types:
|
|
25
|
+
{
|
|
26
|
+
string: 'NSString *',
|
|
27
|
+
number: 'NSNumber *',
|
|
28
|
+
decimal: 'NSDecimalNumber *',
|
|
29
|
+
date: 'NSDate *',
|
|
30
|
+
data: 'NSData *',
|
|
31
|
+
id: 'id '
|
|
32
|
+
},
|
|
33
|
+
relationship_types:
|
|
34
|
+
{
|
|
35
|
+
to_many: 'NSSet *',
|
|
36
|
+
to_many_ordered: 'NSOrderedSet *',
|
|
37
|
+
suffix: ' *'
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
def initialize(params = SWIFT)
|
|
42
|
+
@attribute_types = params.fetch(:attribute_types)
|
|
43
|
+
@relationship_types = params.fetch(:relationship_types)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def attribute_type(attribute)
|
|
47
|
+
attribute_types.fetch(attribute.type)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def relationship_type(relationship)
|
|
51
|
+
if relationship.to_many
|
|
52
|
+
relationship.ordered ? relationship_types[:to_many_ordered] : relationship_types[:to_many]
|
|
53
|
+
else
|
|
54
|
+
relationship.destination_entity + relationship_types[:suffix]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
protected
|
|
59
|
+
attr_reader :attribute_types, :relationship_types
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
require 'moblues/generator/objc/type'
|
|
3
|
+
|
|
4
|
+
module Moblues
|
|
5
|
+
module Generator
|
|
6
|
+
module Objc
|
|
7
|
+
class Base
|
|
8
|
+
def initialize
|
|
9
|
+
@type_generator = Type.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
protected
|
|
13
|
+
attr_reader :type_generator
|
|
14
|
+
|
|
15
|
+
def write_header(output_dir, entity)
|
|
16
|
+
write_file(header_file(output_dir, entity), header(entity))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def write_implementation(output_dir, entity)
|
|
20
|
+
write_file(implementation_file(output_dir, entity), implementation(entity))
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def write_file(file, text)
|
|
24
|
+
File.open(file, 'w+') do |f|
|
|
25
|
+
f.write(text)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def header_file(output_dir, entity)
|
|
30
|
+
File.join(output_dir, format_name(entity, 'h'))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def implementation_file(output_dir, entity)
|
|
34
|
+
File.join(output_dir, format_name(entity, 'm'))
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def format_name(entity, extension)
|
|
38
|
+
raise NotImplemented
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def header(entity)
|
|
42
|
+
render(header_template, entity)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def implementation(entity)
|
|
46
|
+
render(implementation_template, entity)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def render(template, entity)
|
|
50
|
+
ERB.new(template, 0, '-').result(entity.send(:binding))
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def header_template
|
|
54
|
+
raise NotImplemented
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def implementation_template
|
|
58
|
+
raise NotImplemented
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def file_template(name)
|
|
62
|
+
File.read(File.expand_path("../#{name}.erb", __FILE__))
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'moblues/generator/objc/base'
|
|
2
|
+
|
|
3
|
+
module Moblues
|
|
4
|
+
module Generator
|
|
5
|
+
module Objc
|
|
6
|
+
class Human < Base
|
|
7
|
+
def generate(output_dir, entity)
|
|
8
|
+
write_header(output_dir, entity) unless File.exists?(header_file(output_dir, entity))
|
|
9
|
+
write_implementation(output_dir, entity) unless File.exists?(implementation_file(output_dir, entity))
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
def format_name(entity, extension)
|
|
14
|
+
"#{entity.name}.#{extension}"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def header_template
|
|
18
|
+
file_template('human_header.h')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def implementation_template
|
|
22
|
+
file_template('human_implementation.m')
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'moblues/generator/objc/base'
|
|
2
|
+
|
|
3
|
+
module Moblues
|
|
4
|
+
module Generator
|
|
5
|
+
module Objc
|
|
6
|
+
class Machine < Base
|
|
7
|
+
def generate(output_dir, entity)
|
|
8
|
+
write_header(output_dir, entity)
|
|
9
|
+
write_implementation(output_dir, entity)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
def format_name(entity, extension)
|
|
14
|
+
"_#{entity.name}.#{extension}"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def capitalized_name(relationship)
|
|
18
|
+
relationship.name.sub(/^./) { |first_character| first_character.upcase }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def header_template
|
|
22
|
+
file_template('machine_header.h')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def implementation_template
|
|
26
|
+
file_template('machine_implementation.m')
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
|
|
12
12
|
@interface _<%= entity.name %> : <%= entity.parent_entity %>
|
|
13
13
|
<% for attribute in entity.attributes -%>
|
|
14
|
-
@property (<%=
|
|
14
|
+
@property (<%= type_generator.property_attributes(attribute).join(', ') %>) <%= type_generator.attribute_type(attribute)%><%= attribute.name %>;
|
|
15
15
|
<% end -%>
|
|
16
16
|
|
|
17
17
|
<% for relationship in entity.relationships -%>
|
|
18
|
-
@property (nonatomic, strong) <%=
|
|
18
|
+
@property (nonatomic, strong) <%= type_generator.relationship_type(relationship) %><%= relationship.name %>;
|
|
19
19
|
<% end -%>
|
|
20
20
|
@end
|
|
21
21
|
<% if !entity.relationships.select { |e| e.to_many }.empty? %>
|
data/lib/moblues/generator/{machine_implementation.m.erb → objc/machine_implementation.m.erb}
RENAMED
|
File without changes
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'moblues/generator/base/type'
|
|
2
|
+
|
|
3
|
+
module Moblues
|
|
4
|
+
module Generator
|
|
5
|
+
module Objc
|
|
6
|
+
class Type < Base::Type
|
|
7
|
+
def initialize
|
|
8
|
+
super(OBJC)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def property_attributes(attribute)
|
|
12
|
+
case attribute.type
|
|
13
|
+
when :string
|
|
14
|
+
%w{nonatomic copy}
|
|
15
|
+
when :number, :decimal, :date, :data, :id
|
|
16
|
+
%w{nonatomic strong}
|
|
17
|
+
else
|
|
18
|
+
raise ArgumentError.new("unknown type #{type}")
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
require 'moblues/generator/base/type'
|
|
3
|
+
|
|
4
|
+
module Moblues
|
|
5
|
+
module Generator
|
|
6
|
+
module Swift
|
|
7
|
+
class Base
|
|
8
|
+
def initialize
|
|
9
|
+
@type = Generator::Base::Type.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
protected
|
|
13
|
+
attr_reader :type
|
|
14
|
+
|
|
15
|
+
def write_swift(output_dir, entity, file_type)
|
|
16
|
+
write_file(file_path(output_dir, entity), render(entity, file_type))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def write_file(file, text)
|
|
20
|
+
File.open(file, 'w+') do |f|
|
|
21
|
+
f.write(text)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def file_path(output_dir, entity)
|
|
26
|
+
raise NotImplemented
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def render(entity, file_type)
|
|
30
|
+
ERB.new(template(file_type), 0, '-').result(entity.send(:binding))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def template(file_type)
|
|
34
|
+
File.read(File.expand_path("../#{file_type}.swift.erb", __FILE__))
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'moblues/generator/swift/base'
|
|
2
|
+
|
|
3
|
+
module Moblues
|
|
4
|
+
module Generator
|
|
5
|
+
module Swift
|
|
6
|
+
class Human < Base
|
|
7
|
+
def generate(output_dir, entity)
|
|
8
|
+
write_swift(output_dir, entity, :human) unless File.exists?(file_path(output_dir, entity))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
def file_path(output_dir, entity)
|
|
13
|
+
File.join(output_dir, "#{entity.name}.swift")
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'moblues/generator/swift/base'
|
|
2
|
+
|
|
3
|
+
module Moblues
|
|
4
|
+
module Generator
|
|
5
|
+
module Swift
|
|
6
|
+
class Machine < Base
|
|
7
|
+
def generate(output_dir, entity)
|
|
8
|
+
write_swift(output_dir, entity, :machine)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
def file_path(output_dir, entity)
|
|
13
|
+
File.join(output_dir, "_#{entity.name}.swift")
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import CoreData
|
|
3
|
+
|
|
4
|
+
class _<%= entity.name %>: <%= entity.parent_entity %> {
|
|
5
|
+
<% for attribute in entity.attributes -%>
|
|
6
|
+
@NSManaged var <%= attribute.name %>: <%= type.attribute_type(attribute) %>
|
|
7
|
+
<% end -%>
|
|
8
|
+
|
|
9
|
+
<% for relationship in entity.relationships -%>
|
|
10
|
+
@NSManaged var <%= relationship.name %>: <%= type.relationship_type(relationship) %>
|
|
11
|
+
<% end -%>
|
|
12
|
+
}
|
data/lib/moblues/generator.rb
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
require 'moblues/generator/base'
|
|
2
|
-
require 'moblues/generator/
|
|
3
|
-
require 'moblues/generator/
|
|
4
|
-
require 'moblues/generator/human'
|
|
1
|
+
require 'moblues/generator/base/model'
|
|
2
|
+
require 'moblues/generator/base/type'
|
|
3
|
+
require 'moblues/generator/objc/base'
|
|
4
|
+
require 'moblues/generator/objc/human'
|
|
5
|
+
require 'moblues/generator/objc/machine'
|
|
6
|
+
require 'moblues/generator/objc/type'
|
|
7
|
+
require 'moblues/generator/swift/base'
|
|
8
|
+
require 'moblues/generator/swift/human'
|
|
9
|
+
require 'moblues/generator/swift/machine'
|
data/lib/moblues/reader/type.rb
CHANGED
|
@@ -5,8 +5,10 @@ module Moblues
|
|
|
5
5
|
case type_str
|
|
6
6
|
when 'String'
|
|
7
7
|
:string
|
|
8
|
-
when 'Integer 16', 'Integer 32', 'Integer 64', 'Boolean'
|
|
8
|
+
when 'Integer 16', 'Integer 32', 'Integer 64', 'Boolean', 'Float', 'Double'
|
|
9
9
|
:number
|
|
10
|
+
when 'Decimal'
|
|
11
|
+
:decimal
|
|
10
12
|
when 'Date'
|
|
11
13
|
:date
|
|
12
14
|
when 'Binary'
|
|
@@ -17,42 +19,6 @@ module Moblues
|
|
|
17
19
|
raise ArgumentError.new("unknown type #{type_str}")
|
|
18
20
|
end
|
|
19
21
|
end
|
|
20
|
-
|
|
21
|
-
def property_type(type)
|
|
22
|
-
case type
|
|
23
|
-
when :string
|
|
24
|
-
'NSString *'
|
|
25
|
-
when :number
|
|
26
|
-
'NSNumber *'
|
|
27
|
-
when :date
|
|
28
|
-
'NSDate *'
|
|
29
|
-
when :data
|
|
30
|
-
'NSData *'
|
|
31
|
-
when :id
|
|
32
|
-
'id '
|
|
33
|
-
else
|
|
34
|
-
raise ArgumentError.new("unknown type #{type}")
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def property_attributes(type)
|
|
39
|
-
case type
|
|
40
|
-
when :string
|
|
41
|
-
%w{nonatomic copy}
|
|
42
|
-
when :number, :date, :data, :id
|
|
43
|
-
%w{nonatomic strong}
|
|
44
|
-
else
|
|
45
|
-
raise ArgumentError.new("unknown type #{type}")
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def relationship_type(relationship)
|
|
50
|
-
if relationship.to_many
|
|
51
|
-
relationship.ordered ? 'NSOrderedSet *' : 'NSSet *'
|
|
52
|
-
else
|
|
53
|
-
relationship.destination_entity + ' *'
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
22
|
end
|
|
57
23
|
end
|
|
58
24
|
end
|
data/lib/moblues/version.rb
CHANGED
data/lib/moblues.rb
CHANGED
|
@@ -6,11 +6,11 @@ require 'moblues/generator'
|
|
|
6
6
|
module Moblues
|
|
7
7
|
extend self
|
|
8
8
|
|
|
9
|
-
def generate(model, human_dir, machine_dir)
|
|
9
|
+
def generate(model, human_dir, machine_dir, lang = :objc)
|
|
10
10
|
mkdir([human_dir, machine_dir])
|
|
11
|
-
reader
|
|
12
|
-
generator =
|
|
13
|
-
entities
|
|
11
|
+
reader = Moblues::Reader::Model.new
|
|
12
|
+
generator = generator(human_dir, machine_dir, lang)
|
|
13
|
+
entities = reader.model(model)
|
|
14
14
|
generator.generate(entities)
|
|
15
15
|
end
|
|
16
16
|
|
|
@@ -20,4 +20,20 @@ module Moblues
|
|
|
20
20
|
Dir.mkdir(dir) unless Dir.exists?(dir)
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
|
+
|
|
24
|
+
def generator(human_dir, machine_dir, lang)
|
|
25
|
+
base_params = { human_dir: human_dir,
|
|
26
|
+
machine_dir: machine_dir }
|
|
27
|
+
case lang
|
|
28
|
+
when :swift
|
|
29
|
+
additional_params = { human: Moblues::Generator::Swift::Human.new,
|
|
30
|
+
machine: Moblues::Generator::Swift::Machine.new }
|
|
31
|
+
when :objc
|
|
32
|
+
additional_params = { human: Moblues::Generator::Objc::Human.new,
|
|
33
|
+
machine: Moblues::Generator::Objc::Machine.new }
|
|
34
|
+
else
|
|
35
|
+
raise ArgumentError.new("Language #{lang} is not supported")
|
|
36
|
+
end
|
|
37
|
+
Moblues::Generator::Base::Model.new(base_params.merge(additional_params))
|
|
38
|
+
end
|
|
23
39
|
end
|
|
@@ -7,30 +7,49 @@ describe 'moblues' do
|
|
|
7
7
|
|
|
8
8
|
describe 'generate' do
|
|
9
9
|
let(:command) { 'generate' }
|
|
10
|
-
let(:options) { %w{--model=spec/resources/Model.xcdatamodeld --human=spec/resources/tmp/human --machine=spec/resources/tmp/machine} }
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
let(:entities) { %w{User Playable Track Playlist} }
|
|
12
|
+
|
|
13
|
+
shared_examples_for 'generate' do |lang|
|
|
14
|
+
it 'generates human and machine files' do
|
|
15
|
+
perform
|
|
16
|
+
|
|
17
|
+
(machine_files + human_files).each do |file|
|
|
18
|
+
expect(Fixtures.read_file(Fixtures.generated_dir(lang), file)).to eq(Fixtures.read_file(Fixtures.expected_dir(lang), file))
|
|
19
|
+
end
|
|
20
|
+
end
|
|
14
21
|
end
|
|
15
22
|
|
|
16
|
-
|
|
17
|
-
|
|
23
|
+
context 'swift' do
|
|
24
|
+
let(:options) { %w{--model=spec/resources/Model.xcdatamodeld --human=spec/resources/tmp/swift/human --machine=spec/resources/tmp/swift/machine --lang=swift} }
|
|
25
|
+
|
|
26
|
+
let(:machine_files) { entities.map{|f| "machine/_#{f}.swift" } }
|
|
27
|
+
let(:human_files) { entities.map{|f| "human/#{f}.swift" } }
|
|
18
28
|
|
|
19
|
-
|
|
20
|
-
|
|
29
|
+
after do
|
|
30
|
+
Fixtures.delete_tmp_files(machine_files + human_files.select { |f| !f.include?('Playlist') }, :swift)
|
|
21
31
|
end
|
|
32
|
+
|
|
33
|
+
it_behaves_like 'generate', :swift
|
|
22
34
|
end
|
|
23
|
-
end
|
|
24
35
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
end
|
|
36
|
+
context 'objc' do
|
|
37
|
+
let(:options) { %w{--model=spec/resources/Model.xcdatamodeld --human=spec/resources/tmp/objc/human --machine=spec/resources/tmp/objc/machine} }
|
|
28
38
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
let(:machine_files) { entities.map{|f| "machine/_#{f}" }.map{ |f| %W(#{f}.h #{f}.m) }.flatten }
|
|
40
|
+
let(:human_files) { entities.map{|f| "human/#{f}" }.map{ |f| %W(#{f}.h #{f}.m) }.flatten }
|
|
41
|
+
|
|
42
|
+
after do
|
|
43
|
+
Fixtures.delete_tmp_files(machine_files + human_files.select { |f| !f.include?('Playlist') }, :objc)
|
|
44
|
+
end
|
|
32
45
|
|
|
33
|
-
|
|
34
|
-
|
|
46
|
+
it 'generates human and machine files' do
|
|
47
|
+
perform
|
|
48
|
+
|
|
49
|
+
(machine_files + human_files).each do |file|
|
|
50
|
+
expect(Fixtures.read_file(Fixtures.generated_dir(:objc), file)).to eq(Fixtures.read_file(Fixtures.expected_dir(:objc), file))
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
35
54
|
end
|
|
36
55
|
end
|
|
@@ -28,11 +28,21 @@ describe Moblues::CLI do
|
|
|
28
28
|
context 'when options given' do
|
|
29
29
|
let(:options) { %w{--model=model/path --human=human/path --machine=machine/path} }
|
|
30
30
|
|
|
31
|
-
it '
|
|
32
|
-
expect(Moblues).to receive(:generate).with('model/path', 'human/path', 'machine/path').once
|
|
31
|
+
it 'uses Moblues and defaults to objc' do
|
|
32
|
+
expect(Moblues).to receive(:generate).with('model/path', 'human/path', 'machine/path', :objc).once
|
|
33
33
|
|
|
34
34
|
perform
|
|
35
35
|
end
|
|
36
|
+
|
|
37
|
+
context 'when using lang option' do
|
|
38
|
+
let(:options) { %w{--model=model/path --human=human/path --machine=machine/path --lang=swift} }
|
|
39
|
+
|
|
40
|
+
it 'uses Moblues' do
|
|
41
|
+
expect(Moblues).to receive(:generate).with('model/path', 'human/path', 'machine/path', :swift).once
|
|
42
|
+
|
|
43
|
+
perform
|
|
44
|
+
end
|
|
45
|
+
end
|
|
36
46
|
end
|
|
37
47
|
end
|
|
38
48
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Moblues::Generator::Base::Model do
|
|
4
|
+
describe '#generate' do
|
|
5
|
+
subject { described_class.new(human: human, machine: machine, human_dir: human_dir, machine_dir: machine_dir) }
|
|
6
|
+
|
|
7
|
+
let(:entities) { [build(:entity)] }
|
|
8
|
+
let(:entity) { entities.first }
|
|
9
|
+
let(:human_dir) { 'human/dir'}
|
|
10
|
+
let(:machine_dir) { 'machine/dir'}
|
|
11
|
+
|
|
12
|
+
let(:human) { double(Moblues::Generator::Objc::Human) }
|
|
13
|
+
let(:machine) { double(Moblues::Generator::Objc::Machine) }
|
|
14
|
+
|
|
15
|
+
before do
|
|
16
|
+
allow(Moblues::Generator::Objc::Human).to receive(:new) { human }
|
|
17
|
+
allow(Moblues::Generator::Objc::Machine).to receive(:new) { machine }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'generates the human and machine files' do
|
|
21
|
+
expect(human).to receive(:generate).with(human_dir, entity).once
|
|
22
|
+
expect(machine).to receive(:generate).with(machine_dir, entity).once
|
|
23
|
+
|
|
24
|
+
subject.generate(entities)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|