apiaryio 0.3.5 → 0.4.1
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.
- data/.gitignore +3 -2
- data/.travis.yml +3 -11
- data/README.md +7 -10
- data/Rakefile +4 -29
- data/apiary.gemspec +15 -9
- data/appveyor.yml +20 -11
- data/bin/apiary +1 -2
- data/circle.yml +2 -2
- data/features/preview.feature +1 -1
- data/features/step_definitions/file_content_step.rb +3 -12
- data/features/support/env.rb +2 -4
- data/lib/apiary.rb +0 -2
- data/lib/apiary/agent.rb +13 -0
- data/lib/apiary/cli.rb +5 -7
- data/lib/apiary/command/fetch.rb +48 -60
- data/lib/apiary/command/preview.rb +27 -46
- data/lib/apiary/command/publish.rb +27 -38
- data/lib/apiary/file_templates/preview.erb +1 -1
- data/lib/apiary/helpers.rb +45 -0
- data/lib/apiary/version.rb +1 -1
- data/spec/{cli_spec.rb → apiary/cli_spec.rb} +0 -1
- data/spec/{command → apiary/command}/fetch_spec.rb +0 -0
- data/spec/{command → apiary/command}/preview_spec.rb +1 -1
- data/spec/{command → apiary/command}/publish_spec.rb +7 -4
- data/spec/apiary/helpers_spec.rb +67 -0
- data/spec/fixtures/api_blueprint_and_swagger/apiary.apib +5 -0
- data/spec/fixtures/api_blueprint_and_swagger/swagger.yaml +5 -0
- data/{features → spec}/fixtures/apiary-invalid.apib +0 -0
- data/{features → spec}/fixtures/apiary.apib +0 -0
- data/{features → spec}/fixtures/apiary_with_bom.apib +0 -0
- data/spec/fixtures/empty_folder/.gitkeep +0 -0
- data/spec/fixtures/only_api_blueprint/apiary.apib +5 -0
- data/spec/fixtures/only_swagger/swagger.yaml +5 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +8 -4
- data/spec/support/aruba.rb +1 -11
- data/spec/support/webmock.rb +1 -0
- metadata +70 -53
- data/features/support/setup.rb +0 -5
- data/lib/apiary/common.rb +0 -29
- data/spec/common_spec.rb +0 -29
@@ -6,14 +6,14 @@ require 'json'
|
|
6
6
|
require 'tmpdir'
|
7
7
|
require 'erb'
|
8
8
|
|
9
|
-
require
|
10
|
-
require
|
9
|
+
require 'apiary/agent'
|
10
|
+
require 'apiary/helpers'
|
11
|
+
require 'apiary/helpers/javascript_helper'
|
11
12
|
|
12
|
-
module Apiary
|
13
|
-
module Command
|
13
|
+
module Apiary::Command
|
14
14
|
# Display preview of local blueprint file
|
15
15
|
class Preview
|
16
|
-
|
16
|
+
include Apiary::Helpers
|
17
17
|
include Apiary::Helpers::JavascriptHelper
|
18
18
|
|
19
19
|
PREVIEW_TEMPLATE_PATH = "#{File.expand_path File.dirname(__FILE__)}/../file_templates/preview.erb"
|
@@ -28,7 +28,7 @@ module Apiary
|
|
28
28
|
|
29
29
|
def initialize(opts)
|
30
30
|
@options = OpenStruct.new(opts)
|
31
|
-
@options.path ||= '
|
31
|
+
@options.path ||= '.'
|
32
32
|
@options.api_host ||= 'api.apiary.io'
|
33
33
|
@options.port ||= 8080
|
34
34
|
@options.proxy ||= ENV['http_proxy']
|
@@ -37,10 +37,14 @@ module Apiary
|
|
37
37
|
@options.headers ||= {
|
38
38
|
:accept => 'text/html',
|
39
39
|
:content_type => 'text/plain',
|
40
|
-
:user_agent =>
|
40
|
+
:user_agent => Apiary.user_agent
|
41
41
|
}
|
42
42
|
|
43
|
-
|
43
|
+
begin
|
44
|
+
@source_path = api_description_source_path(@options.path)
|
45
|
+
rescue Exception => e
|
46
|
+
abort "#{e.message}"
|
47
|
+
end
|
44
48
|
end
|
45
49
|
|
46
50
|
def execute
|
@@ -52,24 +56,25 @@ module Apiary
|
|
52
56
|
end
|
53
57
|
|
54
58
|
def server
|
55
|
-
|
56
|
-
|
59
|
+
app = self.rack_app do
|
60
|
+
generate
|
61
|
+
end
|
57
62
|
|
58
|
-
|
59
|
-
generate_static
|
63
|
+
Rack::Server.start(:Port => @options.port, :Host => @options.host, :app => app)
|
60
64
|
end
|
61
65
|
|
62
|
-
def
|
63
|
-
|
64
|
-
common.validate_apib_file(@options.path)
|
65
|
-
end
|
66
|
+
def show
|
67
|
+
preview_string = generate
|
66
68
|
|
67
|
-
|
68
|
-
|
69
|
+
File.open(preview_path, 'w') do |file|
|
70
|
+
file.write preview_string
|
71
|
+
file.flush
|
72
|
+
@options.output ? write_generated_path(file.path, @options.output) : open_generated_page(file.path)
|
73
|
+
end
|
69
74
|
end
|
70
75
|
|
71
76
|
def browser
|
72
|
-
BROWSERS[@options.browser]
|
77
|
+
BROWSERS[@options.browser] || nil
|
73
78
|
end
|
74
79
|
|
75
80
|
def rack_app(&block)
|
@@ -78,14 +83,6 @@ module Apiary
|
|
78
83
|
end
|
79
84
|
end
|
80
85
|
|
81
|
-
def run_server
|
82
|
-
app = self.rack_app do
|
83
|
-
generate
|
84
|
-
end
|
85
|
-
|
86
|
-
Rack::Server.start(:Port => @options.port, :Host => @options.host, :app => app)
|
87
|
-
end
|
88
|
-
|
89
86
|
# TODO: add linux and windows systems
|
90
87
|
def open_generated_page(path)
|
91
88
|
exec "open #{browser_options} #{path}"
|
@@ -99,30 +96,15 @@ module Apiary
|
|
99
96
|
template = load_preview_template
|
100
97
|
|
101
98
|
data = {
|
102
|
-
title: File.basename(@
|
103
|
-
|
99
|
+
title: File.basename(@source_path, '.*'),
|
100
|
+
source: api_description_source(@source_path)
|
104
101
|
}
|
105
102
|
|
106
103
|
template.result(binding)
|
107
104
|
end
|
108
105
|
|
109
|
-
def generate_static
|
110
|
-
preview_string = generate
|
111
|
-
|
112
|
-
File.open(preview_path, 'w') do |file|
|
113
|
-
file.write preview_string
|
114
|
-
file.flush
|
115
|
-
@options.output ? write_generated_path(file.path, @options.output) : open_generated_page(file.path)
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def load_blueprint
|
120
|
-
file = File.open @options.path, 'r'
|
121
|
-
file.read
|
122
|
-
end
|
123
|
-
|
124
106
|
def preview_path
|
125
|
-
basename = File.basename(@
|
107
|
+
basename = File.basename(@source_path, '.*')
|
126
108
|
temp = Dir.tmpdir
|
127
109
|
"#{temp}/#{basename}-preview.html"
|
128
110
|
end
|
@@ -139,5 +121,4 @@ module Apiary
|
|
139
121
|
"-a #{BROWSERS[@options.browser.to_sym]}" if @options.browser
|
140
122
|
end
|
141
123
|
end
|
142
|
-
end
|
143
124
|
end
|
@@ -3,69 +3,65 @@ require 'rest-client'
|
|
3
3
|
require 'rack'
|
4
4
|
require 'ostruct'
|
5
5
|
require 'json'
|
6
|
-
require "apiary/common"
|
7
6
|
|
8
|
-
|
9
|
-
|
7
|
+
require 'apiary/agent'
|
8
|
+
require 'apiary/helpers'
|
9
|
+
|
10
|
+
module Apiary::Command
|
10
11
|
# Display preview of local blueprint file
|
11
12
|
class Publish
|
13
|
+
include Apiary::Helpers
|
12
14
|
|
13
15
|
attr_reader :options
|
14
16
|
|
15
17
|
def initialize(opts)
|
16
18
|
@options = OpenStruct.new(opts)
|
17
|
-
@options.path ||=
|
18
|
-
@options.api_host ||=
|
19
|
+
@options.path ||= '.'
|
20
|
+
@options.api_host ||= 'api.apiary.io'
|
19
21
|
@options.api_name ||= false
|
20
22
|
@options.api_key ||= ENV['APIARY_API_KEY']
|
21
23
|
@options.proxy ||= ENV['http_proxy']
|
22
24
|
@options.headers ||= {
|
23
|
-
:accept =>
|
24
|
-
:content_type =>
|
25
|
+
:accept => 'text/html',
|
26
|
+
:content_type => 'text/plain',
|
25
27
|
:authentication => "Token #{@options.api_key}",
|
26
|
-
:user_agent =>
|
28
|
+
:user_agent => Apiary.user_agent
|
27
29
|
}
|
28
|
-
@options.message ||=
|
30
|
+
@options.message ||= 'Saving API Description Document from apiary-client'
|
31
|
+
|
32
|
+
begin
|
33
|
+
@source_path = api_description_source_path(@options.path)
|
34
|
+
rescue Exception => e
|
35
|
+
abort "#{e.message}"
|
36
|
+
end
|
29
37
|
end
|
30
38
|
|
31
|
-
def execute
|
39
|
+
def execute
|
32
40
|
publish_on_apiary
|
33
41
|
end
|
34
42
|
|
35
43
|
def publish_on_apiary
|
36
44
|
unless @options.api_name
|
37
|
-
abort
|
45
|
+
abort 'Please provide an api-name option (subdomain part from your http://docs.<api-name>.apiary.io/)'
|
38
46
|
end
|
39
47
|
|
40
48
|
unless @options.api_key
|
41
|
-
abort
|
49
|
+
abort 'API key must be provided through environment variable APIARY_API_KEY. Please go to https://login.apiary.io/tokens to obtain it.'
|
42
50
|
end
|
43
51
|
|
44
|
-
|
45
|
-
|
52
|
+
query_apiary
|
46
53
|
end
|
47
54
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
def get_apib_file(apib_file)
|
54
|
-
common = Apiary::Common.new
|
55
|
-
common.get_apib_file(apib_file)
|
56
|
-
end
|
55
|
+
def query_apiary
|
56
|
+
url = "https://#{@options.api_host}/blueprint/publish/#{@options.api_name}"
|
57
|
+
source = api_description_source(@source_path)
|
57
58
|
|
58
|
-
|
59
|
-
@options.path || "#{File.basename(Dir.pwd)}.apib"
|
60
|
-
end
|
61
|
-
|
62
|
-
def query_apiary(host, path)
|
63
|
-
url = "https://#{host}/blueprint/publish/#{@options.api_name}"
|
64
|
-
if validate_apib_file path
|
59
|
+
unless source.nil?
|
65
60
|
data = {
|
66
|
-
:code =>
|
61
|
+
:code => source,
|
67
62
|
:messageToSave => @options.message
|
68
63
|
}
|
64
|
+
|
69
65
|
RestClient.proxy = @options.proxy
|
70
66
|
|
71
67
|
begin
|
@@ -87,12 +83,5 @@ module Apiary
|
|
87
83
|
end
|
88
84
|
end
|
89
85
|
end
|
90
|
-
|
91
|
-
private
|
92
|
-
def api_name
|
93
|
-
"-a"
|
94
|
-
end
|
95
|
-
|
96
86
|
end
|
97
|
-
end
|
98
87
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Apiary
|
4
|
+
module Helpers
|
5
|
+
def api_description_source_path(path)
|
6
|
+
raise "Invalid path #{path}" unless File.exist? path
|
7
|
+
return path if File.file? path
|
8
|
+
source_path = choose_one(path)
|
9
|
+
return source_path unless source_path.nil?
|
10
|
+
raise 'No API Description Document found'
|
11
|
+
end
|
12
|
+
|
13
|
+
def api_description_source(path)
|
14
|
+
source_path = api_description_source_path(path)
|
15
|
+
source = nil
|
16
|
+
File.open(source_path, 'r:bom|utf-8') { |file| source = file.read }
|
17
|
+
source
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def choose_one(path)
|
23
|
+
apibPath = api_blueprint(path)
|
24
|
+
swaggerPath = swagger(path)
|
25
|
+
|
26
|
+
if apibPath && swaggerPath
|
27
|
+
warn 'WARNING: Both apiary.apib and swagger.yaml are present. The apiary.apib file will be used. To override this selection specify path to desired file'
|
28
|
+
end
|
29
|
+
|
30
|
+
apibPath || swaggerPath
|
31
|
+
end
|
32
|
+
|
33
|
+
def api_blueprint(path)
|
34
|
+
source_path = File.join(path, 'apiary.apib')
|
35
|
+
return source_path if File.exist? source_path
|
36
|
+
return nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def swagger(path)
|
40
|
+
source_path = File.join(path, 'swagger.yaml')
|
41
|
+
return source_path if File.exist? source_path
|
42
|
+
return nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/apiary/version.rb
CHANGED
File without changes
|
@@ -4,7 +4,7 @@ describe Apiary::Command::Preview do
|
|
4
4
|
|
5
5
|
let(:command) do
|
6
6
|
opts = {
|
7
|
-
path: "#{File.expand_path File.dirname(__FILE__)}/../../
|
7
|
+
path: "#{File.expand_path File.dirname(__FILE__)}/../../fixtures/apiary.apib"
|
8
8
|
}
|
9
9
|
Apiary::Command::Preview.new(opts)
|
10
10
|
end
|
@@ -5,12 +5,13 @@ describe Apiary::Command::Publish do
|
|
5
5
|
let(:message) do
|
6
6
|
Apiary::Command::Publish.new({
|
7
7
|
:api_name => 'myapi',
|
8
|
-
:path => '
|
8
|
+
:path => 'spec/fixtures/apiary.apib',
|
9
|
+
:api_key => 'testkey'
|
9
10
|
}).options.message
|
10
11
|
end
|
11
12
|
|
12
13
|
it 'uses the default message' do
|
13
|
-
expect(message).to eq('Saving
|
14
|
+
expect(message).to eq('Saving API Description Document from apiary-client')
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
@@ -19,7 +20,8 @@ describe Apiary::Command::Publish do
|
|
19
20
|
Apiary::Command::Publish.new({
|
20
21
|
:api_name => 'myapi',
|
21
22
|
:message => 'Custom message',
|
22
|
-
:path => '
|
23
|
+
:path => 'spec/fixtures/apiary.apib',
|
24
|
+
:api_key => 'testkey'
|
23
25
|
}).options.message
|
24
26
|
end
|
25
27
|
|
@@ -35,7 +37,8 @@ describe Apiary::Command::Publish do
|
|
35
37
|
Apiary::Command::Publish.new({
|
36
38
|
:api_name => 'myapi',
|
37
39
|
:message => 'Custom message',
|
38
|
-
:path => '
|
40
|
+
:path => 'spec/fixtures/apiary.apib',
|
41
|
+
:api_key => 'testkey'
|
39
42
|
}).execute
|
40
43
|
end
|
41
44
|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apiary::Helpers do
|
4
|
+
include Apiary::Helpers
|
5
|
+
|
6
|
+
describe '#api_description_source_path' do
|
7
|
+
context 'path doesn\'t exists' do
|
8
|
+
it 'should raise error saying that Directory doesn\'t exists' do
|
9
|
+
path = 'spec/fixtures/invalid_path'
|
10
|
+
expect { api_description_source_path(path)}.to raise_error(/Invalid path/)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'missing file is in path' do
|
15
|
+
it 'should raise error saying that file doesn\'t exists' do
|
16
|
+
path = 'spec/fixtures/only_api_blueprint/swagger.yaml'
|
17
|
+
expect { api_description_source_path(path)}.to raise_error(/Invalid path/)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'directory is in path and contains API Blueprint only' do
|
22
|
+
it 'should return path ending to `apiary.apib`' do
|
23
|
+
path = 'spec/fixtures/only_api_blueprint'
|
24
|
+
expect(api_description_source_path(path)).to match(/apiary\.apib$/)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'directory is in path and contains Swagger only' do
|
29
|
+
it 'should return path ending to `swagger.yaml`' do
|
30
|
+
path = 'spec/fixtures/only_swagger'
|
31
|
+
expect(api_description_source_path(path)).to match(/swagger\.yaml$/)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'directory is in path and contains both API Blueprint and Swagger' do
|
36
|
+
it 'should prefere API Blueprint and return path ending to `apiary.apib`' do
|
37
|
+
path = 'spec/fixtures/api_blueprint_and_swagger'
|
38
|
+
expect(api_description_source_path(path)).to match(/apiary\.apib$/)
|
39
|
+
expect { api_description_source_path(path) }.to output("WARNING: Both apiary.apib and swagger.yaml are present. The apiary.apib file will be used. To override this selection specify path to desired file\n").to_stderr
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'empty folder' do
|
44
|
+
it 'should raise error saying that file doesn\'t exists' do
|
45
|
+
path = 'spec/fixtures/empty_folder'
|
46
|
+
expect { api_description_source_path(path)}.to raise_error('No API Description Document found')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'existing file is in path' do
|
51
|
+
it 'should return same path as was entered' do
|
52
|
+
path = 'spec/fixtures/only_api_blueprint/apiary.apib'
|
53
|
+
expect(api_description_source_path(path)).to equal(path)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '#api_description_source' do
|
59
|
+
it 'get file with and without BOM' do
|
60
|
+
file1 = api_description_source('spec/fixtures/apiary.apib')
|
61
|
+
file2 = api_description_source('spec/fixtures/apiary_with_bom.apib')
|
62
|
+
expect(file1).not_to be_nil
|
63
|
+
expect(file2).not_to be_nil
|
64
|
+
expect(file1).to eq(file2)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
File without changes
|
File without changes
|
File without changes
|