aries 0.1.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.
@@ -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: