Skip to content

Commit deca6a0

Browse files
committed
Merge pull request #662 from xhh/ruby-module-structure
Organize the generated Ruby code into a module structure
2 parents 6a336f2 + 0fb1918 commit deca6a0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+2397
-2370
lines changed

modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ public Reader getTemplate(String name) {
165165
operation.putAll(config.additionalProperties());
166166
operation.put("classname", config.toApiName(tag));
167167
operation.put("classVarName", config.toApiVarName(tag));
168+
operation.put("importPath", config.toApiImport(tag));
168169

169170
allOperations.add(new HashMap<String, Object>(operation));
170171
for (int i = 0; i < allOperations.size(); i++) {
@@ -427,6 +428,7 @@ public Map<String, Object> processModels(CodegenConfig config, Map<String, Model
427428
CodegenModel cm = config.fromModel(key, mm);
428429
Map<String, Object> mo = new HashMap<String, Object>();
429430
mo.put("model", cm);
431+
mo.put("importPath", config.toModelImport(key));
430432
models.add(mo);
431433
allImports.addAll(cm.imports);
432434
}

modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/RubyClientCodegen.java

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@
88
import java.io.File;
99

1010
public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig {
11-
protected String invokerPackage = "com.wordnik.client";
12-
protected String groupId = "com.wordnik";
13-
protected String artifactId = "swagger-client";
14-
protected String artifactVersion = "1.0.0";
11+
protected String gemName = "swagger_client";
12+
protected String moduleName = null;
13+
protected String libFolder = "lib";
1514

1615
public CodegenType getTag() {
1716
return CodegenType.CLIENT;
@@ -25,10 +24,18 @@ public String getHelp() {
2524
return "Generates a Ruby client library.";
2625
}
2726

27+
/**
28+
* Generate Ruby module name from the gem name, e.g. use "SwaggerClient" for "swagger_client".
29+
*/
30+
public String generateModuleName() {
31+
return camelize(gemName.replaceAll("[^\\w]+", "_"));
32+
}
33+
2834
public RubyClientCodegen() {
2935
super();
30-
modelPackage = "models";
31-
apiPackage = "lib";
36+
moduleName = generateModuleName();
37+
modelPackage = gemName + "/models";
38+
apiPackage = gemName + "/api";
3239
outputFolder = "generated-code/ruby";
3340
modelTemplateFiles.put("model.mustache", ".rb");
3441
apiTemplateFiles.put("api.mustache", ".rb");
@@ -39,17 +46,15 @@ public RubyClientCodegen() {
3946

4047
reservedWords = new HashSet<String> (
4148
Arrays.asList(
42-
"__FILE__", "and", "def", "end", "in", "or", "self", "unless", "__LINE__",
49+
"__FILE__", "and", "def", "end", "in", "or", "self", "unless", "__LINE__",
4350
"begin", "defined?", "ensure", "module", "redo", "super", "until", "BEGIN",
44-
"break", "do", "false", "next", "rescue", "then", "when", "END", "case",
51+
"break", "do", "false", "next", "rescue", "then", "when", "END", "case",
4552
"else", "for", "nil", "retry", "true", "while", "alias", "class", "elsif",
4653
"if", "not", "return", "undef", "yield")
4754
);
4855

49-
additionalProperties.put("invokerPackage", invokerPackage);
50-
additionalProperties.put("groupId", groupId);
51-
additionalProperties.put("artifactId", artifactId);
52-
additionalProperties.put("artifactVersion", artifactVersion);
56+
additionalProperties.put("gemName", gemName);
57+
additionalProperties.put("moduleName", moduleName);
5358

5459
languageSpecificPrimitives.add("int");
5560
languageSpecificPrimitives.add("array");
@@ -64,15 +69,18 @@ public RubyClientCodegen() {
6469
typeMapping.put("List", "array");
6570
typeMapping.put("map", "map");
6671

67-
supportingFiles.add(new SupportingFile("swagger-client.gemspec.mustache", "", "swagger-client.gemspec"));
68-
supportingFiles.add(new SupportingFile("swagger-client.mustache", "", "lib/swagger-client.rb"));
69-
supportingFiles.add(new SupportingFile("swagger.mustache", "", "lib/swagger.rb"));
70-
supportingFiles.add(new SupportingFile("monkey.mustache", "", "lib/monkey.rb"));
71-
supportingFiles.add(new SupportingFile("swagger/request.mustache", "", "lib/swagger/request.rb"));
72-
supportingFiles.add(new SupportingFile("swagger/response.mustache", "", "lib/swagger/response.rb"));
73-
supportingFiles.add(new SupportingFile("swagger/version.mustache", "", "lib/swagger/version.rb"));
74-
supportingFiles.add(new SupportingFile("swagger/configuration.mustache", "", "lib/swagger/configuration.rb"));
75-
supportingFiles.add(new SupportingFile("base_object.mustache", "", "models/base_object.rb"));
72+
String baseFolder = "lib/" + gemName;
73+
String swaggerFolder = baseFolder + "/swagger";
74+
String modelFolder = baseFolder + "/models";
75+
supportingFiles.add(new SupportingFile("swagger_client.gemspec.mustache", "", gemName + ".gemspec"));
76+
supportingFiles.add(new SupportingFile("swagger_client.mustache", "lib", gemName + ".rb"));
77+
supportingFiles.add(new SupportingFile("monkey.mustache", baseFolder, "monkey.rb"));
78+
supportingFiles.add(new SupportingFile("swagger.mustache", baseFolder, "swagger.rb"));
79+
supportingFiles.add(new SupportingFile("swagger/request.mustache", swaggerFolder, "request.rb"));
80+
supportingFiles.add(new SupportingFile("swagger/response.mustache", swaggerFolder, "response.rb"));
81+
supportingFiles.add(new SupportingFile("swagger/version.mustache", swaggerFolder, "version.rb"));
82+
supportingFiles.add(new SupportingFile("swagger/configuration.mustache", swaggerFolder, "configuration.rb"));
83+
supportingFiles.add(new SupportingFile("base_object.mustache", modelFolder, "base_object.rb"));
7684
}
7785

7886
@Override
@@ -82,11 +90,11 @@ public String escapeReservedWord(String name) {
8290

8391
@Override
8492
public String apiFileFolder() {
85-
return outputFolder + "/" + apiPackage().replace('.', File.separatorChar);
93+
return outputFolder + File.separatorChar + "lib" + File.separatorChar + gemName + File.separatorChar + "api";
8694
}
8795

8896
public String modelFileFolder() {
89-
return outputFolder + "/" + modelPackage().replace('.', File.separatorChar);
97+
return outputFolder + File.separatorChar + "lib" + File.separatorChar + gemName + File.separatorChar + "models";
9098
}
9199

92100
@Override
@@ -150,13 +158,13 @@ public String toParamName(String name) {
150158
// should be the same as variable name
151159
return toVarName(name);
152160
}
153-
161+
154162
@Override
155163
public String toModelName(String name) {
156164
// model name cannot use reserved keyword, e.g. return
157165
if(reservedWords.contains(name))
158166
throw new RuntimeException(name + " (reserved word) cannot be used as a model name");
159-
167+
160168
// camelize the model name
161169
// phone_number => PhoneNumber
162170
return camelize(name);
@@ -167,11 +175,11 @@ public String toModelFilename(String name) {
167175
// model name cannot use reserved keyword, e.g. return
168176
if(reservedWords.contains(name))
169177
throw new RuntimeException(name + " (reserved word) cannot be used as a model name");
170-
178+
171179
// underscore the model file name
172180
// PhoneNumber.rb => phone_number.rb
173181
return underscore(name);
174-
}
182+
}
175183

176184
@Override
177185
public String toApiFilename(String name) {
@@ -186,7 +194,7 @@ public String toApiFilename(String name) {
186194
public String toApiName(String name) {
187195
if(name.length() == 0)
188196
return "DefaultApi";
189-
// e.g. phone_number_api => PhoneNumberApi
197+
// e.g. phone_number_api => PhoneNumberApi
190198
return camelize(name) + "Api";
191199
}
192200

@@ -196,8 +204,17 @@ public String toOperationId(String operationId) {
196204
if(reservedWords.contains(operationId))
197205
throw new RuntimeException(operationId + " (reserved word) cannot be used as method name");
198206

199-
return underscore(operationId);
207+
return underscore(operationId);
200208
}
201209

210+
@Override
211+
public String toModelImport(String name) {
212+
return modelPackage() + "/" + toModelFilename(name);
213+
}
214+
215+
@Override
216+
public String toApiImport(String name) {
217+
return apiPackage() + "/" + toApiFilename(name);
218+
}
202219

203220
}
Lines changed: 51 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,59 @@
11
require "uri"
22

3+
module {{moduleName}}
34
{{#operations}}
4-
class {{classname}}
5-
basePath = "{{basePath}}"
6-
# apiInvoker = APIInvoker
5+
class {{classname}}
6+
basePath = "{{basePath}}"
7+
# apiInvoker = APIInvoker
78
{{#operation}}
89
{{newline}}
9-
# {{summary}}
10-
# {{notes}}
11-
{{#allParams}}{{#required}} # @param {{paramName}} {{description}}
12-
{{/required}}{{/allParams}} # @param [Hash] opts the optional parameters
13-
{{#allParams}}{{^required}} # @option opts [{{dataType}}] :{{paramName}} {{description}}
14-
{{/required}}{{/allParams}} # @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}
15-
def self.{{nickname}}({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {})
16-
{{#allParams}}{{#required}}
17-
# verify the required parameter '{{paramName}}' is set
18-
raise "Missing the required parameter '{{paramName}}' when calling {{nickname}}" if {{{paramName}}}.nil?
19-
{{/required}}{{/allParams}}
20-
21-
# resource path
22-
path = "{{path}}".sub('{format}','json'){{#pathParams}}.sub('{' + '{{baseName}}' + '}', {{paramName}}.to_s){{/pathParams}}
23-
24-
# query parameters
25-
query_params = {}{{#queryParams}}{{#required}}
26-
query_params[:'{{{baseName}}}'] = {{{paramName}}}{{/required}}{{/queryParams}}{{#queryParams}}{{^required}}
27-
query_params[:'{{{baseName}}}'] = opts[:'{{{paramName}}}'] if opts[:'{{{paramName}}}']{{/required}}{{/queryParams}}
28-
29-
# header parameters
30-
header_params = {}
31-
32-
# HTTP header 'Accept' (if needed)
33-
_header_accept = [{{#produces}}'{{mediaType}}'{{#hasMore}}, {{/hasMore}}{{/produces}}]
34-
_header_accept_result = Swagger::Request.select_header_accept(_header_accept) and header_params['Accept'] = _header_accept_result
35-
36-
# HTTP header 'Content-Type'
37-
_header_content_type = [{{#consumes}}'{{mediaType}}'{{#hasMore}}, {{/hasMore}}{{/consumes}}]
38-
header_params['Content-Type'] = Swagger::Request.select_header_content_type(_header_content_type){{#headerParams}}{{#required}}
39-
header_params[:'{{{baseName}}}'] = {{{paramName}}}{{/required}}{{/headerParams}}{{#headerParams}}{{^required}}
40-
header_params[:'{{{baseName}}}'] = opts[:'{{{paramName}}}'] if opts[:'{{{paramName}}}']{{/required}}{{/headerParams}}
41-
42-
# form parameters
43-
form_params = {}{{#formParams}}{{#required}}
44-
form_params["{{baseName}}"] = {{paramName}}{{/required}}{{/formParams}}{{#formParams}}{{^required}}
45-
form_params["{{baseName}}"] = opts[:'{{paramName}}'] if opts[:'{{paramName}}']{{/required}}{{/formParams}}
46-
47-
# http body (model)
48-
{{^bodyParam}}post_body = nil
49-
{{/bodyParam}}{{#bodyParam}}post_body = Swagger::Request.object_to_http_body({{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}})
50-
{{/bodyParam}}
51-
52-
{{#returnType}}response = Swagger::Request.new(:{{httpMethod}}, path, {:params => query_params, :headers => header_params, :form_params => form_params, :body => post_body}).make.body
53-
{{#returnContainer}}response.map {|response| {{/returnContainer}}obj = {{returnBaseType}}.new() and obj.build_from_hash(response){{#returnContainer}} }{{/returnContainer}}{{/returnType}}{{^returnType}} Swagger::Request.new(:{{httpMethod}}, path, {:params => query_params,:headers => header_params, :form_params => form_params, :body => post_body}).make{{/returnType}}
10+
# {{summary}}
11+
# {{notes}}
12+
{{#allParams}}{{#required}} # @param {{paramName}} {{description}}
13+
{{/required}}{{/allParams}} # @param [Hash] opts the optional parameters
14+
{{#allParams}}{{^required}} # @option opts [{{dataType}}] :{{paramName}} {{description}}
15+
{{/required}}{{/allParams}} # @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}
16+
def self.{{nickname}}({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {})
17+
{{#allParams}}{{#required}}
18+
# verify the required parameter '{{paramName}}' is set
19+
raise "Missing the required parameter '{{paramName}}' when calling {{nickname}}" if {{{paramName}}}.nil?
20+
{{/required}}{{/allParams}}
21+
22+
# resource path
23+
path = "{{path}}".sub('{format}','json'){{#pathParams}}.sub('{' + '{{baseName}}' + '}', {{paramName}}.to_s){{/pathParams}}
24+
25+
# query parameters
26+
query_params = {}{{#queryParams}}{{#required}}
27+
query_params[:'{{{baseName}}}'] = {{{paramName}}}{{/required}}{{/queryParams}}{{#queryParams}}{{^required}}
28+
query_params[:'{{{baseName}}}'] = opts[:'{{{paramName}}}'] if opts[:'{{{paramName}}}']{{/required}}{{/queryParams}}
29+
30+
# header parameters
31+
header_params = {}
32+
33+
# HTTP header 'Accept' (if needed)
34+
_header_accept = [{{#produces}}'{{mediaType}}'{{#hasMore}}, {{/hasMore}}{{/produces}}]
35+
_header_accept_result = Swagger::Request.select_header_accept(_header_accept) and header_params['Accept'] = _header_accept_result
36+
37+
# HTTP header 'Content-Type'
38+
_header_content_type = [{{#consumes}}'{{mediaType}}'{{#hasMore}}, {{/hasMore}}{{/consumes}}]
39+
header_params['Content-Type'] = Swagger::Request.select_header_content_type(_header_content_type){{#headerParams}}{{#required}}
40+
header_params[:'{{{baseName}}}'] = {{{paramName}}}{{/required}}{{/headerParams}}{{#headerParams}}{{^required}}
41+
header_params[:'{{{baseName}}}'] = opts[:'{{{paramName}}}'] if opts[:'{{{paramName}}}']{{/required}}{{/headerParams}}
42+
43+
# form parameters
44+
form_params = {}{{#formParams}}{{#required}}
45+
form_params["{{baseName}}"] = {{paramName}}{{/required}}{{/formParams}}{{#formParams}}{{^required}}
46+
form_params["{{baseName}}"] = opts[:'{{paramName}}'] if opts[:'{{paramName}}']{{/required}}{{/formParams}}
47+
48+
# http body (model)
49+
{{^bodyParam}}post_body = nil
50+
{{/bodyParam}}{{#bodyParam}}post_body = Swagger::Request.object_to_http_body({{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}})
51+
{{/bodyParam}}
52+
53+
{{#returnType}}response = Swagger::Request.new(:{{httpMethod}}, path, {:params => query_params, :headers => header_params, :form_params => form_params, :body => post_body}).make.body
54+
{{#returnContainer}}response.map {|response| {{/returnContainer}}obj = {{returnBaseType}}.new() and obj.build_from_hash(response){{#returnContainer}} }{{/returnContainer}}{{/returnType}}{{^returnType}} Swagger::Request.new(:{{httpMethod}}, path, {:params => query_params,:headers => header_params, :form_params => form_params, :body => post_body}).make{{/returnType}}
5455
end
5556
{{/operation}}
56-
end
57+
end
5758
{{/operations}}
59+
end

0 commit comments

Comments
 (0)