kilza 1.0.2 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -2
- data/Rakefile +2 -2
- data/bin/console +4 -4
- data/bin/kilza +65 -49
- data/kilza.gemspec +27 -20
- data/lib/kilza.rb +22 -7
- data/lib/kilza/class.rb +39 -20
- data/lib/kilza/language.rb +102 -47
- data/lib/kilza/language/java.rb +29 -48
- data/lib/kilza/language/java/java.erb +12 -10
- data/lib/kilza/language/objc.rb +35 -59
- data/lib/kilza/language/objc/h.erb +1 -1
- data/lib/kilza/language/objc/m.erb +4 -4
- data/lib/kilza/property.rb +39 -35
- data/lib/kilza/source.rb +4 -0
- data/lib/kilza/version.rb +2 -1
- metadata +33 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bb3186b37f9e9108276b4e7bb4c95217e32da34
|
4
|
+
data.tar.gz: 025ba6e2147e62e5e19dbf6ba8e58be9bbffa361
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8cde20c73473da2ff456a9ab14ddc5f2e32e60dcdf4218d91a6e62aa33127994c85046904d3318143a6b00a160b22a797c54812839bf42eadfcd24994ab02ba7
|
7
|
+
data.tar.gz: c5e2fcca3ba6505713607378e8b2905730c9a296a546984f7632599de692ce604de6a400ab9b519f0dbe67cbf353a0b40ecab2e5a1de0a8ad516f0e4ce9ca41d
|
data/README.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Kilza
|
2
2
|
|
3
|
+
[![Build Status](https://travis-ci.org/Jaspion/Kilza.svg?branch=master)](https://travis-ci.org/Jaspion/Kilza)
|
4
|
+
|
5
|
+
[![Coverage Status](https://coveralls.io/repos/Jaspion/Kilza/badge.svg?branch=master&service=github)](https://coveralls.io/github/Jaspion/Kilza?branch=master)
|
6
|
+
|
7
|
+
[![Inline docs](http://inch-ci.org/github/jaspion/kilza.svg?branch=master)](http://inch-ci.org/github/jaspion/kilza)
|
8
|
+
|
3
9
|
Ruby gem that can convert JSON strings in Objects.
|
4
10
|
|
5
11
|
It supports Objective-C and Java classes. Contribuition would be appreciate.
|
@@ -150,8 +156,8 @@ public class Mybaseclass implements Serializable
|
|
150
156
|
}
|
151
157
|
@Override
|
152
158
|
public int hashCode(){
|
153
|
-
return (
|
154
|
-
|
159
|
+
return (code.hashCode() +
|
160
|
+
message.hashCode());
|
155
161
|
}
|
156
162
|
|
157
163
|
@Override
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'kilza'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
9
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require
|
10
|
+
# require 'pry'
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/bin/kilza
CHANGED
@@ -16,8 +16,8 @@ end
|
|
16
16
|
module TTY
|
17
17
|
class Prompt
|
18
18
|
class List
|
19
|
-
def
|
20
|
-
@
|
19
|
+
def enum(value)
|
20
|
+
@enum = value
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -25,6 +25,9 @@ end
|
|
25
25
|
|
26
26
|
class KilzaApplication
|
27
27
|
|
28
|
+
OBJC = 1
|
29
|
+
JAVA = 2
|
30
|
+
|
28
31
|
def initialize
|
29
32
|
@pastel = Pastel.new
|
30
33
|
@prompt = TTY::Prompt.new
|
@@ -34,34 +37,34 @@ class KilzaApplication
|
|
34
37
|
end
|
35
38
|
|
36
39
|
def get_lang
|
37
|
-
action = @prompt.select(@pastel.bold(
|
40
|
+
action = @prompt.select(@pastel.bold('Target programming language?')) do |menu|
|
38
41
|
menu.default 1
|
39
|
-
menu.
|
42
|
+
menu.enum '.'
|
40
43
|
|
41
|
-
menu.choice
|
42
|
-
menu.choice
|
44
|
+
menu.choice 'Objective-C', OBJC
|
45
|
+
menu.choice 'Java', JAVA
|
43
46
|
end
|
44
47
|
action
|
45
48
|
end
|
46
49
|
|
47
50
|
def get_json
|
48
|
-
action = @prompt.select(@pastel.bold(
|
51
|
+
action = @prompt.select(@pastel.bold('Where is your JSON string content?')) do |menu|
|
49
52
|
menu.default 1
|
50
|
-
menu.
|
53
|
+
menu.enum '.'
|
51
54
|
|
52
|
-
menu.choice
|
53
|
-
menu.choice
|
55
|
+
menu.choice 'It\'s online. I have an URL.', 1
|
56
|
+
menu.choice 'It\'s offline. I have the file path.', 2
|
54
57
|
end
|
55
58
|
|
56
59
|
json_string = ''
|
57
60
|
if (action == 1)
|
58
|
-
url = @prompt.ask(@pastel.bold(
|
61
|
+
url = @prompt.ask(@pastel.bold('Please, what is the URL?')) do |q|
|
59
62
|
q.required true
|
60
63
|
end
|
61
|
-
@prompt.say(@pastel.bold(
|
64
|
+
@prompt.say(@pastel.bold('Ok. I\'ll try to get the content right now.'))
|
62
65
|
json_string = read_url(url)
|
63
66
|
else
|
64
|
-
file_path = File.expand_path(@prompt.ask(@pastel.bold(
|
67
|
+
file_path = File.expand_path(@prompt.ask(@pastel.bold('Please, what is the file path? '))) do |q|
|
65
68
|
q.required true
|
66
69
|
end
|
67
70
|
json_string = File.read(file_path.chomp)
|
@@ -69,56 +72,69 @@ class KilzaApplication
|
|
69
72
|
json_string
|
70
73
|
end
|
71
74
|
|
75
|
+
def generate(lang, json_string, class_basename, target_path, class_package = '')
|
76
|
+
if (lang == OBJC)
|
77
|
+
objc = Kilza::Objc.new(json_string)
|
78
|
+
objc.classes(class_basename).each { |c|
|
79
|
+
c.sources.each{ |s|
|
80
|
+
File.write(File.join(target_path, s.file_name), s.source)
|
81
|
+
}
|
82
|
+
}
|
83
|
+
elsif (lang == JAVA)
|
84
|
+
java = Kilza::Java.new(json_string)
|
85
|
+
java.classes(class_basename).each { |c|
|
86
|
+
c.package = class_package
|
87
|
+
c.sources.each{ |s|
|
88
|
+
File.write(File.join(target_path, s.file_name), s.source)
|
89
|
+
}
|
90
|
+
}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def get_target_path
|
95
|
+
target_path = @prompt.ask(@pastel.bold('Master, where would you like to save? ')).chomp
|
96
|
+
File.expand_path(target_path)
|
97
|
+
end
|
98
|
+
|
99
|
+
def get_basename
|
100
|
+
@prompt.ask(@pastel.bold('Master, which name would like to call the first class? ')).chomp
|
101
|
+
end
|
102
|
+
|
103
|
+
def get_package
|
104
|
+
@prompt.ask(@pastel.bold('What is the target Java package? ')).chomp
|
105
|
+
end
|
106
|
+
|
72
107
|
def run
|
73
108
|
while (not @done)
|
74
|
-
action = @prompt.select(@pastel.bold(
|
109
|
+
action = @prompt.select(@pastel.bold('Choose your destiny?')) do |menu|
|
75
110
|
menu.default 1
|
76
|
-
menu.
|
111
|
+
menu.enum '.'
|
77
112
|
|
78
113
|
menu.choice 'I want some JSON objects.', 1
|
79
114
|
menu.choice 'Nothing.', 2
|
80
115
|
end
|
81
116
|
if action == 1
|
82
117
|
json_string = get_json
|
83
|
-
target_path =
|
84
|
-
|
85
|
-
class_basename = @prompt.ask(@pastel.bold("Master, which name would like to call the first class? ")).chomp
|
118
|
+
target_path = get_target_path
|
119
|
+
class_basename = get_basename
|
86
120
|
lang = get_lang
|
87
121
|
|
88
|
-
class_package =
|
89
|
-
if (lang == 2)
|
90
|
-
class_package = @prompt.ask(@pastel.bold("What is the target Java package? ")).chomp
|
91
|
-
end
|
122
|
+
class_package = get_package if (lang == JAVA)
|
92
123
|
|
93
|
-
@prompt.say(@pastel.bold(
|
94
|
-
@prompt.say(@pastel.bold(
|
95
|
-
@prompt.say(@pastel.bold(
|
96
|
-
if
|
97
|
-
@prompt.say(@pastel.bold(
|
124
|
+
@prompt.say(@pastel.bold('Target: ') + target_path)
|
125
|
+
@prompt.say(@pastel.bold('Base class name: ') + class_basename)
|
126
|
+
@prompt.say(@pastel.bold('Target language: ') + (lang == OBJC ? 'Objective-C' : 'Java'))
|
127
|
+
if not class_package.nil?
|
128
|
+
@prompt.say(@pastel.bold('Target package: ') + class_package)
|
98
129
|
end
|
99
130
|
ok = @prompt.yes?('Is that correct?')
|
100
|
-
if
|
101
|
-
@prompt.say(@pastel.bold(
|
102
|
-
@prompt.say(@pastel.bold(
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
c.sources.each{ |s|
|
108
|
-
File.write(File.join(target_path, s.file_name), s.source)
|
109
|
-
}
|
110
|
-
}
|
111
|
-
else
|
112
|
-
java = Kilza::Java.new(json_string)
|
113
|
-
java.classes(class_basename).each { |c|
|
114
|
-
c.package = class_package
|
115
|
-
c.sources.each{ |s|
|
116
|
-
File.write(File.join(target_path, s.file_name), s.source)
|
117
|
-
}
|
118
|
-
}
|
119
|
-
end
|
120
|
-
|
121
|
-
@prompt.say(@pastel.bold("Kikera!"))
|
131
|
+
if ok.nil? or ok
|
132
|
+
@prompt.say(@pastel.bold('Yes master. Now I\'m going to generate all files.'))
|
133
|
+
@prompt.say(@pastel.bold('Berebekan Katabamba Berebekan Katabamba Berebekan Katabamba'))
|
134
|
+
|
135
|
+
generate(lang, json_string, class_basename, target_path, class_package)
|
136
|
+
|
137
|
+
@prompt.say(@pastel.bold('Kikera!'))
|
122
138
|
end
|
123
139
|
else
|
124
140
|
@done = true
|
data/kilza.gemspec
CHANGED
@@ -4,35 +4,42 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'kilza/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'kilza'
|
8
8
|
spec.version = Kilza::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Toshiro Sugii']
|
10
|
+
spec.email = ['rtoshiro@printwtf.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description = %q{
|
14
|
-
|
15
|
-
|
12
|
+
spec.summary = 'Parses JSON and generates objects into other languages'
|
13
|
+
spec.description = %q{
|
14
|
+
Ruby gem that can convert JSON strings in Objects.
|
15
|
+
It supports Objective-C and Java classes. Contribuition would be appreciate.
|
16
|
+
}
|
17
|
+
spec.homepage = 'https://github.com/Jaspion/Kilza'
|
18
|
+
spec.license = 'MIT'
|
16
19
|
|
17
20
|
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
18
21
|
# delete this section to allow pushing this gem to any host.
|
19
22
|
if spec.respond_to?(:metadata)
|
20
|
-
spec.metadata['allowed_push_host'] =
|
23
|
+
spec.metadata['allowed_push_host'] = 'rubygems.org'
|
21
24
|
else
|
22
|
-
|
25
|
+
fail 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
23
26
|
end
|
24
27
|
|
25
|
-
spec.files
|
26
|
-
|
27
|
-
|
28
|
-
spec.
|
28
|
+
spec.files= `git ls-files -z`.split("\x0").reject { |f|
|
29
|
+
f.match(%r{^(test|spec|features)/})
|
30
|
+
}
|
31
|
+
spec.bindir = 'bin'
|
32
|
+
spec.executables = ['kilza']
|
33
|
+
spec.require_paths = ['lib']
|
29
34
|
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
35
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
36
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
37
|
+
spec.add_development_dependency 'rspec'
|
38
|
+
spec.add_development_dependency 'minitest'
|
39
|
+
spec.add_development_dependency 'coveralls'
|
33
40
|
|
34
|
-
spec.add_dependency
|
35
|
-
spec.add_dependency
|
36
|
-
spec.add_dependency
|
37
|
-
spec.add_dependency
|
41
|
+
spec.add_dependency 'json'
|
42
|
+
spec.add_dependency 'erubis'
|
43
|
+
spec.add_dependency 'tty'
|
44
|
+
spec.add_dependency 'pastel'
|
38
45
|
end
|
data/lib/kilza.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'kilza/version'
|
2
2
|
|
3
3
|
require 'kilza/source'
|
4
4
|
require 'kilza/class'
|
@@ -7,21 +7,36 @@ require 'kilza/language'
|
|
7
7
|
require 'kilza/language/objc'
|
8
8
|
require 'kilza/language/java'
|
9
9
|
|
10
|
+
# Ruby class
|
10
11
|
class String
|
11
|
-
|
12
|
+
# Test if the string can be a number
|
13
|
+
#
|
14
|
+
# @param str [String] string to be tested
|
15
|
+
#
|
16
|
+
# @return [Boolean] true in case of success
|
17
|
+
def number?
|
12
18
|
true if Float(self) rescue false
|
13
19
|
end
|
14
20
|
end
|
15
21
|
|
22
|
+
# Tranforms a JSON string into Objects
|
16
23
|
module Kilza
|
24
|
+
# Removes everything except numbers and letters.
|
25
|
+
#
|
26
|
+
# @param str [String] string to be cleaned
|
27
|
+
#
|
28
|
+
# @return [String] cleaned string
|
17
29
|
def self.clean(str)
|
18
|
-
if str[0].
|
19
|
-
|
20
|
-
end
|
21
|
-
str = str.gsub(/[^a-zA-Z0-9]/, '_')
|
30
|
+
str = '_' + str if str[0].number?
|
31
|
+
str.gsub(/[^a-zA-Z0-9]/, '_')
|
22
32
|
end
|
23
33
|
|
34
|
+
# Cleans the string and make it lowercase.
|
35
|
+
#
|
36
|
+
# @param str [String] string to be cleaned
|
37
|
+
#
|
38
|
+
# @return [String] cleaned string
|
24
39
|
def self.normalize(str)
|
25
|
-
|
40
|
+
Kilza.clean(str).downcase
|
26
41
|
end
|
27
42
|
end
|
data/lib/kilza/class.rb
CHANGED
@@ -1,46 +1,65 @@
|
|
1
1
|
module Kilza
|
2
|
+
# Represents one single object class
|
2
3
|
module Class
|
4
|
+
# Class name
|
3
5
|
attr_accessor :name
|
4
|
-
|
6
|
+
|
7
|
+
# Array with all class dependecies
|
8
|
+
# Specific for each language
|
5
9
|
attr_accessor :imports
|
10
|
+
|
11
|
+
# Array with all class properties
|
6
12
|
attr_accessor :properties
|
7
13
|
|
8
14
|
def initialize(name)
|
9
|
-
@name = Kilza
|
15
|
+
@name = Kilza.normalize(name).capitalize
|
10
16
|
@properties = []
|
11
17
|
@imports = []
|
12
|
-
@params = []
|
13
18
|
end
|
14
19
|
|
20
|
+
# Search for a property by name
|
21
|
+
#
|
22
|
+
# @param name [String] Property name
|
23
|
+
#
|
24
|
+
# @return [Kilza::Property] The property found or nil
|
15
25
|
def find(name)
|
16
|
-
@properties.each { |p|
|
17
|
-
return p if (p.name == name)
|
18
|
-
}
|
26
|
+
@properties.each { |p| return p if p.name == name }
|
19
27
|
nil
|
20
28
|
end
|
21
29
|
|
30
|
+
# Adds a new property
|
31
|
+
#
|
32
|
+
# @param property [Kilza::Property] Property to include
|
22
33
|
def push(property)
|
23
34
|
p = find(property.name)
|
24
|
-
if p.nil?
|
25
|
-
@properties.push(property)
|
26
|
-
end
|
35
|
+
@properties.push(property) if p.nil?
|
27
36
|
end
|
28
37
|
|
29
38
|
def sources
|
39
|
+
fail 'It should be implemented'
|
40
|
+
end
|
41
|
+
|
42
|
+
def code(lang, file_name)
|
43
|
+
cur_path = File.expand_path(__FILE__)
|
44
|
+
erb_path = File.join(File.dirname(cur_path), 'language', lang)
|
45
|
+
|
46
|
+
path = File.join(erb_path, file_name + '.erb')
|
47
|
+
eruby = Erubis::Eruby.new(File.read(path))
|
48
|
+
|
49
|
+
s = Kilza::Source.new
|
50
|
+
s.source = eruby.result(binding)
|
51
|
+
s.file_name = @name.capitalize + '.' + file_name
|
52
|
+
s
|
30
53
|
end
|
31
54
|
|
32
|
-
def
|
55
|
+
def to_s
|
33
56
|
properties = []
|
34
|
-
@properties.each { |p|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
:
|
39
|
-
|
40
|
-
:params => @params,
|
41
|
-
:properties => properties
|
42
|
-
}
|
43
|
-
hash
|
57
|
+
@properties.each { |p| properties.push(p.to_s) }
|
58
|
+
{
|
59
|
+
name: @name,
|
60
|
+
imports: @imports,
|
61
|
+
properties: properties
|
62
|
+
}.to_s
|
44
63
|
end
|
45
64
|
end
|
46
65
|
end
|
data/lib/kilza/language.rb
CHANGED
@@ -2,79 +2,134 @@ require 'json'
|
|
2
2
|
require 'erubis'
|
3
3
|
|
4
4
|
module Kilza
|
5
|
+
# Represents an program language
|
5
6
|
module Language
|
7
|
+
# Array with all Class classes
|
6
8
|
attr_accessor :classes
|
9
|
+
|
10
|
+
# Name used to represent the first generated class
|
7
11
|
attr_accessor :base_name
|
12
|
+
|
13
|
+
# JSON that will be used to generate objects
|
8
14
|
attr_accessor :json_string
|
9
15
|
|
10
|
-
|
11
|
-
attr_accessor :
|
12
|
-
|
16
|
+
# String that will be used to prefix reserved words
|
17
|
+
attr_accessor :reserved_delimiter
|
18
|
+
|
19
|
+
# Words that will receive an undescore before property name
|
20
|
+
attr_accessor :reserved_words
|
21
|
+
|
22
|
+
# Array with all properties that will be used to compare other objects
|
23
|
+
attr_accessor :equal_keys
|
24
|
+
|
25
|
+
# Hash table with all language types mapped to target language
|
26
|
+
attr_accessor :types
|
13
27
|
|
14
28
|
def initialize(json_string)
|
15
29
|
@json_string = json_string
|
16
30
|
@classes = []
|
17
31
|
@types = {}
|
18
32
|
@reserved_words = []
|
33
|
+
@reserved_delimiter = '_'
|
19
34
|
@equal_keys = []
|
20
35
|
end
|
21
36
|
|
22
|
-
|
23
|
-
|
37
|
+
# Returns all available classes
|
38
|
+
#
|
39
|
+
# @param base_name [String] First class name
|
40
|
+
#
|
41
|
+
# @return [Array] All available classes
|
42
|
+
def classes(base_name)
|
43
|
+
hash = JSON.parse(json_string)
|
44
|
+
hash = { base_name + 'Object' => hash } if hash.is_a?(Array)
|
45
|
+
parse_hash(base_name, hash)
|
46
|
+
@classes
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
# Creates a new Class object and checks for valid name
|
52
|
+
#
|
53
|
+
# @param name [String] name of the class to be created
|
54
|
+
#
|
55
|
+
# @return [Kilza::Class] new class
|
56
|
+
def clazz(name)
|
57
|
+
name = @reserved_delimiter + name unless @reserved_words.index(name).nil?
|
24
58
|
Class.new(name)
|
25
59
|
end
|
26
60
|
|
27
|
-
|
28
|
-
|
29
|
-
|
61
|
+
# Creates a new Property object and checks for valid name
|
62
|
+
#
|
63
|
+
# @param name [String] name of the property to be created
|
64
|
+
# @param type [String] type of the property based on class name
|
65
|
+
# @param array [Boolean] indicates if this property represents an array
|
66
|
+
# @param key [Boolean] indicates if this property can be used to compare
|
67
|
+
# objects
|
68
|
+
#
|
69
|
+
# @return [Kilza::Property] new property
|
70
|
+
def property(name, type, array, key)
|
71
|
+
name = @reserved_delimiter + name unless @reserved_words.index(name).nil?
|
72
|
+
Property.new(name, type, array, key.nil?)
|
30
73
|
end
|
31
74
|
|
75
|
+
# Searches for a Kilza::Class inside @classes
|
76
|
+
# and creates a new one if it could not be found
|
77
|
+
#
|
78
|
+
# @param name [String] class name to find
|
79
|
+
#
|
80
|
+
# @return [Kilza::Class] class with the specified name
|
32
81
|
def find(name)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
@classes.
|
37
|
-
return @classes.last
|
82
|
+
name = Kilza.normalize(name).capitalize
|
83
|
+
@classes.each { |cl| return cl if cl.name == name }
|
84
|
+
@classes.push(clazz(name))
|
85
|
+
@classes.last
|
38
86
|
end
|
39
87
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
current_class.push(get_property(property_name, type, true, @equal_keys.index(property_name)))
|
58
|
-
end
|
59
|
-
}
|
60
|
-
end
|
61
|
-
when "hash"
|
62
|
-
current_class.push(get_property(property_name, 'object', false, @equal_keys.index(property_name)))
|
63
|
-
parse(value, property_name)
|
64
|
-
else
|
65
|
-
current_class.push(get_property(property_name, type, false, @equal_keys.index(property_name)))
|
66
|
-
end
|
67
|
-
}
|
88
|
+
# Parses an element value an verify if it should create a new Class
|
89
|
+
# inside @classes
|
90
|
+
#
|
91
|
+
# @param class_name [String] Name of the class the element is inside
|
92
|
+
# @param name [String] The element name
|
93
|
+
# @param value [Any] The element value
|
94
|
+
# @param array [Boolean] Indicates the element is inside an Array
|
95
|
+
def parse_el(class_name, name, value, array = false)
|
96
|
+
type = value.class.name.split('::').last.downcase
|
97
|
+
|
98
|
+
return parse_array(class_name, name, value) if type == 'array'
|
99
|
+
|
100
|
+
cur_class = find(class_name)
|
101
|
+
key = @equal_keys.index(name)
|
102
|
+
cur_class.push(property(name, type, array, key))
|
103
|
+
|
104
|
+
parse_hash(name, value) if type == 'hash'
|
68
105
|
end
|
69
106
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
107
|
+
# Parses an hash calling parse_el for each element
|
108
|
+
#
|
109
|
+
# @param class_name [String] Name of the class the hash is inside
|
110
|
+
# @param hash [Hash] The hash value
|
111
|
+
def parse_hash(class_name, hash)
|
112
|
+
hash.each do |property_name, value|
|
113
|
+
parse_el(class_name, property_name, value)
|
74
114
|
end
|
75
|
-
parse(hash, base_name)
|
76
|
-
return @classes
|
77
115
|
end
|
78
116
|
|
117
|
+
# Parses an element that represents an array calling parse_el
|
118
|
+
# for each element.
|
119
|
+
# If the array is empty, it creates a new class to represent
|
120
|
+
# each array's element.
|
121
|
+
#
|
122
|
+
# @param class_name [String] Name of the class the array is inside
|
123
|
+
# @param name [String] The element name
|
124
|
+
# @param value [Any] The element value
|
125
|
+
def parse_array(class_name, name, value)
|
126
|
+
if value.length == 0
|
127
|
+
parse_el(class_name, name, nil, true)
|
128
|
+
else
|
129
|
+
value.each do |val|
|
130
|
+
parse_el(class_name, name, val, true)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
79
134
|
end
|
80
135
|
end
|
data/lib/kilza/language/java.rb
CHANGED
@@ -2,10 +2,10 @@ require 'date'
|
|
2
2
|
|
3
3
|
module Kilza
|
4
4
|
class Java
|
5
|
-
|
6
5
|
class Class
|
7
6
|
include Kilza::Class
|
8
7
|
|
8
|
+
# Represents the Java class package
|
9
9
|
attr_accessor :package
|
10
10
|
|
11
11
|
def initialize(name, package = nil)
|
@@ -14,77 +14,58 @@ module Kilza
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def sources
|
17
|
-
|
18
|
-
java_path = File.join(File.dirname(cur_path), File.basename(cur_path, '.rb'), "java.erb")
|
19
|
-
eruby_java = Erubis::Eruby.new(File.read(java_path))
|
20
|
-
|
21
|
-
java = Kilza::Source.new
|
22
|
-
java.source = eruby_java.result(binding)
|
23
|
-
java.file_name = @name.capitalize + ".java"
|
24
|
-
|
25
|
-
result = [
|
26
|
-
java
|
27
|
-
]
|
28
|
-
return result
|
17
|
+
[code('java', 'java')]
|
29
18
|
end
|
30
19
|
end
|
31
|
-
|
32
20
|
end
|
33
21
|
end
|
34
22
|
|
35
23
|
module Kilza
|
24
|
+
# Objective-C Language parser
|
36
25
|
class Java
|
37
26
|
include Kilza::Language
|
38
27
|
|
39
28
|
def initialize(json_string)
|
40
29
|
super(json_string)
|
41
30
|
|
42
|
-
@reserved_words =
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
31
|
+
@reserved_words = %w(
|
32
|
+
abstract continue for new switch assert default goto,
|
33
|
+
package synchronized boolean do if private this break double implements,
|
34
|
+
protected throw byte else import public throws case enum instanceof,
|
35
|
+
null return transient catch extends int short try char final interface static,
|
36
|
+
void class finally long strictfp volatile const float native super while
|
37
|
+
)
|
49
38
|
|
50
39
|
@types = {
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
40
|
+
'nilclass' => 'Object',
|
41
|
+
'string' => 'String',
|
42
|
+
'fixnum' => 'Long',
|
43
|
+
'float' => 'Double',
|
44
|
+
'falseclass' => 'Boolean',
|
45
|
+
'trueclass' => 'Boolean',
|
46
|
+
'hash' => 'Object'
|
58
47
|
}
|
59
48
|
|
60
|
-
@equal_keys =
|
61
|
-
"id",
|
62
|
-
"identifier",
|
63
|
-
"uid"
|
64
|
-
]
|
49
|
+
@equal_keys = %w(id identifier uid)
|
65
50
|
end
|
66
51
|
|
67
|
-
def
|
52
|
+
def clazz(name)
|
68
53
|
Kilza::Java::Class.new(name)
|
69
54
|
end
|
70
55
|
|
71
|
-
def
|
72
|
-
super(
|
56
|
+
def classes(class_name)
|
57
|
+
super(class_name)
|
73
58
|
|
74
|
-
@classes.each
|
75
|
-
cl.properties.each
|
76
|
-
if pr.
|
77
|
-
pr.type = pr.name.capitalize
|
78
|
-
end
|
59
|
+
@classes.each do |cl|
|
60
|
+
cl.properties.each do |pr|
|
61
|
+
pr.type = pr.name.capitalize if pr.object? || (pr.array? && pr.null?)
|
79
62
|
|
80
|
-
if pr.
|
81
|
-
cl.imports.
|
82
|
-
end
|
63
|
+
cl.imports.push('import java.util.ArrayList;') if pr.array? &&
|
64
|
+
cl.imports.index('import java.util.ArrayList;').nil?
|
83
65
|
|
84
|
-
pr.type = @types[pr.type]
|
85
|
-
|
86
|
-
|
66
|
+
pr.type = @types[pr.type] unless @types[pr.type].nil?
|
67
|
+
end
|
68
|
+
end
|
87
69
|
end
|
88
|
-
|
89
70
|
end
|
90
71
|
end
|
@@ -20,7 +20,7 @@ public class <%= @name %> implements Serializable
|
|
20
20
|
<% for @property in @properties %>
|
21
21
|
@Expose
|
22
22
|
@SerializedName(FIELD_<%= @property.name.upcase %>)
|
23
|
-
<% if @property.
|
23
|
+
<% if @property.array? %>
|
24
24
|
private ArrayList<<%= @property.type %>> <%= @property.name %>;
|
25
25
|
<% else %>
|
26
26
|
private <%= @property.type %> <%= @property.name %>;
|
@@ -51,13 +51,13 @@ public class <%= @name %> implements Serializable
|
|
51
51
|
protected void parseObject(JSONObject object)
|
52
52
|
{
|
53
53
|
<% for @property in @properties %>
|
54
|
-
<% if @property.
|
54
|
+
<% if @property.array? %>
|
55
55
|
if (object.optJSONArray(FIELD_<%= @property.name.upcase %>) != null)
|
56
56
|
{
|
57
57
|
this.<%= @property.name %> = new ArrayList<>();
|
58
58
|
JSONArray <%= @property.name %>JsonArray = object.optJSONArray(FIELD_<%= @property.name.upcase %>);
|
59
59
|
for (int i = 0; i < <%= @property.name %>JsonArray.length(); i++) {
|
60
|
-
<% if @property.
|
60
|
+
<% if @property.object? || @property.null? %>
|
61
61
|
JSONObject <%= @property.name %> = <%= @property.name %>JsonArray.optJSONObject(i);
|
62
62
|
<% else %>
|
63
63
|
<%= @property.type %> <%= @property.name %> = <%= @property.name %>JsonArray.optJSON<%= @property.type %>(i);
|
@@ -66,10 +66,10 @@ public class <%= @name %> implements Serializable
|
|
66
66
|
}
|
67
67
|
}
|
68
68
|
<% else %>
|
69
|
-
<% if @property.
|
69
|
+
<% if @property.object? %>
|
70
70
|
this.<%= @property.name %> = new <%= @property.type %>(object.optJSONObject(FIELD_<%= @property.name.upcase %>));
|
71
71
|
<% else %>
|
72
|
-
<% if @property.
|
72
|
+
<% if @property.null? %>
|
73
73
|
this.<%= @property.name %> = object.opt(FIELD_<%= @property.name.upcase %>);
|
74
74
|
<% else %>
|
75
75
|
this.<%= @property.name %> = object.opt<%= @property.type %>(FIELD_<%= @property.name.upcase %>);
|
@@ -80,14 +80,16 @@ public class <%= @name %> implements Serializable
|
|
80
80
|
}
|
81
81
|
|
82
82
|
<% for @property in @properties %>
|
83
|
-
public void set<%= @property.name.capitalize %>(<%= @property.
|
83
|
+
public void set<%= @property.name.capitalize %>(<%= @property.array? ? "ArrayList<" + @property.type + ">" : @property.type %> value) {
|
84
84
|
this.<%= @property.name %> = value;
|
85
85
|
}
|
86
86
|
|
87
|
-
<% if @property.
|
87
|
+
<% if @property.array? %>
|
88
|
+
public ArrayList<<%= @property.type %>> get<%= @property.name.capitalize %>() {
|
89
|
+
<% elsif @property.boolean? %>
|
88
90
|
public <%= @property.type %> is<%= @property.name.capitalize %>() {
|
89
91
|
<% else %>
|
90
|
-
public <%= @property.
|
92
|
+
public <%= @property.type %> get<%= @property.name.capitalize %>() {
|
91
93
|
<% end %>
|
92
94
|
return this.<%= @property.name %>;
|
93
95
|
}
|
@@ -97,8 +99,8 @@ public class <%= @name %> implements Serializable
|
|
97
99
|
@eq = []
|
98
100
|
@hs = []
|
99
101
|
for @property in @properties
|
100
|
-
@eq.push("((#{@name}) obj).get#{@property.name.capitalize}().equals(#{@property.name})") if (@property.
|
101
|
-
@hs.push("
|
102
|
+
@eq.push("((#{@name}) obj).get#{@property.name.capitalize}().equals(#{@property.name})") if (@property.key)
|
103
|
+
@hs.push("#{@property.name}.hashCode()") if (@property.key)
|
102
104
|
end
|
103
105
|
%>
|
104
106
|
<% if @eq.length > 0 %>
|
data/lib/kilza/language/objc.rb
CHANGED
@@ -2,93 +2,69 @@ require 'date'
|
|
2
2
|
|
3
3
|
module Kilza
|
4
4
|
class Objc
|
5
|
-
|
6
5
|
class Class
|
7
6
|
include Kilza::Class
|
8
7
|
|
9
8
|
def sources
|
10
|
-
|
11
|
-
m_path = File.join(File.dirname(cur_path), File.basename(cur_path, '.rb'), "m.erb")
|
12
|
-
h_path = File.join(File.dirname(cur_path), File.basename(cur_path, '.rb'), "h.erb")
|
13
|
-
|
14
|
-
eruby_m = Erubis::Eruby.new(File.read(m_path))
|
15
|
-
eruby_h = Erubis::Eruby.new(File.read(h_path))
|
16
|
-
|
17
|
-
m = Kilza::Source.new
|
18
|
-
m.source = eruby_m.result(binding)
|
19
|
-
m.file_name = @name.capitalize + ".m"
|
20
|
-
|
21
|
-
h = Kilza::Source.new
|
22
|
-
h.source = eruby_h.result(binding)
|
23
|
-
h.file_name = @name.capitalize + ".h"
|
24
|
-
|
25
|
-
result = [
|
26
|
-
h,m
|
27
|
-
]
|
28
|
-
return result
|
9
|
+
[code('objc', 'h'), code('objc', 'm')]
|
29
10
|
end
|
30
11
|
end
|
31
|
-
|
32
12
|
end
|
33
13
|
end
|
34
14
|
|
35
15
|
module Kilza
|
16
|
+
# Objective-C Language parser
|
36
17
|
class Objc
|
37
18
|
include Kilza::Language
|
38
19
|
|
39
20
|
def initialize(json_string)
|
40
21
|
super(json_string)
|
41
22
|
|
42
|
-
@
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
23
|
+
@reserved_delimiter = '_my'
|
24
|
+
|
25
|
+
@reserved_words = %w(
|
26
|
+
auto break case char const continue,
|
27
|
+
class default do double else enum extern float for,
|
28
|
+
goto if id implementation inline int interface long,
|
29
|
+
new nonatomic property protocol readonly readwrite register,
|
30
|
+
restrict retain return short signed sizeof static strong,
|
31
|
+
struct switch typedef union unsafe_unretained unsigned void,
|
32
|
+
volatile weak while _bool _complex _imaginary sel imp,
|
33
|
+
bool nil yes no self super __strong __weak oneway,
|
34
|
+
in out inout bycopy byref
|
35
|
+
)
|
53
36
|
|
54
37
|
@types = {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
38
|
+
'nilclass' => 'id',
|
39
|
+
'string' => 'NSString *',
|
40
|
+
'fixnum' => 'NSNumber *',
|
41
|
+
'float' => 'NSNumber *',
|
42
|
+
'falseclass' => 'NSNumber *',
|
43
|
+
'trueclass' => 'NSNumber *',
|
44
|
+
'hash' => 'NSObject *'
|
62
45
|
}
|
63
46
|
|
64
|
-
@equal_keys =
|
65
|
-
"id",
|
66
|
-
"identifier",
|
67
|
-
"uid"
|
68
|
-
]
|
47
|
+
@equal_keys = %w(id identifier uid)
|
69
48
|
end
|
70
49
|
|
71
|
-
def
|
50
|
+
def clazz(name)
|
72
51
|
Kilza::Objc::Class.new(name)
|
73
52
|
end
|
74
53
|
|
75
|
-
def
|
76
|
-
super(
|
77
|
-
|
78
|
-
@classes.each { |cl|
|
79
|
-
cl.properties.each { |pr|
|
80
|
-
if pr.is_object?
|
81
|
-
cl.imports.push("#import \"" + pr.name.capitalize + ".h\"")
|
82
|
-
end
|
54
|
+
def classes(class_name)
|
55
|
+
super(class_name)
|
83
56
|
|
84
|
-
|
85
|
-
|
57
|
+
@classes.each do |cl|
|
58
|
+
cl.properties.each do |pr|
|
59
|
+
if pr.object? || (pr.array? && pr.null?)
|
60
|
+
pr.type = pr.name.capitalize + ' *'
|
61
|
+
cl.imports.push("#import \"#{pr.name.capitalize}.h\"")
|
86
62
|
end
|
87
63
|
|
88
|
-
pr.type =
|
89
|
-
|
90
|
-
|
64
|
+
pr.type = 'NSMutableArray *' if pr.array?
|
65
|
+
pr.type = @types[pr.type] unless @types[pr.type].nil?
|
66
|
+
end
|
67
|
+
end
|
91
68
|
end
|
92
|
-
|
93
69
|
end
|
94
70
|
end
|
@@ -57,9 +57,9 @@ NSString * const k<%= @name %><%= @property.name.capitalize %> = @"<%= @property
|
|
57
57
|
if (self && [dict isKindOfClass:[NSDictionary class]])
|
58
58
|
{
|
59
59
|
<% for @property in @properties %>
|
60
|
-
<% if @property.
|
60
|
+
<% if @property.object? || (@property.null? && @property.array?) %>
|
61
61
|
NSObject *obj<%= @property.name.capitalize %> = [dict objectForKey:k<%= @name %><%= @property.name.capitalize %>];
|
62
|
-
<% if @property.
|
62
|
+
<% if @property.array? %>
|
63
63
|
if ([obj<%= @property.name.capitalize %> isKindOfClass:[NSArray class]])
|
64
64
|
{
|
65
65
|
NSMutableArray *list<%= @property.name.capitalize %> = [NSMutableArray array];
|
@@ -88,8 +88,8 @@ NSString * const k<%= @name %><%= @property.name.capitalize %> = @"<%= @property
|
|
88
88
|
NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
|
89
89
|
|
90
90
|
<% for @property in @properties %>
|
91
|
-
<% if @property.
|
92
|
-
<% if @property.
|
91
|
+
<% if @property.object? || (@property.null? && @property.array?) %>
|
92
|
+
<% if @property.array? %>
|
93
93
|
NSMutableArray *tempArray<%= @property.name.capitalize %> = [NSMutableArray array];
|
94
94
|
for (NSObject *subArray in self.<%= @property.name %>) {
|
95
95
|
if ([subArray respondsToSelector:@selector(dictionaryRepresentation)]) {
|
data/lib/kilza/property.rb
CHANGED
@@ -1,58 +1,62 @@
|
|
1
1
|
module Kilza
|
2
|
+
# Represents a single Class property
|
2
3
|
class Property
|
4
|
+
# Normalized property name
|
5
|
+
# Starts with _ or alphanumeric character
|
6
|
+
# and doesn't contain any special character
|
3
7
|
attr_accessor :name
|
8
|
+
|
9
|
+
# Original JSON property name
|
4
10
|
attr_accessor :original_name
|
11
|
+
|
12
|
+
# Ruby string type
|
13
|
+
# Can be object, fixnum, float, falseclass, trueclass and nilclass
|
5
14
|
attr_accessor :type
|
6
|
-
attr_accessor :params
|
7
|
-
attr_accessor :is_array
|
8
|
-
attr_accessor :is_key
|
9
15
|
|
10
|
-
|
11
|
-
|
16
|
+
# Indicates if the property represents an array of objects
|
17
|
+
attr_accessor :array
|
18
|
+
alias_method :array?, :array
|
19
|
+
|
20
|
+
# Indicates if the property should be used for comparing purposes
|
21
|
+
# Used to compare if one object is equal to another one
|
22
|
+
attr_accessor :key
|
23
|
+
|
24
|
+
def initialize(name, type, array, key)
|
25
|
+
@name = Kilza.normalize(name)
|
12
26
|
@original_name = name
|
13
27
|
@type = type
|
14
|
-
@
|
15
|
-
@
|
16
|
-
|
17
|
-
|
18
|
-
def is_array?
|
19
|
-
@is_array
|
28
|
+
@array = array
|
29
|
+
@key = key
|
30
|
+
@original_type = type
|
20
31
|
end
|
21
32
|
|
22
|
-
def
|
23
|
-
@
|
33
|
+
def object?
|
34
|
+
@original_type == 'hash'
|
24
35
|
end
|
25
36
|
|
26
|
-
def
|
27
|
-
@
|
37
|
+
def fixnum?
|
38
|
+
@original_type == 'fixnum'
|
28
39
|
end
|
29
40
|
|
30
|
-
def
|
31
|
-
@
|
41
|
+
def boolean?
|
42
|
+
@original_type == 'trueclass' || @original_type == 'falseclass'
|
32
43
|
end
|
33
44
|
|
34
|
-
def
|
35
|
-
@
|
45
|
+
def float?
|
46
|
+
@original_type == 'float'
|
36
47
|
end
|
37
48
|
|
38
|
-
def
|
39
|
-
@
|
49
|
+
def null?
|
50
|
+
@original_type == 'nilclass'
|
40
51
|
end
|
41
52
|
|
42
|
-
def
|
43
|
-
|
44
|
-
:
|
45
|
-
:
|
46
|
-
:
|
47
|
-
|
48
|
-
|
49
|
-
:is_object? => is_object?,
|
50
|
-
:is_fixnum? => is_fixnum?,
|
51
|
-
:is_boolean? => is_boolean?,
|
52
|
-
:is_float? => is_float?,
|
53
|
-
:is_nil? => is_nil?
|
54
|
-
}
|
55
|
-
hash
|
53
|
+
def to_s
|
54
|
+
{
|
55
|
+
name: @name,
|
56
|
+
original_name: @original_name,
|
57
|
+
type: @type,
|
58
|
+
array?: @array
|
59
|
+
}.to_s
|
56
60
|
end
|
57
61
|
end
|
58
62
|
end
|
data/lib/kilza/source.rb
CHANGED
data/lib/kilza/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kilza
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Toshiro Sugii
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: minitest
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - '>='
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: coveralls
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: json
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,7 +136,8 @@ dependencies:
|
|
108
136
|
- - '>='
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: '0'
|
111
|
-
description:
|
139
|
+
description: "\n Ruby gem that can convert JSON strings in Objects.\n It supports
|
140
|
+
Objective-C and Java classes. Contribuition would be appreciate.\n "
|
112
141
|
email:
|
113
142
|
- rtoshiro@printwtf.com
|
114
143
|
executables:
|
@@ -162,5 +191,5 @@ rubyforge_project:
|
|
162
191
|
rubygems_version: 2.0.14
|
163
192
|
signing_key:
|
164
193
|
specification_version: 4
|
165
|
-
summary: Parses JSON
|
194
|
+
summary: Parses JSON and generates objects into other languages
|
166
195
|
test_files: []
|