swagger_yard 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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