apiaryio 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +34 -12
- data/.travis.yml +1 -0
- data/Rakefile +8 -0
- data/apiary.gemspec +5 -2
- data/circle.yml +4 -0
- data/features/fetch.feature +7 -0
- data/features/fixtures/apiary.apib +48 -0
- data/features/preview.feature +7 -0
- data/features/publish.feature +7 -0
- data/features/step_definitions/file_content_step.rb +19 -0
- data/features/support/env.rb +7 -0
- data/features/support/setup.rb +1 -0
- data/features/version.feature +10 -0
- data/lib/apiary/cli.rb +37 -74
- data/lib/apiary/command/fetch.rb +2 -2
- data/lib/apiary/command/preview.rb +16 -5
- data/lib/apiary/command/publish.rb +3 -2
- data/lib/apiary/version.rb +1 -1
- data/spec/cli_spec.rb +1 -1
- data/spec/command/fetch_spec.rb +11 -9
- data/spec/spec_helper.rb +7 -0
- data/spec/support/aruba.rb +11 -0
- metadata +108 -52
- checksums.yaml +0 -7
- data/doc/Apiary.html +0 -131
- data/doc/Apiary/CLI.html +0 -528
- data/doc/Apiary/Command.html +0 -117
- data/doc/Apiary/Command/Fetch.html +0 -652
- data/doc/Apiary/Command/Help.html +0 -338
- data/doc/Apiary/Command/Preview.html +0 -1089
- data/doc/Apiary/Command/Publish.html +0 -658
- data/doc/Apiary/Command/Runner.html +0 -200
- data/doc/Apiary/Command/Version.html +0 -200
- data/doc/_index.html +0 -214
- data/doc/class_list.html +0 -54
- data/doc/css/common.css +0 -1
- data/doc/css/full_list.css +0 -57
- data/doc/css/style.css +0 -339
- data/doc/file.README.html +0 -169
- data/doc/file_list.html +0 -56
- data/doc/frames.html +0 -26
- data/doc/index.html +0 -169
- data/doc/js/app.js +0 -219
- data/doc/js/full_list.js +0 -178
- data/doc/js/jquery.js +0 -4
- data/doc/method_list.html +0 -281
- data/doc/top-level-namespace.html +0 -112
- data/lib/apiary/command/help.rb +0 -38
- data/lib/apiary/command/runner.rb +0 -13
- data/lib/apiary/command/version.rb +0 -13
data/.gitignore
CHANGED
@@ -1,15 +1,37 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/test/tmp/
|
9
|
+
/test/version_tmp/
|
10
|
+
/tmp/
|
11
|
+
|
12
|
+
## Specific to RubyMotion:
|
13
|
+
.dat*
|
14
|
+
.repl_history
|
15
|
+
build/
|
16
|
+
|
17
|
+
## Documentation cache and generated files:
|
18
|
+
/.yardoc/
|
19
|
+
/_yardoc/
|
20
|
+
/doc/
|
21
|
+
/rdoc/
|
22
|
+
|
23
|
+
## Environment normalisation:
|
24
|
+
/.bundle/
|
25
|
+
/lib/bundler/man/
|
26
|
+
|
27
|
+
# for a library or gem, you might want to ignore these files since the code is
|
28
|
+
# intended to run in multiple environments; otherwise, check them in:
|
1
29
|
Gemfile.lock
|
2
|
-
.
|
30
|
+
.ruby-version
|
31
|
+
.ruby-gemset
|
32
|
+
|
33
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
3
34
|
.rvmrc
|
4
|
-
.tags
|
5
|
-
.yardoc
|
6
|
-
.rbenv-version
|
7
|
-
*.gem
|
8
|
-
/coverage
|
9
|
-
/pkg
|
10
|
-
/rdoc
|
11
|
-
/vendor
|
12
|
-
!/doc
|
13
|
-
/.idea
|
14
|
-
/nbproject/
|
15
35
|
|
36
|
+
# testing
|
37
|
+
features/fixtures/test.html
|
data/.travis.yml
CHANGED
data/Rakefile
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
require "rubygems"
|
3
3
|
require "rspec/core/rake_task"
|
4
4
|
require 'yard'
|
5
|
+
require 'cucumber'
|
6
|
+
require 'cucumber/rake/task'
|
7
|
+
|
8
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
9
|
+
t.cucumber_opts = "features --format pretty"
|
10
|
+
end
|
5
11
|
|
6
12
|
desc "Run all specs"
|
7
13
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
@@ -11,6 +17,8 @@ end
|
|
11
17
|
desc 'Default: Run all specs.'
|
12
18
|
task :default => :spec
|
13
19
|
|
20
|
+
task :test => :spec
|
21
|
+
|
14
22
|
task :doc => :yard
|
15
23
|
task :gem => :gemspec
|
16
24
|
|
data/apiary.gemspec
CHANGED
@@ -19,9 +19,12 @@ Gem::Specification.new do |gem|
|
|
19
19
|
gem.add_dependency "rest-client", "~> 1.6.7"
|
20
20
|
gem.add_dependency "rack", ">= 1.4.0", "< 1.6.0"
|
21
21
|
gem.add_dependency "rake"
|
22
|
+
gem.add_dependency "thor"
|
22
23
|
|
23
|
-
gem.add_development_dependency "rspec"
|
24
|
+
gem.add_development_dependency "rspec", "~> 3.1.0"
|
24
25
|
gem.add_development_dependency "webmock"
|
25
|
-
gem.add_development_dependency "yard"
|
26
|
+
gem.add_development_dependency "yard"
|
27
|
+
gem.add_development_dependency "aruba"
|
28
|
+
gem.add_development_dependency "cucumber"
|
26
29
|
|
27
30
|
end
|
data/circle.yml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
Feature: Fetch apiary.apib from API_NAME.apiary.io
|
2
|
+
|
3
|
+
# This is integration testing you have to set APIARY_API_KEY
|
4
|
+
Scenario: Fetch apiary.apib from API_NAME.apiary.io
|
5
|
+
|
6
|
+
When I run `apiary fetch --api-name apiaryclienttest`
|
7
|
+
Then the output should contain the content of file "apiary.apib"
|
@@ -0,0 +1,48 @@
|
|
1
|
+
FORMAT: 1A
|
2
|
+
|
3
|
+
# Apiary Client Test - DON'T CHANGE DOCUMENT!
|
4
|
+
|
5
|
+
This document is used for testing apiary-client
|
6
|
+
|
7
|
+
# Group Notes
|
8
|
+
Notes related resources of the **Notes API**
|
9
|
+
|
10
|
+
## Notes Collection [/notes
|
11
|
+
### List all Notes [GET]
|
12
|
+
+ Response 200 (application/json)
|
13
|
+
|
14
|
+
[{
|
15
|
+
"id": 1, "title": "Jogging in park"
|
16
|
+
}, {
|
17
|
+
"id": 2, "title": "Pick-up posters from post-office"
|
18
|
+
}]
|
19
|
+
|
20
|
+
### Create a Note [POST
|
21
|
+
|
22
|
+
+ Request
|
23
|
+
|
24
|
+
sflmvs;mv;dsm{ "title": "Buy cheese and bread for breakfast." }
|
25
|
+
|
26
|
+
+ Response 201 (application/json)
|
27
|
+
|
28
|
+
{ "id": 3, "title": "Buy cheese and bread for breakfast." }
|
29
|
+
|
30
|
+
## Note [/notes/{id}]
|
31
|
+
A single Note object with all its details
|
32
|
+
|
33
|
+
+ Parameters
|
34
|
+
+ id (required, number, `1`) ... Numeric `id` of the Note to perform action with. Has example value.
|
35
|
+
|
36
|
+
### Retrieve a Note [GET]
|
37
|
+
+ Response 200 (application/json)
|
38
|
+
|
39
|
+
+ Header
|
40
|
+
|
41
|
+
X-My-Header: The Value
|
42
|
+
|
43
|
+
+ Body
|
44
|
+
|
45
|
+
{ "id": 2, "title": "Pick-up posters from post-office" }
|
46
|
+
|
47
|
+
### Remove a Note [DELETE]
|
48
|
+
+ Response 204
|
@@ -0,0 +1,7 @@
|
|
1
|
+
Feature: Show API documentation in specified browser
|
2
|
+
|
3
|
+
# This is integration testing you have to set APIARY_API_KEY
|
4
|
+
Scenario: Write generated HTML into specified file
|
5
|
+
|
6
|
+
When I run `apiary preview --path apiary.apib --output=test.html`
|
7
|
+
Then a file named "test.html" should exist
|
@@ -0,0 +1,7 @@
|
|
1
|
+
Feature: Publish apiary.apib on docs.API_NAME.apiary.io
|
2
|
+
|
3
|
+
# This is integration testing you have to set APIARY_API_KEY
|
4
|
+
Scenario: Publish apiary.apib on docs.API_NAME.apiary.io
|
5
|
+
|
6
|
+
When I run `apiary publish --path=apiary.apib --api-name 1111apiaryclienttest`
|
7
|
+
Then the exit status should be 1
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Then /^the output should contain the content of file "(.*)"$/ do |filename|
|
2
|
+
expected = nil
|
3
|
+
in_current_dir do
|
4
|
+
expected = File.read(filename)
|
5
|
+
end
|
6
|
+
|
7
|
+
assert_partial_output(expected, all_output)
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
Then /^output file "(.*)" should contain the content of file "(.*)"$/ do |input, output|
|
12
|
+
expected = nil
|
13
|
+
in_current_dir do
|
14
|
+
actual = File.read(input)
|
15
|
+
expected = File.read(output)
|
16
|
+
end
|
17
|
+
|
18
|
+
assert_partial_output(expected, actual)
|
19
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'aruba/cucumber'
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Feature: Version of Apiary client
|
2
|
+
|
3
|
+
Scenario: Print the semantic version of Apiary client
|
4
|
+
|
5
|
+
# Note the output should be a semantic version (semver.org)
|
6
|
+
# The matching regex was taken from https://github.com/isaacs/node-semver/issues/32#issue-15023919
|
7
|
+
|
8
|
+
When I run `apiary version`
|
9
|
+
Then the output should match /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
|
10
|
+
And the exit status should be 0
|
data/lib/apiary/cli.rb
CHANGED
@@ -1,88 +1,51 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require
|
2
|
+
require "thor"
|
3
|
+
require "apiary/command/fetch"
|
4
|
+
require "apiary/command/preview"
|
5
|
+
require "apiary/command/publish"
|
6
|
+
|
3
7
|
module Apiary
|
4
|
-
class CLI
|
8
|
+
class CLI < Thor
|
5
9
|
|
6
|
-
|
10
|
+
desc "fetch", "Fetch apiary.apib from API_NAME.apiary.io"
|
11
|
+
method_option :api_name, :type => :string, :required => true, :default => ''
|
7
12
|
|
8
|
-
def
|
9
|
-
|
10
|
-
|
11
|
-
run(options)
|
13
|
+
def fetch
|
14
|
+
cmd = Apiary::Command::Fetch.new options
|
15
|
+
cmd.execute
|
12
16
|
end
|
13
17
|
|
14
|
-
|
15
|
-
|
18
|
+
desc "preview", "Show API documentation in default browser"
|
19
|
+
method_option :browser, :type => :string, :enum => %w(chrome safari firefox), :banner => "chrome|safari|firefox", :desc => "Show API documentation in specified browser"
|
20
|
+
method_option :output, :type => :string, :banner => "FILE", :desc => "Write generated HTML into specified file"
|
21
|
+
method_option :path, :type => :string, :desc => "Specify path to blueprint file", :default => 'apiary.apib'
|
22
|
+
method_option :api_host, :type => :string, :banner => "HOST", :desc => "Specify apiary host"
|
23
|
+
method_option :server, :type => :boolean, :desc => "Start standalone web server on port 8080"
|
24
|
+
method_option :port, :type => :numeric, :banner => "PORT", :desc => "Set port for --server option"
|
25
|
+
|
26
|
+
def preview
|
27
|
+
cmd = Apiary::Command::Preview.new options
|
28
|
+
cmd.execute
|
16
29
|
end
|
17
30
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
options_parser = OptionParser.new do |opts|
|
26
|
-
opts.on("--path [PATH]") do |path|
|
27
|
-
raise OptionParser::InvalidOption unless ["fetch", "preview", "publish"].include? command
|
28
|
-
options[:path] = path
|
29
|
-
end
|
30
|
-
|
31
|
-
opts.on("--output [PATH]") do |path|
|
32
|
-
raise OptionParser::InvalidOption unless ["fetch", "preview"].include? command
|
33
|
-
options[:output] = path
|
34
|
-
end
|
35
|
-
|
36
|
-
opts.on("--api_host API_HOST") do |api_host|
|
37
|
-
raise OptionParser::InvalidOption unless ["fetch", "preview", "publish"].include? command
|
38
|
-
options[:api_host] = api_host
|
39
|
-
end
|
40
|
-
|
41
|
-
opts.on("--api-name API_HOST") do |api_name|
|
42
|
-
raise OptionParser::InvalidOption unless ["fetch", "publish"].include? command
|
43
|
-
options[:api_name] = api_name
|
44
|
-
end
|
45
|
-
|
46
|
-
opts.on("--message COMMIT_MESSAGE") do |commit_message|
|
47
|
-
raise OptionParser::InvalidOption if command != "publish"
|
48
|
-
options[:commit_message] = commit_message
|
49
|
-
end
|
50
|
-
|
51
|
-
opts.on("--browser BROWSER") do |browser|
|
52
|
-
raise OptionParser::InvalidOption if command != "preview"
|
53
|
-
options[:browser] = browser
|
54
|
-
end
|
31
|
+
desc "publish", "Publish apiary.apib on docs.API_NAME.apiary.io"
|
32
|
+
method_option :message, :type => :string, :banner => "COMMIT_MESSAGE", :desc => "Publish with custom commit message"
|
33
|
+
method_option :path, :type => :string, :desc => "Specify path to blueprint file", :default => 'apiary.apib'
|
34
|
+
method_option :api_host, :type => :string, :banner => "HOST", :desc => "Specify apiary host"
|
35
|
+
method_option :api_name, :type => :string, :required => true, :default => ''
|
55
36
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
opts.on("--port [PORT]") do |port|
|
62
|
-
raise OptionParser::InvalidOption unless ["fetch", "preview", "publish"].include? command
|
63
|
-
options[:port] = port
|
64
|
-
end
|
65
|
-
|
66
|
-
opts.on('-v', '--version') do
|
67
|
-
raise OptionParser::InvalidOption if command
|
68
|
-
command = :version
|
69
|
-
end
|
70
|
-
|
71
|
-
opts.on( '-h', '--help') do
|
72
|
-
raise OptionParser::InvalidOption if command
|
73
|
-
command = :help
|
74
|
-
end
|
75
|
-
end
|
37
|
+
def publish
|
38
|
+
cmd = Apiary::Command::Publish.new options
|
39
|
+
cmd.execute
|
40
|
+
end
|
76
41
|
|
77
|
-
|
78
|
-
|
79
|
-
options
|
42
|
+
desc "version", "Show version"
|
43
|
+
method_option :aliases => "-v"
|
80
44
|
|
81
|
-
|
82
|
-
puts
|
83
|
-
puts Apiary::Command::Help.banner
|
84
|
-
exit 1
|
45
|
+
def version
|
46
|
+
puts Apiary::VERSION
|
85
47
|
end
|
86
|
-
|
87
48
|
end
|
88
49
|
end
|
50
|
+
|
51
|
+
Apiary::CLI.start(ARGV)
|
data/lib/apiary/command/fetch.rb
CHANGED
@@ -19,16 +19,22 @@ module Apiary
|
|
19
19
|
|
20
20
|
# TODO: use OpenStruct to store @options
|
21
21
|
def initialize(opts)
|
22
|
+
puts opts
|
22
23
|
@options = OpenStruct.new(opts)
|
23
24
|
@options.path ||= "apiary.apib"
|
24
25
|
@options.api_host ||= "api.apiary.io"
|
25
26
|
@options.headers ||= {:accept => "text/html", :content_type => "text/plain"}
|
26
27
|
@options.port ||= 8080
|
27
28
|
@options.proxy ||= ENV['http_proxy']
|
29
|
+
@options.server ||= false
|
28
30
|
end
|
29
31
|
|
30
|
-
def
|
31
|
-
|
32
|
+
def execute
|
33
|
+
if @options.server
|
34
|
+
server
|
35
|
+
else
|
36
|
+
show
|
37
|
+
end
|
32
38
|
end
|
33
39
|
|
34
40
|
def server
|
@@ -36,7 +42,7 @@ module Apiary
|
|
36
42
|
end
|
37
43
|
|
38
44
|
def show
|
39
|
-
generate_static(path)
|
45
|
+
generate_static(@options.path)
|
40
46
|
end
|
41
47
|
|
42
48
|
def validate_apib_file(apib_file)
|
@@ -74,7 +80,12 @@ module Apiary
|
|
74
80
|
|
75
81
|
def query_apiary(host, path)
|
76
82
|
url = "https://#{host}/blueprint/generate"
|
77
|
-
|
83
|
+
begin
|
84
|
+
data = File.read(path)
|
85
|
+
rescue
|
86
|
+
abort "File #{path} not found."
|
87
|
+
end
|
88
|
+
|
78
89
|
RestClient.proxy = @options.proxy
|
79
90
|
|
80
91
|
begin
|
@@ -82,7 +93,7 @@ module Apiary
|
|
82
93
|
rescue RestClient::BadRequest => e
|
83
94
|
err = JSON.parse e.response
|
84
95
|
if err.has_key? 'parserError'
|
85
|
-
abort "#{err['message']}: #{err['parserError']}"
|
96
|
+
abort "#{err['message']}: #{err['parserError']} (Line: #{err['line']}, Column: #{err['column']})"
|
86
97
|
else
|
87
98
|
abort "Apiary service responded with an error: #{err['message']}"
|
88
99
|
end
|
@@ -28,8 +28,8 @@ module Apiary
|
|
28
28
|
@options.commit_message ||= "Saving blueprint from apiary-client"
|
29
29
|
end
|
30
30
|
|
31
|
-
def
|
32
|
-
|
31
|
+
def execute()
|
32
|
+
publish_on_apiary
|
33
33
|
end
|
34
34
|
|
35
35
|
def publish_on_apiary
|
@@ -57,6 +57,7 @@ module Apiary
|
|
57
57
|
|
58
58
|
def query_apiary(host, path)
|
59
59
|
url = "https://#{host}/blueprint/publish/#{@options.api_name}"
|
60
|
+
validate_apib_file path
|
60
61
|
data = {
|
61
62
|
:code => File.read(path),
|
62
63
|
:messageToSave => @options.commit_message
|
data/lib/apiary/version.rb
CHANGED