swagger_yard 0.0.5 → 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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +126 -99
  3. data/Rakefile +6 -22
  4. data/lib/swagger_yard/api.rb +26 -109
  5. data/lib/swagger_yard/api_declaration.rb +89 -23
  6. data/lib/swagger_yard/authorization.rb +36 -0
  7. data/lib/swagger_yard/configuration.rb +14 -0
  8. data/lib/swagger_yard/listing_info.rb +15 -0
  9. data/lib/swagger_yard/model.rb +69 -0
  10. data/lib/swagger_yard/operation.rb +149 -0
  11. data/lib/swagger_yard/parameter.rb +62 -3
  12. data/lib/swagger_yard/property.rb +36 -0
  13. data/lib/swagger_yard/resource_listing.rb +57 -18
  14. data/lib/swagger_yard/type.rb +34 -0
  15. data/lib/swagger_yard/version.rb +1 -1
  16. data/lib/swagger_yard.rb +35 -78
  17. metadata +70 -48
  18. data/app/controllers/swagger_yard/application_controller.rb +0 -4
  19. data/app/controllers/swagger_yard/swagger_controller.rb +0 -21
  20. data/app/views/swagger_yard/swagger/doc.html.erb +0 -80
  21. data/lib/generators/swagger_yard/doc_generator.rb +0 -11
  22. data/lib/generators/swagger_yard/js_generator.rb +0 -13
  23. data/lib/swagger_yard/cache.rb +0 -50
  24. data/lib/swagger_yard/engine.rb +0 -18
  25. data/lib/swagger_yard/local_dispatcher.rb +0 -51
  26. data/lib/swagger_yard/parser.rb +0 -35
  27. data/public/swagger-ui/css/hightlight.default.css +0 -135
  28. data/public/swagger-ui/css/screen.css +0 -1759
  29. data/public/swagger-ui/images/logo_small.png +0 -0
  30. data/public/swagger-ui/images/pet_store_api.png +0 -0
  31. data/public/swagger-ui/images/throbber.gif +0 -0
  32. data/public/swagger-ui/images/wordnik_api.png +0 -0
  33. data/public/swagger-ui/lib/MD5.js +0 -319
  34. data/public/swagger-ui/lib/backbone-min.js +0 -38
  35. data/public/swagger-ui/lib/handlebars-1.0.rc.1.js +0 -1920
  36. data/public/swagger-ui/lib/highlight.7.3.pack.js +0 -1
  37. data/public/swagger-ui/lib/jquery-1.8.0.min.js +0 -2
  38. data/public/swagger-ui/lib/jquery.ba-bbq.min.js +0 -18
  39. data/public/swagger-ui/lib/jquery.slideto.min.js +0 -1
  40. data/public/swagger-ui/lib/jquery.wiggle.min.js +0 -8
  41. data/public/swagger-ui/lib/swagger.js +0 -794
  42. data/public/swagger-ui/lib/underscore-min.js +0 -32
  43. data/public/swagger-ui/swagger-ui.js +0 -2090
  44. data/public/swagger-ui/swagger-ui_org.js +0 -2005
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b7bdd63ad3c131a6f6d1a72c1c773a6b083dc13b
4
- data.tar.gz: e1e5bba9bf16d673fc157c20204b42d0f36c016b
3
+ metadata.gz: b6dfc1b55809fb818e9c2f1742a741ebbf72eb4d
4
+ data.tar.gz: cb8f8253cb95a55c04d6a9cd5b7488ae6d40b47c
5
5
  SHA512:
6
- metadata.gz: c2dfb163d06f32d74f097f87aebfffe1f4b6b905ee3475f88d825b05b05d6512127694723ffe273bf8d093ace6e0c5a04146b54e99e07f5f066176e4cd168e5e
7
- data.tar.gz: b8e6e42710336cd98347c547959b2380d42e3b55d85d2abee6f4fb3a6bd08391bc2855a75eafc0d265bbdd82a68eeaeaee3f7e5aaa27d0a21dcb934720a1ef84
6
+ metadata.gz: b2c1e0eb8a9461f39d3161f62592c8cdf817f0c1fa9a8d3b9fc8231a171ee30246eb84fb74be727ed1671fde7244d740d5e4b774e5f5d0334c913e15270b7182
7
+ data.tar.gz: d47a31030769ce82fb1a7cb5242899562c229ed023c3155f25be48fd5f91a9d8ab7f9c67587073d645a0958d9b3bec7dec2d23ca55b2cf5dcfcca2ce54d90c21
data/README.md CHANGED
@@ -1,15 +1,9 @@
1
- SwaggerYard
2
- ==================
3
-
4
- The SwaggerYard gem is a Rails Engine designed to parse your Yardocs API controller.
5
- It'll create a Swagger-UI complaint JSON to be served out through where you mount SwaggerYard.
6
- You can mount this to the Rails app serving the REST API or you could mount it as a separate Rails app.
7
- Parsing of the Yardocs happens during the server startup and the data will be subsequently cached to the Rails cache you have defined.
8
- If your API is large expect a slow server start up time.
9
-
10
- Installation
11
- -----------------
12
-
1
+ # SwaggerYard #
2
+
3
+ SwaggerYard is a gem to convert extended YARD syntax comments into the swagger spec compliant json format.
4
+
5
+ ## Installation ##
6
+
13
7
  Put SwaggerYard in your Gemfile:
14
8
 
15
9
  gem 'swagger_yard'
@@ -19,95 +13,128 @@ Install the gem with Bunder:
19
13
  bundle install
20
14
 
21
15
 
22
- Getting Started
23
- -----------------
16
+ ## Getting Started ##
17
+
18
+ ### Place your configuration in a your rails initializers ###
24
19
 
25
- Place your configuration in a your rails initializers
26
-
27
20
  # config/initializers/swagger_yard.rb
28
21
  SwaggerYard.configure do |config|
29
- config.swagger_version = "1.1"
30
- config.api_version = "0.1"
31
- config.doc_base_path = "http://swagger.example.com/doc"
32
- config.api_base_path = "http://swagger.example.com/api"
33
- end
34
-
35
- Mount your engine
36
-
37
- # config/routes.rb
38
- mount SwaggerYard::Engine, at: "/swagger"
39
-
40
-
41
- Example
42
- ----------------
43
-
44
- Here is a example of how to use SwaggerYard
45
-
46
-
47
- # @resource Account ownership
48
- #
49
- # @resource_path /accounts/ownerships
50
- #
51
- # This document describes the API for creating, reading, and deleting account ownerships.
52
- #
53
- class Accounts::OwnershipsController < ActionController::Base
54
- ##
55
- # Returns a list of ownerships associated with the account.
56
- #
57
- # @notes Status can be -1(Deleted), 0(Inactive), 1(Active), 2(Expired) and 3(Cancelled).
58
- #
59
- # @path [GET] /accounts/ownerships.{format_type}
60
- #
61
- # @parameter [Integer] offset Used for pagination of response data (default: 25 items per response). Specifies the offset of the next block of data to receive.
62
- # @parameter [Array] status Filter by status. (e.g. status[]=1&status[]=2&status[]=3).
63
- # @parameter_list [String] sort_order Orders response by fields. (e.g. sort_order=created_at).
64
- # [List] id
65
- # [List] begin_at
66
- # [List] end_at
67
- # [List] created_at
68
- # @parameter [Boolean] sort_descending Reverse order of sort_order sorting, make it descending.
69
- # @parameter [Date] begin_at_greater Filters response to include only items with begin_at >= specified timestamp (e.g. begin_at_greater=2012-02-15T02:06:56Z).
70
- # @parameter [Date] begin_at_less Filters response to include only items with begin_at <= specified timestamp (e.g. begin_at_less=2012-02-15T02:06:56Z).
71
- # @parameter [Date] end_at_greater Filters response to include only items with end_at >= specified timestamp (e.g. end_at_greater=2012-02-15T02:06:56Z).
72
- # @parameter [Date] end_at_less Filters response to include only items with end_at <= specified timestamp (e.g. end_at_less=2012-02-15T02:06:56Z).
73
- #
74
- def index
75
- ...
76
- end
22
+ config.swagger_version = "1.2"
23
+ config.api_version = "1.0"
24
+ config.reload = Rails.env.development?
25
+
26
+ # where your swagger spec json will show up
27
+ config.swagger_spec_base_path = "http://localhost:3000/swagger/api"
28
+ # where your actual api is hosted from
29
+ config.api_base_path = "http://localhost:3000/api"
77
30
  end
78
31
 
79
-
80
- ![Web UI](https://raw.github.com/synctv/swagger_yard/master/example/web-ui.png)
81
-
82
-
83
- Generators
84
- ----------------
85
-
86
- There are two generators that you can use
87
-
88
- rails g swagger_yard:ui
89
- rails g swagger_yard:js
90
-
91
- They both copy over their respective files over to your Rails app to be customized.
92
- See [rails engines overriding views](http://guides.rubyonrails.org/engines.html#overriding-views) for more info
93
-
94
- Copying over JS requires that ActionDispatch::Static middleware be used (by default it should in use).
95
-
96
-
97
- Notes
98
- -----------------
99
-
100
- By default SwaggerYard will use a slightly modify version of the swagger-ui. Changes to the JS code are indicated with "SwaggerYard changes" comments. The changes are mainly to support Rails way of supporting an array of parameters.
101
-
102
-
103
- More Information
104
- -----------------
105
-
106
- [Swagger-ui](https://github.com/wordnik/swagger-ui)
107
- [Yard](https://github.com/lsegal/yard)
108
-
109
-
110
- Author
111
- -----------------
112
-
113
- Chris Trinh
32
+ # register swagger tags with YARD
33
+ SwaggerYard.register_custom_yard_tags!
34
+
35
+ ## Example Documentation ##
36
+
37
+ ### Here is an example of how to use SwaggerYard in your Controller ###
38
+
39
+ **Note:** Model references should be Capitalized or CamelCased, basic types (integer, boolean, string, etc) should be lowercased everywhere.
40
+
41
+ ```ruby
42
+ # @resource Account ownership
43
+ #
44
+ # @resource_path /accounts/ownerships
45
+ #
46
+ # This document describes the API for creating, reading, and deleting account ownerships.
47
+ #
48
+ class Accounts::OwnershipsController < ActionController::Base
49
+ ##
50
+ # Returns a list of ownerships associated with the account.
51
+ #
52
+ # @notes Status can be -1(Deleted), 0(Inactive), 1(Active), 2(Expired) and 3(Cancelled).
53
+ #
54
+ # @path [GET] /accounts/ownerships.{format_type}
55
+ #
56
+ # @parameter offset [integer] Used for pagination of response data (default: 25 items per response). Specifies the offset of the next block of data to receive.
57
+ # @parameter status [array<string>] Filter by status. (e.g. status[]=1&status[]=2&status[]=3).
58
+ # @parameter_list [String] sort_order Orders response by fields. (e.g. sort_order=created_at).
59
+ # [List] id
60
+ # [List] begin_at
61
+ # [List] end_at
62
+ # [List] created_at
63
+ # @parameter sort_descending [boolean] Reverse order of sort_order sorting, make it descending.
64
+ # @parameter begin_at_greater [date] Filters response to include only items with begin_at >= specified timestamp (e.g. begin_at_greater=2012-02-15T02:06:56Z).
65
+ # @parameter begin_at_less [date] Filters response to include only items with begin_at <= specified timestamp (e.g. begin_at_less=2012-02-15T02:06:56Z).
66
+ # @parameter end_at_greater [date] Filters response to include only items with end_at >= specified timestamp (e.g. end_at_greater=2012-02-15T02:06:56Z).
67
+ # @parameter end_at_less [date] Filters response to include only items with end_at <= specified timestamp (e.g. end_at_less=2012-02-15T02:06:56Z).
68
+ #
69
+ def index
70
+ ...
71
+ end
72
+
73
+ ##
74
+ # Returns an ownership for an account by id
75
+ #
76
+ # @path [GET] /accounts/ownerships/{id}.{format_type}
77
+ # @response_type [Ownership]
78
+ # @error_message [EmptyOwnership] 404 Ownership not found
79
+ # @error_message 400 Invalid ID supplied
80
+ #
81
+ def show
82
+ ...
83
+ end
84
+ end
85
+ ```
86
+
87
+ ### Here is an example of how to use SwaggerYard in your Model ###
88
+
89
+ ```ruby
90
+ #
91
+ # @model Pet
92
+ #
93
+ # @property id(required) [integer] the identifier for the pet
94
+ # @property name [Array<string>] the names for the pet
95
+ # @property age [integer] the age of the pet
96
+ # @property relatives(required) [Array<Pet>] other Pets in its family
97
+ #
98
+ class Pet
99
+ end
100
+ ```
101
+
102
+ To then use your `Model` in your `Controller` documentation, add `@parameter`s:
103
+
104
+ ```ruby
105
+ # @parameter [Pet] pet The pet object
106
+ ```
107
+
108
+ ## Authorization ##
109
+
110
+ Currently, SwaggerYard only supports API Key auth descriptions. Start by adding `@authorization` to your `ApplicationController`.
111
+
112
+ ```ruby
113
+ #
114
+ # @authorization [api_key] header X-APPLICATION-API-KEY
115
+ #
116
+ class ApplicationController < ActionController::Base
117
+ end
118
+ ```
119
+
120
+ Then you can use these authorizations from your controller or actions in a controller. The name comes from either header or query plus the name of the key downcased/underscored.
121
+
122
+ ```ruby
123
+ #
124
+ # @authorize_with header_x_application_api_key
125
+ #
126
+ class PetController < ApplicationController
127
+ end
128
+ ```
129
+
130
+ ## UI ##
131
+
132
+ It is advisable to use something like [swagger-ui_rails](https://github.com/3scale/swagger-ui_rails/tree/dev-2.1.3) for your UI needs inside of Rails.
133
+
134
+ ## More Information ##
135
+
136
+ * [Swagger-ui](https://github.com/wordnik/swagger-ui)
137
+ * [swagger-ui_rails](https://github.com/3scale/swagger-ui_rails/tree/dev-2.1.3)
138
+ * [Yard](https://github.com/lsegal/yard)
139
+ * [Swagger-spec version 1.2](https://github.com/wordnik/swagger-spec/blob/master/versions/1.2.md)
140
+ * [Swagger-spec version 2.0](https://github.com/wordnik/swagger-spec/blob/master/versions/2.0.md)
data/Rakefile CHANGED
@@ -1,9 +1,6 @@
1
- #!/usr/bin/env rake
2
- begin
3
- require 'bundler/setup'
4
- rescue LoadError
5
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
- end
1
+ require 'bundler/setup'
2
+ require 'bundler/gem_tasks'
3
+
7
4
  begin
8
5
  require 'rdoc/task'
9
6
  rescue LoadError
@@ -20,21 +17,8 @@ RDoc::Task.new(:rdoc) do |rdoc|
20
17
  rdoc.rdoc_files.include('lib/**/*.rb')
21
18
  end
22
19
 
23
- APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
24
- load 'rails/tasks/engine.rake'
25
-
26
-
27
-
28
- Bundler::GemHelper.install_tasks
29
-
30
- require 'rake/testtask'
31
-
32
- Rake::TestTask.new(:test) do |t|
33
- t.libs << 'lib'
34
- t.libs << 'test'
35
- t.pattern = 'test/**/*_test.rb'
36
- t.verbose = false
37
- end
20
+ require 'rspec/core/rake_task'
38
21
 
22
+ RSpec::Core::RakeTask.new(:spec)
39
23
 
40
- task :default => :test
24
+ task :default => :spec
@@ -1,132 +1,49 @@
1
1
  module SwaggerYard
2
2
  class Api
3
- attr_reader :nickname
4
- attr_accessor :path, :parameters, :description, :http_method, :response_class, :summary, :notes, :error_responses
3
+ attr_accessor :path, :description
5
4
 
6
- def initialize(yard_object)
7
- @description = yard_object.docstring
8
- @parameters = []
9
-
10
- yard_object.tags.each do |tag|
11
- value = tag.text
12
-
13
- case tag.tag_name
14
- when "path"
15
- parse_path(value)
16
- when "parameter"
17
- @parameters << parse_parameter(value)
18
- when "parameter_list"
19
- @parameters << parse_parameter_list(value)
20
- when "summary"
21
- @summary = value
22
- when "notes"
23
- @notes = value.gsub("\n", "<br\>")
24
- end
5
+ def self.path_from_yard_object(yard_object)
6
+ if tag = yard_object.tags.detect {|t| t.tag_name == "path"}
7
+ tag.text
8
+ else
9
+ nil
25
10
  end
11
+ end
12
+
13
+ def self.from_yard_object(yard_object, api_declaration)
14
+ path = path_from_yard_object(yard_object)
15
+ description = yard_object.docstring
26
16
 
27
- @parameters.sort_by { |parameter| parameter["name"] }
28
- @parameters << add_format_parameters
17
+ new(path, description, api_declaration)
29
18
  end
30
19
 
31
- def nickname
32
- @nickname ||= "#{http_method}".camelize
20
+ def initialize(path, description, api_declaration)
21
+ @api_declaration = api_declaration
22
+ @description = description
23
+ @path = path
24
+
25
+ @operations = []
33
26
  end
34
27
 
35
- def operation
36
- {
37
- "httpMethod" => http_method,
38
- "nickname" => path[1..-1].gsub(/[^a-zA-Z\d:]/, '-').squeeze("-") + http_method.downcase,
39
- "responseClass" => response_class || "void",
40
- "produces" => ["application/json", "application/xml"],
41
- "parameters" => parameters,
42
- "summary" => summary || description,
43
- "notes" => notes,
44
- "errorResponses" => error_responses
45
- }
28
+ def add_operation(yard_object)
29
+ @operations << Operation.from_yard_object(yard_object, self)
46
30
  end
47
31
 
48
32
  def to_h
49
33
  {
50
34
  "path" => path,
51
35
  "description" => description,
52
- "operations" => [operation],
36
+ "operations" => @operations.map(&:to_h)
53
37
  }
54
38
  end
55
39
 
56
- def valid?
57
- path.present?
58
- end
59
-
60
- private
61
- ##
62
- # Example: [GET] /api/v2/ownerships.{format_type}
63
- def parse_path(string)
64
- @http_method, @path = string.match(/^\[(\w*)\]\s*(.*)$/).captures
65
-
66
- path_params = @path.scan(/\{([^\}]+)\}/).flatten.reject { |value| value == "format_type" }
67
-
68
- path_params.each do |path_param|
69
- @parameters << {
70
- "paramType" => "path",
71
- "name" => path_param,
72
- "description" => "Scope response to #{path_param}",
73
- "dataType" => "string",
74
- "required" => true,
75
- "allowMultiple" => false
76
- }
77
- end
40
+ def model_names
41
+ @operations.map(&:model_names).flatten.compact.uniq
42
+ # @parameters.select {|p| ref?(p['type'])}.map {|p| p['type']}.uniq
78
43
  end
79
44
 
80
- ##
81
- # Example: [Array] status Filter by status. (e.g. status[]=1&status[]=2&status[]=3)
82
- # Example: [Array] status(required) Filter by status. (e.g. status[]=1&status[]=2&status[]=3)
83
- # Example: [Integer] media[media_type_id] ID of the desired media type.
84
- def parse_parameter(string)
85
- data_type, name, required, description = string.match(/\A\[(\w*)\]\s*([\w\[\]]*)(\(required\))?\s*(.*)\Z/).captures
86
- allow_multiple = name.gsub!("[]", "")
87
-
88
- parameter = {
89
- "paramType" => "query",
90
- "name" => name,
91
- "description" => description,
92
- "dataType" => data_type.downcase,
93
- "required" => required.present?,
94
- "allowMultiple" => allow_multiple.present?
95
- }
96
- end
97
-
98
- ##
99
- # Example: [String] sort_order Orders ownerships by fields. (e.g. sort_order=created_at)
100
- # [List] id
101
- # [List] begin_at
102
- # [List] end_at
103
- # [List] created_at
104
- def parse_parameter_list(string)
105
- data_type, name, required, description, set_string = string.match(/\A\[(\w*)\]\s*(\w*)(\(required\))?\s*(.*)\n([.\s\S]*)\Z/).captures
106
-
107
- list_values = set_string.split("[List]").map(&:strip).reject { |string| string.empty? }
108
-
109
- parameter = {
110
- "paramType" => "query",
111
- "name" => name,
112
- "description" => description,
113
- "dataType" => data_type.downcase,
114
- "required" => required.present?,
115
- "allowMultiple" => false,
116
- "allowableValues" => {"valueType" => 'LIST', "values" => list_values}
117
- }
118
- end
119
-
120
- def add_format_parameters
121
- @add_format_parameters ||= {
122
- "paramType" => "path",
123
- "name" => "format_type",
124
- "description" => "Response format either JSON or XML",
125
- "dataType" => "string",
126
- "required" => true,
127
- "allowMultiple" => false,
128
- "allowableValues" => {"valueType" => "LIST", "values" => ["json", "xml"]}
129
- }
45
+ def ref?(data_type)
46
+ @api_declaration.ref?(data_type)
130
47
  end
131
48
  end
132
49
  end
@@ -1,42 +1,108 @@
1
1
  module SwaggerYard
2
2
  class ApiDeclaration
3
3
  attr_accessor :description, :resource_path
4
+ attr_reader :apis, :authorizations
5
+
6
+ def initialize(resource_listing)
7
+ @resource_listing = resource_listing
4
8
 
5
- def initialize
6
9
  @apis = {}
7
- @models = []
10
+ @authorizations = {}
11
+ end
12
+
13
+ def valid?
14
+ !@resource_path.nil?
15
+ end
16
+
17
+ def add_yard_objects(yard_objects)
18
+ yard_objects.each do |yard_object|
19
+ add_yard_object(yard_object)
20
+ end
21
+ self
22
+ end
23
+
24
+ def add_yard_object(yard_object)
25
+ case yard_object.type
26
+ when :class
27
+ add_listing_info(ListingInfo.new(yard_object))
28
+ add_authorizations_to_resource_listing(yard_object)
29
+ when :method
30
+ add_api(yard_object)
31
+ end
8
32
  end
9
33
 
10
- def add_listing_info(yard_object)
11
- @description = yard_object.docstring if yard_object.docstring.present?
12
- tag = yard_object.tags.find { |tag| tag.tag_name == "resource_path"}
13
- @resource_path = tag.text.downcase if tag.present?
14
- tag.present?
34
+ def add_listing_info(listing_info)
35
+ @description = listing_info.description
36
+ @resource_path = listing_info.resource_path
37
+
38
+ # we only have api_key auth, the value for now is always empty array
39
+ @authorizations = Hash[listing_info.authorizations.uniq.map {|k| [k, []]}]
15
40
  end
16
41
 
17
- def add_api(api)
18
- if @apis.keys.include?(api.path)
19
- same_api_path = @apis[api.path]
20
- same_api_path["operations"] << api.operation
21
- @apis[api.path] = same_api_path
22
- else
23
- @apis[api.path] = api.to_h
24
- end
42
+ def add_api(yard_object)
43
+ path = Api.path_from_yard_object(yard_object)
44
+
45
+ return if path.nil?
46
+
47
+ api = (apis[path] ||= Api.from_yard_object(yard_object, self))
48
+ api.add_operation(yard_object)
49
+ end
50
+
51
+ # HACK, requires knowledge of resource_listing
52
+ def add_authorizations_to_resource_listing(yard_object)
53
+ yard_object.tags.select {|t| t.tag_name == "authorization"}.each do |t|
54
+ @resource_listing.authorizations << Authorization.from_yard_object(t)
55
+ end
25
56
  end
26
57
 
27
58
  def resource_name
28
59
  @resource_path
29
60
  end
30
61
 
62
+ def models
63
+ (api_models + property_models).uniq
64
+ end
65
+
66
+ def ref?(name)
67
+ @resource_listing.models.map(&:id).include?(name)
68
+ end
69
+
31
70
  def to_h
32
- {
33
- "apiVersion" => SwaggerYard.api_version,
34
- "swaggerVersion" => SwaggerYard.swagger_version,
35
- "basePath" => SwaggerYard.api_base_path,
36
- "resource_path" => @resource_path,
37
- "apis" => @apis.values,
38
- "models" => @models
71
+ {
72
+ "apiVersion" => SwaggerYard.config.api_version,
73
+ "swaggerVersion" => SwaggerYard.config.swagger_version,
74
+ "basePath" => SwaggerYard.config.api_base_path,
75
+ "resourcePath" => resource_path,
76
+ "apis" => apis.values.map(&:to_h),
77
+ "models" => Hash[models.map {|m| [m.id, m.to_h]}],
78
+ "authorizations" => authorizations
39
79
  }
40
80
  end
81
+
82
+ def listing_hash
83
+ {
84
+ "path" => resource_path,
85
+ "description" => description
86
+ }
87
+ end
88
+
89
+ private
90
+ def model_names_from_apis
91
+ apis.values.map(&:model_names).flatten.uniq
92
+ end
93
+
94
+ # models selected by the names of models referenced in APIs
95
+ def api_models
96
+ @resource_listing.models.select {|m| model_names_from_apis.include?(m.id)}
97
+ end
98
+
99
+ def model_names_from_model_properties
100
+ api_models.map{|model| model.recursive_properties_model_names(@resource_listing.models) }.flatten.uniq
101
+ end
102
+
103
+ # models selected by names used in properties in models used in APIs
104
+ def property_models
105
+ @resource_listing.models.select {|m| model_names_from_model_properties.include?(m.id)}
106
+ end
41
107
  end
42
- end
108
+ end
@@ -0,0 +1,36 @@
1
+ module SwaggerYard
2
+ class Authorization
3
+ attr_reader :pass_as, :key
4
+ attr_writer :name
5
+
6
+ def self.from_yard_object(yard_object)
7
+ new(yard_object.types.first, yard_object.name, yard_object.text)
8
+ end
9
+
10
+ def initialize(type, pass_as, key)
11
+ @type, @pass_as, @key = type, pass_as, key
12
+ end
13
+
14
+ # the spec suggests most auth names are just the type of auth
15
+ def name
16
+ @name ||= [@pass_as, @key].join('_').downcase.gsub('-', '_')
17
+ end
18
+
19
+ def type
20
+ case @type
21
+ when "api_key"
22
+ "apiKey"
23
+ when "basic_auth"
24
+ "basicAuth"
25
+ end
26
+ end
27
+
28
+ def to_h
29
+ {
30
+ "type" => type,
31
+ "passAs" => @pass_as,
32
+ "keyname" => @key
33
+ }
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,14 @@
1
+ module SwaggerYard
2
+ class Configuration
3
+ attr_accessor :swagger_spec_base_path, :api_base_path, :api_path
4
+ attr_accessor :swagger_version, :api_version
5
+ attr_accessor :enable, :reload
6
+
7
+ def initialize
8
+ self.swagger_version = "1.1"
9
+ self.api_version = "0.1"
10
+ self.enable = false
11
+ self.reload = true
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ module SwaggerYard
2
+ class ListingInfo
3
+ attr_reader :description, :resource_path, :authorizations
4
+
5
+ def initialize(yard_object)
6
+ @description = yard_object.docstring
7
+
8
+ if tag = yard_object.tags.detect {|t| t.tag_name == "resource_path"}
9
+ @resource_path = tag.text.downcase
10
+ end
11
+
12
+ @authorizations = yard_object.tags.select {|t| t.tag_name == "authorize_with"}.map(&:text)
13
+ end
14
+ end
15
+ end