aries 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,33 @@
1
+ module Aries
2
+
3
+ module Presenters
4
+
5
+ class ParamTypeSwift
6
+
7
+ # @param param_type [Aries::ParamType]
8
+ def initialize param_type
9
+ @param_type = param_type
10
+ end
11
+
12
+ def param_class
13
+ case original.type
14
+ when "any" then "AnyObject"
15
+ when "array" then "[AnyObject]"
16
+ when "boolean" then "Bool"
17
+ when "integer" then "Int"
18
+ when "number" then "Double"
19
+ when "object" then "[String:AnyObject]"
20
+ when "string" then "String"
21
+ else "AnyObject"
22
+ end
23
+ end
24
+
25
+ def original
26
+ @param_type
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,32 @@
1
+ module Aries
2
+
3
+ module Presenters
4
+
5
+ class ResourceSwift
6
+
7
+ # @param resource [Aries::Resource]
8
+ def initialize resource
9
+ @resource = resource
10
+ end
11
+
12
+ def name
13
+ original.name.camelcase
14
+ end
15
+
16
+ # @return [Array<Aries::Presenters::LinkSwift>]
17
+ def links
18
+ original.links.map{|li| LinkSwift.new li }
19
+ end
20
+
21
+ private
22
+
23
+ # @return [Aries::Resource]
24
+ def original
25
+ @resource
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,30 @@
1
+ module Aries
2
+
3
+ module Presenters
4
+
5
+ class SchemaSwift
6
+
7
+ delegate :base_url, to: :original
8
+
9
+ # @param schema [Aries::Schema]
10
+ def initialize schema
11
+ @schema = schema
12
+ end
13
+
14
+ # @return [Array<Aries::Presenters::ResourceSwift>]
15
+ def resources
16
+ original.resources.map{|r| ResourceSwift.new r }
17
+ end
18
+
19
+ private
20
+
21
+ # @return [Aries::Schema]
22
+ def original
23
+ @schema
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,35 @@
1
+ module Aries
2
+
3
+ class Resource
4
+
5
+ attr_reader :parent
6
+
7
+ #
8
+ # @param [String] name of schema
9
+ # @param [JsonSchema::Schema] json schema object
10
+ def initialize name, schema, parent = nil
11
+ @name = name
12
+ @schema = schema
13
+ @parent = parent
14
+ end
15
+
16
+ # @return String name of resource
17
+ def name
18
+ @name.split('-').join("_")
19
+ end
20
+
21
+ # @return [Array<Aries::Link>] links owned by resource
22
+ def links
23
+ @links ||= @schema.links.map do |link|
24
+ Link.new(link, self)
25
+ end
26
+ end
27
+
28
+ # @return [Aries::Schema] Root schema of resource
29
+ def root_schema
30
+ @parent.respond_to?(:parent) ? @parent.root_schema : @parent
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,56 @@
1
+ module Aries
2
+
3
+ class Schema
4
+
5
+ #
6
+ # @param Hash [JSON] Json Schema Object
7
+ # @raise [JsonSchema::SchemaError]
8
+ #
9
+ def initialize schema
10
+ @schema = ::JsonSchema.parse!(schema).tap(&:expand_references!)
11
+ end
12
+
13
+ # Resources of json schema
14
+ # @param [Array<Aries::Resource>]
15
+ def resources
16
+ @resources ||= @schema.properties.map do |name, schema|
17
+ Resource.new name, schema, self
18
+ end
19
+ end
20
+
21
+ # Find base url of api
22
+ # @return [String] url
23
+ # @raise [Aries::BaseUrlNotFound]
24
+ def base_url
25
+ root_link.try(:href) or raise BaseUrlNotFound
26
+ end
27
+
28
+ # Finds link that has "self" rel to resolve API base URL
29
+ # @return [JsonSchema::Schema::Link, nil]
30
+ def root_link
31
+ @schema.links.find do |link|
32
+ link.rel == "self"
33
+ end
34
+ end
35
+
36
+ # @param href [String]
37
+ # @return [JsonSchema::Schema]
38
+ # @example
39
+ # property_by "#/definitions/apps/definitions/identiry" #=> JsonSchema::Schema
40
+ def property_by href
41
+ accessor = href.gsub(/([a-zA-Z0-9\-\_]+)/).to_a
42
+ result = @schema
43
+ accessor.each_with_index do |a, i|
44
+ result = (i % 2) == 0 ? result.send(a.to_sym) : result[a]
45
+ end
46
+ result
47
+ end
48
+
49
+ def inspect
50
+ "#<Aries::Schema base_url=#{base_url}>"
51
+ end
52
+
53
+ end
54
+ class BaseUrlNotFound < Error
55
+ end
56
+ end
@@ -0,0 +1,217 @@
1
+ //
2
+ // <%= file_name %>
3
+ //
4
+ // Auto generated by Aries on <%= timestamp %>.
5
+ // Do not modify this file directory
6
+ //
7
+
8
+ import Alamofire
9
+ import SwiftTask
10
+ import URITemplate
11
+
12
+ typealias <%= class_name %>Response = Task<Int,AnyObject,NSError>
13
+
14
+ protocol <%= class_name %>Delegate {
15
+ func customReqeust(request: NSMutableURLRequest) -> NSMutableURLRequest
16
+ func onDefaultSuccess(response: AnyObject) -> AnyObject
17
+ func onDefaultFailure(err: NSError) -> NSError
18
+ }
19
+
20
+ class <%= class_name %> {
21
+
22
+ private struct BaseUrlStringStruct{ static var url = "<%= base_url %>" }
23
+ class var BaseUrlString: String {
24
+ get{ return BaseUrlStringStruct.url }
25
+ set{ BaseUrlStringStruct.url = newValue }
26
+ }
27
+
28
+ // workaround tips
29
+ // After updated swift 1.2, use ( static var someVariable: Int = 0 ) instead
30
+ private struct delegateStruct{ static var detegator: <%= class_name %>Delegate? }
31
+ class var delegate: <%= class_name %>Delegate? {
32
+ get{ return delegateStruct.detegator }
33
+ set{ delegateStruct.detegator = newValue }
34
+ }
35
+
36
+ private class func defaultURLRequest(let path: String, let method: Alamofire.Method) -> NSMutableURLRequest {
37
+ let URL = NSURL(string: <%= class_name %>.BaseUrlString)!
38
+ let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
39
+
40
+ mutableURLRequest.HTTPMethod = method.rawValue
41
+ mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
42
+ mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Accept")
43
+
44
+ if let delegate = self.delegate?{
45
+ return delegate.customReqeust(mutableURLRequest)
46
+ }
47
+
48
+ return mutableURLRequest
49
+ }
50
+
51
+ private class func generateURI(template: String, params: [String: AnyObject]?) -> String {
52
+ if let params = params {
53
+ return URITemplate(template: template).expand(params)
54
+ }
55
+ return template
56
+ }
57
+
58
+ class Base {
59
+
60
+ private class func request(URLRequest: URLRequestConvertible) -> <%= class_name %>Response {
61
+ return <%= class_name %>Response {(progress, fulfill, reject, configure) in
62
+ let alam = Alamofire.request(URLRequest)
63
+ .validate()
64
+ .responseJSON({ (req, res, data, err) -> Void in
65
+
66
+ if let err = err {
67
+ reject(self.buildErr(res, data: data, err: err))
68
+ return
69
+ }
70
+ fulfill(data!)
71
+ })
72
+ debugPrintln(alam)
73
+ configure.pause = { [weak alam] in if let alam = alam { alam.suspend() } }
74
+ configure.resume = { [weak alam] in if let alam = alam { alam.resume() } }
75
+ configure.cancel = { [weak alam] in if let alam = alam { alam.cancel() } }
76
+ }.then({ (data, errorInfo) -> <%= class_name %>Response in
77
+ return <%= class_name %>Response { (progress, fulfill, reject, configure) in
78
+ if(errorInfo == nil){
79
+ if let delegate = <%= class_name %>.delegate {
80
+ let newData: AnyObject = delegate.onDefaultSuccess(data!)
81
+ fulfill(newData)
82
+ return
83
+ }
84
+ fulfill(data!)
85
+ return
86
+ }else{
87
+ let (err, isCancelled) = errorInfo!
88
+ if let err = err {
89
+ if let delegate = <%= class_name %>.delegate{
90
+ let newErr = delegate.onDefaultFailure(err)
91
+ reject(newErr)
92
+ return
93
+ }
94
+ reject(err)
95
+ return
96
+ }
97
+ }
98
+ }
99
+
100
+ })
101
+ }
102
+
103
+ private class func buildErr(res: NSHTTPURLResponse?, data: AnyObject?, err: NSError?) -> NSError {
104
+ var userInfo = [String: AnyObject]()
105
+ if let res = res {
106
+ userInfo["statusCode"] = res.statusCode
107
+ }else{
108
+ userInfo["statusCode"] = 502
109
+ }
110
+ if let data: AnyObject = data {
111
+ userInfo["response"] = data
112
+ }
113
+ if let err = err {
114
+ userInfo["originalError"] = err
115
+ }
116
+ var error = NSError(domain: "com.aries.error", code: -1, userInfo: userInfo)
117
+ return error
118
+ }
119
+
120
+ }
121
+
122
+ <% resources.each do |resource| %>
123
+
124
+ class <%= resource.name %>: Base {
125
+
126
+ <% resource.links.each do |li| %>
127
+
128
+ class func <%= li.method_name %>(<%= li.params_for_method %>) -> <%= class_name %>Response {
129
+ <% if li.has_params? %>
130
+ var params = [String: AnyObject]()
131
+ <% else %>
132
+ var params: [String: AnyObject]? = nil
133
+ <% end %>
134
+
135
+ <% li.required_params.each do |param| %>
136
+ <% if param.has_children? %>
137
+ var items_<%= param.name %> = [String: AnyObject]()
138
+ <% param.params.each do |ch| %>
139
+ if let item_<%= ch.name %> = <%= param.name %>["<%= ch.name %>"] as? <%= ch.param_class %> {
140
+ items_<%= param.name %>["<%= ch.name %>"] = item_<%= ch.name %>
141
+ }
142
+ <% end %>
143
+ params["<%= param.name %>"] = items_<%= param.name %>
144
+ <% else %>
145
+ params["<%= param.name %>"] = <%= param.name %>
146
+ <% end %>
147
+ <% end %>
148
+
149
+ <% li.optional_params.each do |param| %>
150
+ if let <%= param.name %> = <%= param.name %> {
151
+ <% if param.has_children? %>
152
+ var items_<%= param.name %> = [String: AnyObject]()
153
+ <% param.params.each do |ch| %>
154
+ if let item_<%= ch.name %> = <%= param.name %>["<%= ch.name %>"] as? <%= ch.param_class %> {
155
+ items_<%= param.name %>["<%= ch.name %>"] = item_<%= ch.name %>
156
+ }
157
+ <% end %>
158
+ params["<%= param.name %>"] = items_<%= param.name %>
159
+ <% else %>
160
+ params["<%= param.name %>"] = <%= param.name %>
161
+ <% end %>
162
+ }
163
+ <% end %>
164
+
165
+ return request(Router.<%= li.method_name %>(params))
166
+ }
167
+
168
+ <% end %>
169
+
170
+ private enum Router: URLRequestConvertible {
171
+
172
+ <% resource.links.each do |li| %>
173
+ case <%= li.method_name %>([String: AnyObject]?)
174
+ <% end %>
175
+ <% if resource.links.size > 0 %>
176
+ var method: Alamofire.Method {
177
+ switch self {
178
+ <% resource.links.each do |li| %>
179
+ case .<%= li.method_name %>:
180
+ return .<%= li.http_method %>
181
+ <% end %>
182
+ }
183
+ }
184
+ <% end %>
185
+
186
+ <% if resource.links.size > 0 %>
187
+ var path: String {
188
+ switch self {
189
+ <% resource.links.each do |li| %>
190
+ case .<%= li.method_name %>(let params):
191
+ return <%= class_name %>.generateURI("<%= li.pretty_href %>", params: params)
192
+ <% end %>
193
+ }
194
+ }
195
+ <% end %>
196
+
197
+ // MARK: URLRequestConvertible
198
+
199
+ <% if resource.links.size > 0 %>
200
+ var URLRequest: NSURLRequest {
201
+ switch self{
202
+ <% resource.links.each do |li| %>
203
+ case .<%= li.method_name %>(let parameters):
204
+ return Alamofire.ParameterEncoding.<%= li.encode %>.encode(<%= class_name %>.defaultURLRequest(path, method: method), parameters: parameters).0
205
+ <% end %>
206
+ }
207
+ }
208
+ <% end %>
209
+
210
+ }
211
+
212
+
213
+ }
214
+
215
+ <% end %>
216
+
217
+ }
@@ -0,0 +1,3 @@
1
+ module Aries
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,201 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aries
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - yss44
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: addressable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json_schema
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: erubis
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.8'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '10.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '10.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rack-json_schema
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: Aries is a iOS(Swift), Andorid(not yet, but future) HTTP client generator
140
+ for APIs represented with JSON Schema
141
+ email:
142
+ - nya060@gmail.com
143
+ executables:
144
+ - aries
145
+ extensions: []
146
+ extra_rdoc_files: []
147
+ files:
148
+ - ".gitignore"
149
+ - ".rspec"
150
+ - ".travis.yml"
151
+ - Gemfile
152
+ - README.md
153
+ - Rakefile
154
+ - aries.gemspec
155
+ - bin/aries
156
+ - examples/clients/RackJsonSchemaApi.swift
157
+ - examples/schemas/rack-json_schema.json
158
+ - examples/schemas/schema-heroku.json
159
+ - lib/aries.rb
160
+ - lib/aries/cli.rb
161
+ - lib/aries/error.rb
162
+ - lib/aries/generator.rb
163
+ - lib/aries/link.rb
164
+ - lib/aries/param.rb
165
+ - lib/aries/param_type.rb
166
+ - lib/aries/presenters/link_swift.rb
167
+ - lib/aries/presenters/param_swift.rb
168
+ - lib/aries/presenters/param_type_swift.rb
169
+ - lib/aries/presenters/resource_swift.rb
170
+ - lib/aries/presenters/schema_swift.rb
171
+ - lib/aries/resource.rb
172
+ - lib/aries/schema.rb
173
+ - lib/aries/templates/client.swift.erb
174
+ - lib/aries/version.rb
175
+ homepage: https://github.com/yss44/aries
176
+ licenses:
177
+ - MIT
178
+ metadata: {}
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 2.2.2
196
+ signing_key:
197
+ specification_version: 4
198
+ summary: Aries is a iOS(Swift), Android(java,not yet) API Client generator represented
199
+ with JSON Schema
200
+ test_files: []
201
+ has_rdoc: