grape-apiary 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f0254ff34136f5e9ec9dd020fc5de5f223ba4a82
4
- data.tar.gz: 1b3955dc1d5fcd60451f702aa82e8f00dee139d2
3
+ metadata.gz: af6793664c67c149446b22cc641327ae4befe6b3
4
+ data.tar.gz: 8dc668050c54078a9c011b59a3d0ee41928ae3a5
5
5
  SHA512:
6
- metadata.gz: 48f420f9bc8cca9a22b3cd71523c1892d76972e34502dd64bd4368506af938dc21f199895dc32f5dff06e0b94a752ed6acccd6fddb9c08ffcdd19a3c6960a272
7
- data.tar.gz: 58e25392ce55c0c35b022dbb41abf58dfffdb5363c800eb7fa8c29004d53eb585f99f7a2a013853026ae5eb3540d3f336d36f6c793a24d2c6625bb79edcb9c42
6
+ metadata.gz: 31e332776b5469706fc694d0310222c842b474b699fe065a56c51673e6e7ab5919480d666218984a595cfd43113a5616e52188a58b6908837035a97aced82f2b
7
+ data.tar.gz: ff66609f82ed054e6e9e7eb26c7f301cb63296ffe3f41931f4efa050557af2109fbecdc9ff7a0cfe3f44207981ee8f7003ae3156260a0d5199b06c112f9d386e
data/.rubocop.yml CHANGED
@@ -1,8 +1,8 @@
1
1
  AllCops:
2
2
  Excludes:
3
3
  - Rakefile
4
- - vendor/**
5
- - bin/**
4
+ - vendor/**/*
5
+ - bin/**/
6
6
 
7
7
  Documentation:
8
8
  # don't require classes to be documented
@@ -12,7 +12,37 @@ Encoding:
12
12
  # no need to always specify encoding
13
13
  Enabled: false
14
14
 
15
- LineLength:
16
- # just one more character please
17
- Max: 80
15
+ AlignParameters:
16
+ # allow for multi-line methods to have normal indentation.
17
+ # for example:
18
+ #
19
+ # Person.where(
20
+ # first_name: 'tom',
21
+ # last_name: 'foolery'
22
+ # )
23
+ EnforcedStyle: with_fixed_indentation
18
24
 
25
+ Style/AlignParameters:
26
+ # allow for end of if to be aligned with a variable.
27
+ # for example:
28
+ #
29
+ # foo = if a == b
30
+ # 'bar'
31
+ # else
32
+ # 'baz'
33
+ # end
34
+ EnforcedStyle: with_fixed_indentation
35
+
36
+ Style/ElseAlignment:
37
+ Enabled: false
38
+
39
+ Lint/EndAlignment:
40
+ AlignWith: variable
41
+
42
+ ClassAndModuleChildren:
43
+ # ok to use compact style when modules are predefined.
44
+ # for example the following is fine so long as we're sure that
45
+ # module MDB has already been required/defined.
46
+ #
47
+ # class Foo::Bar; end
48
+ Enabled: false
data/.travis.yml CHANGED
@@ -1,9 +1,9 @@
1
1
  language: ruby
2
2
  cache: bundler
3
3
  rvm:
4
- - 2.1.0
5
- - 2.0.0
6
- - 1.9.3
4
+ - 2.3.0
5
+ - 2.2.4
6
+ - 2.1.8
7
7
  - jruby
8
8
  addons:
9
9
  code_climate:
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+ This project adheres to [Semantic Versioning](http://semver.org/).
4
+
5
+ ## 0.1.0 (2016-01-25)
6
+ #### Features
7
+ - [PR #5](https://github.com/technekes/grape-apiary/pull/5) - Rake task persists docs to disk from [@bigfleet](https://github.com/bigfleet).
8
+
9
+ ## 0.0.1 - 0.0.4 (2014-02-10)
10
+ #### Features
11
+ - Initial implementation from [@jallen3d](https://github.com/johnallen3d).
data/Gemfile CHANGED
@@ -2,17 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in grape-apiary.gemspec
4
4
  gemspec
5
-
6
- gem 'grape', github: 'intridea/grape'
7
-
8
- group :development, :test do
9
- gem 'coveralls', '~> 0.7'
10
- gem 'rspec', '~> 2.14'
11
- gem 'bundler', '~> 1.5'
12
- gem 'rake', '~> 10.0'
13
- gem 'rubocop', '~> 0.18'
14
- gem 'pry', '~> 0.9'
15
- gem 'guard', '~> 2.4'
16
- gem 'guard-rspec', '~> 4.2'
17
- gem 'guard-bundler', '~> 2.0'
18
- end
data/Guardfile CHANGED
@@ -1,9 +1,9 @@
1
1
  # More info at https://github.com/guard/guard#readme
2
2
 
3
- guard 'rspec', :version => 2 do
3
+ guard 'rspec', version: 2 do
4
4
  watch(%r{^spec/.+_spec\.rb$})
5
5
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
6
- watch('spec/spec_helper.rb') { "spec/" }
6
+ watch('spec/spec_helper.rb') { 'spec/' }
7
7
  end
8
8
 
9
9
  guard 'bundler' do
data/README.md CHANGED
@@ -1,22 +1,18 @@
1
1
  # GrapeApiary
2
2
 
3
- [![Code Climate](https://codeclimate.com/github/connexio-labs/grape-apiary.png)](https://codeclimate.com/github/connexio-labs/grape-apiary)
4
- [![Build Status](https://travis-ci.org/connexio-labs/grape-apiary.png?branch=master)](https://travis-ci.org/connexio-labs/grape-apiary)
5
- [![Coverage Status](https://coveralls.io/repos/connexio-labs/grape-apiary/badge.png)](https://coveralls.io/r/connexio-labs/grape-apiary)
6
- [![Dependency Status](https://gemnasium.com/connexio-labs/grape-apiary.png)](https://gemnasium.com/connexio-labs/grape-apiary)
3
+ [![Code Climate](https://codeclimate.com/github/technekes/grape-apiary.png)](https://codeclimate.com/github/connexio-labs/grape-apiary)
4
+ [![Build Status](https://travis-ci.org/technekes/grape-apiary.png?branch=master)](https://travis-ci.org/connexio-labs/grape-apiary)
5
+ [![Coverage Status](https://coveralls.io/repos/technekes/grape-apiary/badge.png)](https://coveralls.io/r/connexio-labs/grape-apiary)
6
+ [![Dependency Status](https://gemnasium.com/technekes/grape-apiary.png)](https://gemnasium.com/connexio-labs/grape-apiary)
7
7
  [![Gem Version](https://badge.fury.io/rb/grape-apiary.png)](http://badge.fury.io/rb/grape-apiary)
8
8
 
9
- Auto generates an [Apiary Blueprint](http://apiary.io) from the docuementation that is created by your [Grape](https://github.com/intridea/grape) API.
10
-
11
- ### NOTE
12
-
13
- This is an early implementation that makes some assumptions about your API (follows a standard REST pattern) that works with our implementation of Grape API's. There is a new an [unreleased feature in Grape](https://github.com/intridea/grape#parameter-documentation) that allows for appending additional documentation. This project is dependent on this feature in order to create example JSON requests and responses.
9
+ Auto generates an [Apiary Blueprint](http://apiary.io) from the docuementation that is created by your [Grape](https://github.com/ruby-grape/grape) API.
14
10
 
15
11
  ## Installation
16
12
 
17
13
  Add this line to your application's Gemfile:
18
14
 
19
- gem 'grape', github: 'intridea/grape' # see note above
15
+ gem 'grape'
20
16
  gem 'grape-apiary'
21
17
 
22
18
  And then execute:
@@ -27,10 +23,25 @@ Or install it yourself as:
27
23
 
28
24
  $ gem install grape-apiary
29
25
 
26
+ In order to use the Rake task that can write your generated documents to the filesystem, add this
27
+ stanza to your `Rakefile`:
28
+
29
+ ```
30
+ spec = Gem::Specification.find_by_name 'grape-apiary'
31
+ load "#{spec.gem_dir}/lib/grape-apiary/tasks/grape-apiary.rake"
32
+ ```
33
+
30
34
  ## Usage
31
35
 
32
36
  Add some metadata about your API and then execute the `generate` method on the `GrapeApiary::Blueprint` class.
33
37
 
38
+ If you have installed the Rake task, per above, you can write your
39
+ documentation to `docs/grape-apiary.md` with this command:
40
+
41
+ ```
42
+ API=AwesomeAPI bundle exec rake ga:docs
43
+ ```
44
+
34
45
  ### Configuration
35
46
 
36
47
  Configure details about your api in an initializers or similar:
@@ -47,6 +58,8 @@ GrapeApiary.config do |config|
47
58
  config.example_id_type = :uuid
48
59
  # resources you do not want documented
49
60
  config.resource_exclusion = [:admin, :swagger_doc]
61
+ # whether or not examples should include a root element (default: false)
62
+ config.include_root = true
50
63
  end
51
64
 
52
65
  # request headers you want documented
@@ -71,16 +84,16 @@ GrapeApiary::Blueprint.new(AwesomeAPI).generate
71
84
 
72
85
  ## TODO
73
86
 
74
- * Add a rake task to simplify generation
75
- * Add support for listing all of a resources attributes at the resource level as a markdown table
87
+ * ~~Add support for listing all of a resources attributes at the resource level as a markdown table~~
76
88
  * Handle ever changing sample id's (don't want git diff's after every generation)
77
89
  * Add option to change or remove the sample id field (eg. `_id` vs `id`)
78
90
  * What if someone does not use JSON?!?
79
- * Creat sample response for list endpoints (array)
91
+ * ~~Create sample response for list endpoints (array)~~
92
+ * Add an option to include root in json
80
93
 
81
94
  ## Contributing
82
95
 
83
- 1. Fork it ( http://github.com/<my-github-username>/grape-apiary/fork )
96
+ 1. Fork it ( http://github.com/technekes/grape-apiary/fork )
84
97
  2. Create your feature branch (`git checkout -b my-new-feature`)
85
98
  3. Commit your changes (`git commit -am 'Add some feature'`)
86
99
  4. Push to the branch (`git push origin my-new-feature`)
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ end
11
11
 
12
12
  require 'rainbow/ext/string' unless String.respond_to?(:color)
13
13
  require 'rubocop/rake_task'
14
- Rubocop::RakeTask.new(:rubocop)
14
+ RuboCop::RakeTask.new(:rubocop)
15
15
 
16
16
  task default: [:rubocop, :spec]
17
17
 
data/bin/grape-apiary ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rake'
3
+ require 'bundler'
4
+
5
+ raise "Bundler is required. Please install bundler with 'gem install bundler'" unless defined?(Bundler)
6
+
7
+ #
8
+ # Example:
9
+ #
10
+ # grape-apiary grape:docs
11
+
12
+ # init dependencies
13
+ Bundler.setup
14
+
15
+ # init rake
16
+ Rake.application.init
17
+
18
+ # load the rake tasks
19
+ gem_dir = File.expand_path('..',File.dirname(__FILE__))
20
+ load "#{gem_dir}/lib/grape-apiary/tasks/grape-apiary.rake"
21
+
22
+ # invoke the given task
23
+ Rake.application.invoke_task(ARGV[0])
data/grape-apiary.gemspec CHANGED
@@ -8,9 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = GrapeApiary::VERSION
9
9
  spec.authors = ['John Allen']
10
10
  spec.email = ['john@threedogconsulting.com']
11
- spec.summary = %q{Allows for generating an Apiary Blueprint for you Grape API}
12
- spec.description = %q{Auto generates an Apiary (http://apiary.io) Blueprint from the docuementation that is created by your Grape API}
13
- spec.homepage = 'https://github.com/connexio-labs/grape-apiary'
11
+ spec.homepage = 'https://github.com/technekes/grape-apiary'
14
12
  spec.license = 'MIT'
15
13
 
16
14
  spec.files = `git ls-files -z`.split("\x0")
@@ -18,13 +16,23 @@ Gem::Specification.new do |spec|
18
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
17
  spec.require_paths = ['lib']
20
18
 
21
- spec.add_runtime_dependency 'grape', '~> 0.6'
19
+ spec.summary = <<-SUMMARY
20
+ Allows for generating an Apiary Blueprint for you Grape API
21
+ SUMMARY
22
+
23
+ spec.description = <<-DESCRIPTION
24
+ Auto generates an Apiary (http://apiary.io) Blueprint from the
25
+ docuementation that is created by your Grape API
26
+ DESCRIPTION
27
+
28
+ spec.add_runtime_dependency 'grape', '~> 0.14'
29
+ spec.add_runtime_dependency 'activesupport'
22
30
 
23
31
  spec.add_development_dependency 'coveralls', '~> 0.7'
24
32
  spec.add_development_dependency 'rspec', '~> 2.14'
25
33
  spec.add_development_dependency 'bundler', '~> 1.5'
26
34
  spec.add_development_dependency 'rake', '~> 10.0'
27
- spec.add_development_dependency 'rubocop', '~> 0.18'
35
+ spec.add_development_dependency 'rubocop', '~> 0.36'
28
36
  spec.add_development_dependency 'pry', '~> 0.9'
29
37
  spec.add_development_dependency 'guard', '~> 2.4'
30
38
  spec.add_development_dependency 'guard-rspec', '~> 4.2'
data/lib/grape-apiary.rb CHANGED
@@ -1,16 +1,16 @@
1
+ require 'active_support/all' # rubocop:disable Style/FileName
1
2
  require 'grape'
2
- require 'grape-apiary/version'
3
- require 'grape-apiary/config'
4
- require 'grape-apiary/parameter'
5
- require 'grape-apiary/sample_generator'
6
- require 'grape-apiary/route'
7
- require 'grape-apiary/resource'
8
- require 'grape-apiary/blueprint'
9
3
 
10
4
  module GrapeApiary
11
- module_function
5
+ autoload :Version, 'grape-apiary/version'
6
+ autoload :Config, 'grape-apiary/config'
7
+ autoload :Parameter, 'grape-apiary/parameter'
8
+ autoload :SampleGenerator, 'grape-apiary/sample_generator'
9
+ autoload :Route, 'grape-apiary/route'
10
+ autoload :Resource, 'grape-apiary/resource'
11
+ autoload :Blueprint, 'grape-apiary/blueprint'
12
12
 
13
- def config
13
+ def self.config
14
14
  block_given? ? yield(Config) : Config
15
15
  end
16
16
  end
@@ -1,30 +1,23 @@
1
1
  module GrapeApiary
2
2
  class Blueprint
3
- attr_reader :api_class, :template
3
+ attr_reader :api_class, :blueprint_template, :properties_template
4
4
 
5
5
  delegate(*GrapeApiary::Config::SETTINGS, to: 'GrapeApiary::Config')
6
6
 
7
7
  def initialize(api_class)
8
- @api_class = api_class
8
+ @api_class = api_class
9
+ @blueprint_template = template_for(:blueprint)
10
+ @properties_template = template_for(:properties)
9
11
  end
10
12
 
11
13
  def generate
12
- ERB.new(template).result(binding)
14
+ ERB.new(blueprint_template, nil, '-').result(binding)
13
15
  end
14
16
 
15
17
  def write
16
18
  fail 'Not yet supported'
17
19
  end
18
20
 
19
- def template
20
- @template ||= begin
21
- directory = File.dirname(File.expand_path(__FILE__))
22
- path = File.join(directory, './templates/blueprint.md.erb')
23
-
24
- File.read(path)
25
- end
26
- end
27
-
28
21
  def routes
29
22
  @routes ||= api_class.routes.map do |route|
30
23
  GrapeApiary::Route.new(route)
@@ -33,7 +26,7 @@ module GrapeApiary
33
26
 
34
27
  def resources
35
28
  @resources ||= begin
36
- grouped_routes = routes.group_by(&:route_name).reject do |name, routes|
29
+ grouped_routes = routes.group_by(&:route_name).reject do |name, _|
37
30
  resource_exclusion.include?(name.to_sym)
38
31
  end
39
32
 
@@ -41,6 +34,10 @@ module GrapeApiary
41
34
  end
42
35
  end
43
36
 
37
+ def properties_table(resource)
38
+ ERB.new(properties_template, nil, '-').result(resource.resource_binding)
39
+ end
40
+
44
41
  def formatted_request_headers
45
42
  formatted_headers(GrapeApiary::Config.request_headers)
46
43
  end
@@ -53,12 +50,15 @@ module GrapeApiary
53
50
  %w(PUT POST).include?(route.route_method)
54
51
  end
55
52
 
56
- def routes_binding
57
- binding
58
- end
59
-
60
53
  private
61
54
 
55
+ def template_for(name)
56
+ directory = File.dirname(File.expand_path(__FILE__))
57
+ path = File.join(directory, "./templates/#{name}.md.erb")
58
+
59
+ File.read(path)
60
+ end
61
+
62
62
  def formatted_headers(headers)
63
63
  return '' unless headers.present?
64
64
 
@@ -7,8 +7,9 @@ module GrapeApiary
7
7
  :request_headers,
8
8
  :response_headers,
9
9
  :example_id_type,
10
- :resource_exclusion
11
- ]
10
+ :resource_exclusion,
11
+ :include_root
12
+ ].freeze
12
13
 
13
14
  class << self
14
15
  attr_accessor(*SETTINGS)
@@ -25,6 +26,10 @@ module GrapeApiary
25
26
  @resource_exclusion ||= []
26
27
  end
27
28
 
29
+ def include_root
30
+ @include_root ||= false
31
+ end
32
+
28
33
  def supported_id_types
29
34
  [:integer, :uuid, :bson]
30
35
  end
@@ -1,16 +1,17 @@
1
1
  module GrapeApiary
2
2
  class Parameter
3
- attr_reader :route, :name, :settings
3
+ attr_reader :route, :full_name, :name, :settings
4
4
 
5
5
  delegate :route_model, :route_namespace, to: :route
6
6
  delegate :requirement, :type, :documentation, :desc, to: :settings
7
7
  delegate :example, to: :documentation, allow_nil: true
8
8
 
9
9
  def initialize(route, name, options)
10
- @route = route
11
- @name = name
12
- @name = name.scan(/\[(.*)\]/).flatten.first if name.include?('[')
13
- @settings = parse_options(options)
10
+ @full_name = name
11
+ @name = name
12
+ @name = name.scan(/\[(.*)\]/).flatten.first if name.include?('[')
13
+ @route = route
14
+ @settings = parse_options(options)
14
15
  end
15
16
 
16
17
  def description
@@ -20,14 +21,14 @@ module GrapeApiary
20
21
  private
21
22
 
22
23
  def parse_options(options)
23
- options = default_options(options) if options.blank?
24
+ options = default_options if options.blank?
24
25
 
25
26
  options[:requirement] = options[:required] ? 'required' : 'optional'
26
27
 
27
28
  Hashie::Mash.new(options)
28
29
  end
29
30
 
30
- def default_options(options)
31
+ def default_options
31
32
  model = name.include?('_id') ? name.gsub('_id', '') : route.route_model
32
33
 
33
34
  {
@@ -20,7 +20,7 @@ module GrapeApiary
20
20
  end
21
21
 
22
22
  def paths
23
- @paths ||= routes.group_by(&:route_path_without_format).map do |n, routes|
23
+ @paths ||= routes.group_by(&:route_path_without_format).map do |_, routes|
24
24
  Resource.new(name, routes)
25
25
  end
26
26
  end
@@ -36,8 +36,8 @@ module GrapeApiary
36
36
  sample_generator.request
37
37
  end
38
38
 
39
- def sample_response
40
- sample_generator.response
39
+ def sample_response(route)
40
+ sample_generator.response(route.list?)
41
41
  end
42
42
 
43
43
  def unique_params
@@ -55,5 +55,9 @@ module GrapeApiary
55
55
  []
56
56
  end
57
57
  end
58
+
59
+ def resource_binding
60
+ binding
61
+ end
58
62
  end
59
63
  end
@@ -5,7 +5,7 @@ module GrapeApiary
5
5
  delegate :route_namespace, :route_path, :route_method, to: '__getobj__'
6
6
 
7
7
  def route_params
8
- @route_params ||= __getobj__.route_params.map do |param|
8
+ @route_params ||= __getobj__.route_params.sort.map do |param|
9
9
  Parameter.new(self, *param)
10
10
  end
11
11
  end
@@ -41,12 +41,12 @@ module GrapeApiary
41
41
  "+ Response #{code} (application/json)"
42
42
  end
43
43
 
44
- private
45
-
46
44
  def list?
47
- route_method == 'GET' && !route_path.include?(':id')
45
+ %w(GET POST).include?(route_method) && !route_path.include?(':id')
48
46
  end
49
47
 
48
+ private
49
+
50
50
  def request_body?
51
51
  !%w(GET DELETE).include?(route_method)
52
52
  end
@@ -1,46 +1,60 @@
1
1
  module GrapeApiary
2
2
  class SampleGenerator
3
- attr_reader :resource
3
+ attr_reader :resource, :root
4
4
 
5
5
  delegate :unique_params, to: :resource
6
6
 
7
7
  def initialize(resource)
8
8
  @resource = resource
9
+ @root = resource.key.singularize
9
10
  end
10
11
 
11
- def sample
12
- @sample ||= begin
13
- array = resource.unique_params.map do |resource|
14
- [resource.name, resource.example]
15
- end
12
+ def sample(id = false)
13
+ array = resource.unique_params.map do |param|
14
+ next if param.name == root
16
15
 
17
- Hash[array]
16
+ [param.name, param.example]
18
17
  end
18
+
19
+ hash = Hash[array.compact]
20
+
21
+ hash = hash.reverse_merge(id: Config.generate_id) if id
22
+ hash = { root => hash } if Config.include_root
23
+
24
+ hash
19
25
  end
20
26
 
21
27
  def request
22
- return unless sample.present?
28
+ hash = sample
29
+
30
+ return unless hash.present?
23
31
 
24
32
  # format json spaces for blueprint markdown
25
- JSON.pretty_generate(sample)
33
+ JSON
34
+ .pretty_generate(hash)
26
35
  .gsub('{', (' ' * 14) + '{')
27
36
  .gsub('}', (' ' * 14) + '}')
28
37
  .gsub(/\ {2}\"/, (' ' * 16) + '"')
29
38
  end
30
39
 
31
- def response
32
- return unless sample.present?
40
+ def response(list = false)
41
+ return unless (hash = sample(true)).present?
33
42
 
34
- hash = sample.reverse_merge(id: GrapeApiary::Config.generate_id)
35
- # sample = [sample] if list?(route)
43
+ pretty_response_for(list ? [hash] : hash)
44
+ end
36
45
 
37
- # format json spaces for blueprint markdown
38
- JSON.pretty_generate(hash)
46
+ private
47
+
48
+ # rubocop:disable Metrics/AbcSize
49
+ def pretty_response_for(hash)
50
+ JSON
51
+ .pretty_generate(hash)
39
52
  .gsub('[', (' ' * 12) + '[')
40
53
  .gsub(']', (' ' * 12) + ']')
41
54
  .gsub('{', (' ' * 14) + '{')
42
55
  .gsub('}', (' ' * 14) + '}')
43
56
  .gsub(/\ {2}\"/, (' ' * 16) + '"')
44
57
  end
58
+ # rubocop:enable Metrics/AbcSize
45
59
  end
46
60
  end
@@ -0,0 +1,15 @@
1
+ namespace :ga do
2
+ desc 'Produce documentation'
3
+ task docs: :environment do
4
+ api = ENV['API'] || ARGV[1]
5
+ fail 'You must provide the name of an API to document' if api.nil?
6
+ begin
7
+ api_class = Object.const_get(api)
8
+ api_docs = GrapeApiary::Blueprint.new(api_class).generate
9
+ output_file = 'docs/grape-apiary.md'
10
+ File.open(output_file, 'w') { |file| file.write(api_docs) }
11
+ rescue NameError
12
+ raise "#{api} has not been defined as a Grape API"
13
+ end
14
+ end
15
+ end
@@ -6,9 +6,10 @@ HOST: <%= host %>
6
6
 
7
7
  <% resources.each do |resource| %>
8
8
  # Group <%= resource.title %>
9
+ <%= properties_table(resource) %>
9
10
  <% resource.namespaced.each do |grouped_resource| %>
10
11
  <% grouped_resource.paths.each do |resource_by_path| %>
11
- ## <%= resource.header %>
12
+ ## <%= resource_by_path.header %>
12
13
  Actions on the <%= resource.name %> resource
13
14
  <% if resource_by_path.routes.first.route_params.present? %>
14
15
  + Parameters
@@ -30,7 +31,7 @@ Actions on the <%= resource.name %> resource
30
31
 
31
32
  + Body
32
33
 
33
- <%= resource.sample_response %>
34
+ <%= resource.sample_response(route) %>
34
35
  <% end %>
35
36
  <% end %>
36
37
  <% end %>
@@ -0,0 +1,7 @@
1
+ Properties
2
+
3
+ | Name | Type | Description |
4
+ |:-----|:-----|:------------|
5
+ <% unique_params.each do |param| -%>
6
+ | <%= param.full_name %> | <%= param.type %> | <%= param.desc %> |
7
+ <% end -%>
@@ -1,3 +1,5 @@
1
+ # Needed until support for v2.3+ https://goo.gl/DyKn74
2
+ # frozen_string_literal: true
1
3
  module GrapeApiary
2
- VERSION = '0.0.4'
4
+ VERSION = '0.1.0'.freeze
3
5
  end
@@ -48,6 +48,10 @@ describe GrapeApiary::Blueprint do
48
48
  it 'includes groups for each resource' do
49
49
  expect(subject).to include('# Group Widgets')
50
50
  end
51
+
52
+ it 'includes properties for the resources' do
53
+ expect(subject).to include('Properties')
54
+ end
51
55
  end
52
56
 
53
57
  it 'exposes configuration settings' do
@@ -23,6 +23,18 @@ describe GrapeApiary::Config do
23
23
  expect(subject.description).to eq(description)
24
24
  end
25
25
 
26
+ context '.include_root' do
27
+ it 'defaults to false' do
28
+ expect(subject.include_root).to be(false)
29
+ end
30
+
31
+ it 'allows for inclusion of the root to be set' do
32
+ subject.include_root = true
33
+
34
+ expect(subject.include_root).to eq(true)
35
+ end
36
+ end
37
+
26
38
  context 'headers' do
27
39
  [:request_headers, :response_headers].each do |type|
28
40
  context type do
@@ -15,7 +15,7 @@ describe GrapeApiary::Resource do
15
15
  it 'response generation is delegated to a generator' do
16
16
  expect(subject.sample_generator).to receive(:response)
17
17
 
18
- subject.sample_response
18
+ subject.sample_response(GrapeApiary::Route.new(Grape::Route.new))
19
19
  end
20
20
  end
21
21
  end
@@ -8,6 +8,7 @@ describe GrapeApiary::SampleGenerator do
8
8
  config.host = host
9
9
  config.name = name
10
10
  config.description = description
11
+ config.include_root = false
11
12
  end
12
13
  end
13
14
 
@@ -1,7 +1,7 @@
1
1
  class SampleApi < Grape::API
2
2
  resource 'widgets' do
3
3
  desc 'widgets list'
4
- get '/' do
4
+ get '/' do
5
5
  end
6
6
 
7
7
  desc 'individual widget'
@@ -11,13 +11,13 @@ class SampleApi < Grape::API
11
11
  desc 'create a widget'
12
12
  params do
13
13
  requires :name,
14
- type: 'string',
15
- desc: 'the widgets name',
16
- documentation: { example: 'super widget' }
14
+ type: 'string',
15
+ desc: 'the widgets name',
16
+ documentation: { example: 'super widget' }
17
17
  optional :description,
18
- type: 'string',
19
- desc: 'the widgets name',
20
- documentation: { example: 'the best widget ever made' }
18
+ type: 'string',
19
+ desc: 'the widgets name',
20
+ documentation: { example: 'the best widget ever made' }
21
21
  end
22
22
  post '/' do
23
23
  end
@@ -27,7 +27,7 @@ class SampleApi < Grape::API
27
27
  optional :name, type: 'string', desc: 'the widgets name'
28
28
  optional :description, type: 'string', desc: 'the widgets name'
29
29
  end
30
- put ':id' do
30
+ put ':id' do
31
31
  end
32
32
  end
33
33
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-apiary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Allen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-10 00:00:00.000000000 Z
11
+ date: 2016-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
@@ -16,14 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.6'
19
+ version: '0.14'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.6'
26
+ version: '0.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
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'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: coveralls
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +100,14 @@ dependencies:
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0.18'
103
+ version: '0.36'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0.18'
110
+ version: '0.36'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: pry
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -150,11 +164,13 @@ dependencies:
150
164
  - - "~>"
151
165
  - !ruby/object:Gem::Version
152
166
  version: '2.0'
153
- description: Auto generates an Apiary (http://apiary.io) Blueprint from the docuementation
154
- that is created by your Grape API
167
+ description: |2
168
+ Auto generates an Apiary (http://apiary.io) Blueprint from the
169
+ docuementation that is created by your Grape API
155
170
  email:
156
171
  - john@threedogconsulting.com
157
- executables: []
172
+ executables:
173
+ - grape-apiary
158
174
  extensions: []
159
175
  extra_rdoc_files: []
160
176
  files:
@@ -162,11 +178,13 @@ files:
162
178
  - ".rspec"
163
179
  - ".rubocop.yml"
164
180
  - ".travis.yml"
181
+ - CHANGELOG.md
165
182
  - Gemfile
166
183
  - Guardfile
167
184
  - LICENSE.txt
168
185
  - README.md
169
186
  - Rakefile
187
+ - bin/grape-apiary
170
188
  - grape-apiary.gemspec
171
189
  - lib/grape-apiary.rb
172
190
  - lib/grape-apiary/blueprint.rb
@@ -175,7 +193,9 @@ files:
175
193
  - lib/grape-apiary/resource.rb
176
194
  - lib/grape-apiary/route.rb
177
195
  - lib/grape-apiary/sample_generator.rb
196
+ - lib/grape-apiary/tasks/grape-apiary.rake
178
197
  - lib/grape-apiary/templates/blueprint.md.erb
198
+ - lib/grape-apiary/templates/properties.md.erb
179
199
  - lib/grape-apiary/version.rb
180
200
  - lib/grape/apiary.rb
181
201
  - spec/grape-apiary/blueprint_spec.rb
@@ -186,7 +206,7 @@ files:
186
206
  - spec/spec_helper.rb
187
207
  - spec/support/config_context.rb
188
208
  - spec/support/sample_api.rb
189
- homepage: https://github.com/connexio-labs/grape-apiary
209
+ homepage: https://github.com/technekes/grape-apiary
190
210
  licenses:
191
211
  - MIT
192
212
  metadata: {}
@@ -206,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
226
  version: '0'
207
227
  requirements: []
208
228
  rubyforge_project:
209
- rubygems_version: 2.2.2
229
+ rubygems_version: 2.5.1
210
230
  signing_key:
211
231
  specification_version: 4
212
232
  summary: Allows for generating an Apiary Blueprint for you Grape API
@@ -219,4 +239,3 @@ test_files:
219
239
  - spec/spec_helper.rb
220
240
  - spec/support/config_context.rb
221
241
  - spec/support/sample_api.rb
222
- has_rdoc: