apiaryio 0.2.5 → 0.3.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.
- data/.travis.yml +1 -7
- data/README.md +1 -1
- data/appveyor.yml +22 -0
- data/lib/apiary.rb +3 -4
- data/lib/apiary/cli.rb +19 -19
- data/lib/apiary/command/fetch.rb +3 -4
- data/lib/apiary/command/preview.rb +57 -49
- data/lib/apiary/file_templates/preview.erb +15 -0
- data/lib/apiary/helpers/javascript_helper.rb +29 -0
- data/lib/apiary/version.rb +1 -1
- data/spec/command/preview_spec.rb +24 -0
- metadata +7 -8
data/.travis.yml
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
language: ruby
|
2
|
+
sudo: false
|
2
3
|
rvm:
|
3
4
|
- "1.9.3"
|
4
5
|
- "2.0.0"
|
@@ -17,13 +18,6 @@ matrix:
|
|
17
18
|
- rvm: rbx-2
|
18
19
|
cache: bundler
|
19
20
|
notifications:
|
20
|
-
email:
|
21
|
-
recipients:
|
22
|
-
- lukas@apiary.io
|
23
|
-
- adam@apiary.io
|
24
|
-
- ladislav@apiary.io
|
25
|
-
on_success: change
|
26
|
-
on_failure: always
|
27
21
|
hipchat:
|
28
22
|
rooms:
|
29
23
|
secure: "HqBUrmf4P2bgvwb4b9PL1tBae2wcZaXadOgwRwAFhdhDZFHaKXIXlJRUW8tN\ntdO83OZgatxJrpWWQj8VYTfDuhlE3b3NxVWeXc3PkfrHmuvejQf4veh7kwR0\njLVE6jb+ZbFIwRE2W0VFLFKYQHI6PLem4W0OKXW5Shqzy8Ewlow="
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@ apiaryio
|
|
3
3
|
|
4
4
|
Apiary.io CLI
|
5
5
|
|
6
|
-
[](https://travis-ci.org/apiaryio/apiary-client)
|
6
|
+
[](https://travis-ci.org/apiaryio/apiary-client) [](https://ci.appveyor.com/project/Apiary/apiary-client/branch/master)
|
7
7
|
|
8
8
|
|
9
9
|
## Install
|
data/appveyor.yml
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
version: "{build}"
|
3
|
+
clone_depth: 10
|
4
|
+
install:
|
5
|
+
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
6
|
+
- ruby --version
|
7
|
+
- gem --version
|
8
|
+
- gem install bundler --quiet --no-ri --no-rdoc
|
9
|
+
- bundler --version
|
10
|
+
build_script:
|
11
|
+
- bundle install
|
12
|
+
test_script:
|
13
|
+
- rake test
|
14
|
+
artifacts:
|
15
|
+
- path: pkg\*.gem
|
16
|
+
environment:
|
17
|
+
matrix:
|
18
|
+
- ruby_version: "193"
|
19
|
+
- ruby_version: "200"
|
20
|
+
- ruby_version: "200-x64"
|
21
|
+
- ruby_version: "21"
|
22
|
+
- ruby_version: "21-x64"
|
data/lib/apiary.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
Dir["#{File.dirname(__FILE__)}/apiary/command/*.rb"].each { |f| require(f) }
|
2
|
+
require 'apiary/version'
|
3
|
+
require 'apiary/cli'
|
4
|
+
require 'apiary/common'
|
6
5
|
|
7
6
|
module Apiary
|
8
7
|
end
|
data/lib/apiary/cli.rb
CHANGED
@@ -1,39 +1,39 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
2
|
+
require 'thor'
|
3
|
+
require 'apiary/command/fetch'
|
4
|
+
require 'apiary/command/preview'
|
5
|
+
require 'apiary/command/publish'
|
6
6
|
|
7
7
|
module Apiary
|
8
8
|
class CLI < Thor
|
9
9
|
|
10
|
-
desc
|
10
|
+
desc 'fetch', 'Fetch apiary.apib from API_NAME.apiary.io'
|
11
11
|
method_option :api_name, :type => :string, :required => true, :default => ''
|
12
|
-
method_option :api_host, :type => :string, :banner =>
|
13
|
-
method_option :output, :type => :string, :banner =>
|
12
|
+
method_option :api_host, :type => :string, :banner => 'HOST', :desc => 'Specify apiary host'
|
13
|
+
method_option :output, :type => :string, :banner => 'FILE', :desc => 'Write apiary.apib into specified file'
|
14
14
|
|
15
15
|
def fetch
|
16
16
|
cmd = Apiary::Command::Fetch.new options
|
17
17
|
cmd.execute
|
18
18
|
end
|
19
19
|
|
20
|
-
desc
|
21
|
-
method_option :browser, :type => :string, :enum => %w(chrome safari firefox), :banner =>
|
22
|
-
method_option :output, :type => :string, :banner =>
|
23
|
-
method_option :path, :type => :string, :desc =>
|
24
|
-
method_option :api_host, :type => :string, :banner =>
|
25
|
-
method_option :server, :type => :boolean, :desc =>
|
26
|
-
method_option :port, :type => :numeric, :banner =>
|
20
|
+
desc 'preview', 'Show API documentation in default browser'
|
21
|
+
method_option :browser, :type => :string, :enum => %w(chrome safari firefox), :banner => 'chrome|safari|firefox', :desc => 'Show API documentation in specified browser'
|
22
|
+
method_option :output, :type => :string, :banner => 'FILE', :desc => 'Write generated HTML into specified file'
|
23
|
+
method_option :path, :type => :string, :desc => 'Specify path to blueprint file', :default => 'apiary.apib'
|
24
|
+
method_option :api_host, :type => :string, :banner => 'HOST', :desc => 'Specify apiary host'
|
25
|
+
method_option :server, :type => :boolean, :desc => 'Start standalone web server on port 8080'
|
26
|
+
method_option :port, :type => :numeric, :banner => 'PORT', :desc => 'Set port for --server option'
|
27
27
|
|
28
28
|
def preview
|
29
29
|
cmd = Apiary::Command::Preview.new options
|
30
30
|
cmd.execute
|
31
31
|
end
|
32
32
|
|
33
|
-
desc
|
34
|
-
method_option :message, :type => :string, :banner =>
|
35
|
-
method_option :path, :type => :string, :desc =>
|
36
|
-
method_option :api_host, :type => :string, :banner =>
|
33
|
+
desc 'publish', 'Publish apiary.apib on docs.API_NAME.apiary.io'
|
34
|
+
method_option :message, :type => :string, :banner => 'COMMIT_MESSAGE', :desc => 'Publish with custom commit message'
|
35
|
+
method_option :path, :type => :string, :desc => 'Specify path to blueprint file', :default => 'apiary.apib'
|
36
|
+
method_option :api_host, :type => :string, :banner => 'HOST', :desc => 'Specify apiary host'
|
37
37
|
method_option :api_name, :type => :string, :required => true, :default => ''
|
38
38
|
|
39
39
|
def publish
|
@@ -41,7 +41,7 @@ module Apiary
|
|
41
41
|
cmd.execute
|
42
42
|
end
|
43
43
|
|
44
|
-
desc
|
44
|
+
desc 'version', 'Show version'
|
45
45
|
method_option :aliases => "-v"
|
46
46
|
|
47
47
|
def version
|
data/lib/apiary/command/fetch.rb
CHANGED
@@ -8,7 +8,6 @@ module Apiary
|
|
8
8
|
module Command
|
9
9
|
# Retrieve blueprint from apiary
|
10
10
|
class Fetch
|
11
|
-
|
12
11
|
attr_reader :options
|
13
12
|
|
14
13
|
# TODO: use OpenStruct to store @options
|
@@ -43,10 +42,10 @@ module Apiary
|
|
43
42
|
end
|
44
43
|
|
45
44
|
response = self.query_apiary(@options.api_host, @options.path)
|
46
|
-
|
47
|
-
response["code"]
|
48
|
-
else
|
45
|
+
if @options.output
|
49
46
|
write_generated_path(response["code"], @options.output)
|
47
|
+
else
|
48
|
+
response["code"]
|
50
49
|
end
|
51
50
|
end
|
52
51
|
|
@@ -3,30 +3,39 @@ require 'rest_client'
|
|
3
3
|
require 'rack'
|
4
4
|
require 'ostruct'
|
5
5
|
require 'json'
|
6
|
+
require 'tmpdir'
|
7
|
+
require 'erb'
|
6
8
|
|
7
9
|
require "apiary/common"
|
10
|
+
require "apiary/helpers/javascript_helper"
|
8
11
|
|
9
12
|
module Apiary
|
10
13
|
module Command
|
11
14
|
# Display preview of local blueprint file
|
12
15
|
class Preview
|
13
16
|
|
17
|
+
include Apiary::Helpers::JavascriptHelper
|
18
|
+
|
19
|
+
PREVIEW_TEMPLATE_PATH = "#{File.expand_path File.dirname(__FILE__)}/../file_templates/preview.erb"
|
20
|
+
|
14
21
|
BROWSERS = {
|
15
|
-
:safari =>
|
16
|
-
:chrome =>
|
17
|
-
:firefox =>
|
22
|
+
:safari => 'Safari',
|
23
|
+
:chrome => 'Google Chrome',
|
24
|
+
:firefox => 'Firefox'
|
18
25
|
}
|
19
26
|
|
20
27
|
attr_reader :options
|
21
28
|
|
22
29
|
def initialize(opts)
|
23
30
|
@options = OpenStruct.new(opts)
|
24
|
-
@options.path ||=
|
25
|
-
@options.api_host ||=
|
26
|
-
@options.headers ||= {:accept =>
|
31
|
+
@options.path ||= 'apiary.apib'
|
32
|
+
@options.api_host ||= 'api.apiary.io'
|
33
|
+
@options.headers ||= {:accept => 'text/html', :content_type => 'text/plain'}
|
27
34
|
@options.port ||= 8080
|
28
35
|
@options.proxy ||= ENV['http_proxy']
|
29
36
|
@options.server ||= false
|
37
|
+
|
38
|
+
validate_apib_file
|
30
39
|
end
|
31
40
|
|
32
41
|
def execute
|
@@ -42,12 +51,12 @@ module Apiary
|
|
42
51
|
end
|
43
52
|
|
44
53
|
def show
|
45
|
-
generate_static
|
54
|
+
generate_static
|
46
55
|
end
|
47
56
|
|
48
|
-
def validate_apib_file
|
57
|
+
def validate_apib_file
|
49
58
|
common = Apiary::Common.new
|
50
|
-
common.validate_apib_file(
|
59
|
+
common.validate_apib_file(@options.path)
|
51
60
|
end
|
52
61
|
|
53
62
|
def path
|
@@ -66,45 +75,12 @@ module Apiary
|
|
66
75
|
|
67
76
|
def run_server
|
68
77
|
app = self.rack_app do
|
69
|
-
|
78
|
+
generate
|
70
79
|
end
|
71
80
|
|
72
81
|
Rack::Server.start(:Port => @options.port, :app => app)
|
73
82
|
end
|
74
83
|
|
75
|
-
def preview_path(path)
|
76
|
-
basename = File.basename(@options.path)
|
77
|
-
"/tmp/#{basename}-preview.html"
|
78
|
-
end
|
79
|
-
|
80
|
-
def query_apiary(host, path)
|
81
|
-
url = "https://#{host}/blueprint/generate"
|
82
|
-
if validate_apib_file(path)
|
83
|
-
begin
|
84
|
-
data = File.read(path)
|
85
|
-
rescue
|
86
|
-
abort "File #{path} not found."
|
87
|
-
end
|
88
|
-
|
89
|
-
RestClient.proxy = @options.proxy
|
90
|
-
|
91
|
-
begin
|
92
|
-
RestClient.post(url, data, @options.headers)
|
93
|
-
rescue RestClient::BadRequest => e
|
94
|
-
err = JSON.parse e.response
|
95
|
-
if err.has_key? 'parserError'
|
96
|
-
abort "#{err['message']}: #{err['parserError']} (Line: #{err['line']}, Column: #{err['column']})"
|
97
|
-
else
|
98
|
-
abort "Apiary service responded with an error: #{err['message']}"
|
99
|
-
end
|
100
|
-
rescue RestClient::Exception => e
|
101
|
-
abort "Apiary service responded with an error: #{e.message}"
|
102
|
-
end
|
103
|
-
else
|
104
|
-
abort "Sorry, Apiary can't display invalid blueprint."
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
84
|
# TODO: add linux and windows systems
|
109
85
|
def open_generated_page(path)
|
110
86
|
exec "open #{browser_options} #{path}"
|
@@ -114,17 +90,49 @@ module Apiary
|
|
114
90
|
File.write(outfile, File.read(path))
|
115
91
|
end
|
116
92
|
|
117
|
-
def
|
118
|
-
|
119
|
-
|
93
|
+
def generate
|
94
|
+
template = load_preview_template
|
95
|
+
|
96
|
+
data = {
|
97
|
+
title: File.basename(@options.path, '.*'),
|
98
|
+
blueprint: load_blueprint
|
99
|
+
}
|
100
|
+
|
101
|
+
template.result(binding)
|
102
|
+
end
|
103
|
+
|
104
|
+
def generate_static
|
105
|
+
preview_string = generate
|
106
|
+
|
107
|
+
File.open(preview_path, 'w') do |file|
|
108
|
+
file.write preview_string
|
109
|
+
file.flush
|
120
110
|
@options.output ? write_generated_path(file.path, @options.output) : open_generated_page(file.path)
|
121
111
|
end
|
122
112
|
end
|
123
113
|
|
114
|
+
def load_blueprint
|
115
|
+
file = File.open @options.path, 'r'
|
116
|
+
file.read
|
117
|
+
end
|
118
|
+
|
119
|
+
def preview_path
|
120
|
+
basename = File.basename(@options.path, '.*')
|
121
|
+
temp = Dir.tmpdir
|
122
|
+
"#{temp}/#{basename}-preview.html"
|
123
|
+
end
|
124
|
+
|
125
|
+
def load_preview_template
|
126
|
+
file = File.open(PREVIEW_TEMPLATE_PATH, 'r')
|
127
|
+
template_string = file.read
|
128
|
+
ERB.new(template_string)
|
129
|
+
end
|
130
|
+
|
124
131
|
private
|
125
|
-
|
126
|
-
|
127
|
-
|
132
|
+
|
133
|
+
def browser_options
|
134
|
+
"-a #{BROWSERS[@options.browser.to_sym]}" if @options.browser
|
135
|
+
end
|
128
136
|
end
|
129
137
|
end
|
130
138
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8">
|
5
|
+
<title><%= data[:title] %></title>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<script src="https://api.apiary.io/seeds/embed.js"></script>
|
9
|
+
<script>
|
10
|
+
var embed = new Apiary.Embed({
|
11
|
+
apiBlueprint: "<%= escape_javascript data[:blueprint] %>"
|
12
|
+
});
|
13
|
+
</script>
|
14
|
+
</body>
|
15
|
+
</html>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Apiary
|
3
|
+
module Helpers
|
4
|
+
module JavascriptHelper
|
5
|
+
JS_ESCAPE_MAP = {
|
6
|
+
'\\' => '\\\\',
|
7
|
+
'</' => '<\/',
|
8
|
+
"\r\n" => '\n',
|
9
|
+
"\n" => '\n',
|
10
|
+
"\r" => '\n',
|
11
|
+
'"' => '\\"',
|
12
|
+
"'" => "\\'"
|
13
|
+
}
|
14
|
+
|
15
|
+
JS_ESCAPE_MAP["\342\200\250".force_encoding(Encoding::UTF_8).encode!] = '
'
|
16
|
+
JS_ESCAPE_MAP["\342\200\251".force_encoding(Encoding::UTF_8).encode!] = '
'
|
17
|
+
|
18
|
+
def escape_javascript(javascript)
|
19
|
+
if javascript
|
20
|
+
javascript.gsub(/(\\|<\/|\r\n|\342\200\250|\342\200\251|[\n\r"'])/u) {|match| JS_ESCAPE_MAP[match] }
|
21
|
+
else
|
22
|
+
''
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :j, :escape_javascript
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/apiary/version.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apiary::Command::Preview do
|
4
|
+
|
5
|
+
let(:command) do
|
6
|
+
opts = {
|
7
|
+
path: "#{File.expand_path File.dirname(__FILE__)}/../../features/fixtures/apiary.apib"
|
8
|
+
}
|
9
|
+
Apiary::Command::Preview.new(opts)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'check tmp path if contains filename' do
|
13
|
+
expect(command.preview_path()).to end_with('apiary-preview.html')
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'shoud contain html5 doctype' do
|
17
|
+
expect(command.generate()).to include('<!DOCTYPE html>')
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should contain embed javascript' do
|
21
|
+
expect(command.generate()).to include('https://api.apiary.io/seeds/embed.js')
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apiaryio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-05-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -193,6 +193,7 @@ files:
|
|
193
193
|
- README.md
|
194
194
|
- Rakefile
|
195
195
|
- apiary.gemspec
|
196
|
+
- appveyor.yml
|
196
197
|
- bin/apiary
|
197
198
|
- circle.yml
|
198
199
|
- features/fetch.feature
|
@@ -211,9 +212,12 @@ files:
|
|
211
212
|
- lib/apiary/command/preview.rb
|
212
213
|
- lib/apiary/command/publish.rb
|
213
214
|
- lib/apiary/common.rb
|
215
|
+
- lib/apiary/file_templates/preview.erb
|
216
|
+
- lib/apiary/helpers/javascript_helper.rb
|
214
217
|
- lib/apiary/version.rb
|
215
218
|
- spec/cli_spec.rb
|
216
219
|
- spec/command/fetch_spec.rb
|
220
|
+
- spec/command/preview_spec.rb
|
217
221
|
- spec/common_spec.rb
|
218
222
|
- spec/spec_helper.rb
|
219
223
|
- spec/support/aruba.rb
|
@@ -230,18 +234,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
230
234
|
- - ! '>='
|
231
235
|
- !ruby/object:Gem::Version
|
232
236
|
version: '0'
|
233
|
-
segments:
|
234
|
-
- 0
|
235
|
-
hash: -821896092872960155
|
236
237
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
237
238
|
none: false
|
238
239
|
requirements:
|
239
240
|
- - ! '>='
|
240
241
|
- !ruby/object:Gem::Version
|
241
242
|
version: '0'
|
242
|
-
segments:
|
243
|
-
- 0
|
244
|
-
hash: -821896092872960155
|
245
243
|
requirements: []
|
246
244
|
rubyforge_project:
|
247
245
|
rubygems_version: 1.8.23
|
@@ -261,6 +259,7 @@ test_files:
|
|
261
259
|
- features/version.feature
|
262
260
|
- spec/cli_spec.rb
|
263
261
|
- spec/command/fetch_spec.rb
|
262
|
+
- spec/command/preview_spec.rb
|
264
263
|
- spec/common_spec.rb
|
265
264
|
- spec/spec_helper.rb
|
266
265
|
- spec/support/aruba.rb
|