fdoc 0.2.7 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -70,7 +70,7 @@ fdoc is built to work around your Sinatra app specs in rspec, and provides `Fdoc
70
70
  ```ruby
71
71
  require 'fdoc/spec_watcher'
72
72
 
73
- describe Sinatra::Appllication do
73
+ describe Sinatra::Application do
74
74
  include Rack::Test::Methods
75
75
  include Fdoc::SpecWatcher
76
76
 
@@ -82,11 +82,11 @@ end
82
82
 
83
83
  ### Outside a Rails App
84
84
 
85
- fdoc provides the `fdoc_to_html` script to transform a directory of `.fdoc` files into more human-readable HTML.
85
+ fdoc provides the `fdoc convert` script to transform a directory of `.fdoc` files into more human-readable HTML.
86
86
 
87
87
  In this repo, try running:
88
88
 
89
- bin/fdoc_to_html ./spec/fixtures ./html
89
+ bin/fdoc convert ./spec/fixtures --output=./html
90
90
 
91
91
  ## Example
92
92
 
@@ -137,7 +137,7 @@ Our spec file, `spec/controllers/members_controller_spec.rb` looks like:
137
137
  require 'fdoc/spec_watcher'
138
138
 
139
139
  describe MembersController do
140
- content "#show", :fdoc => "members/list" do
140
+ context "#show", :fdoc => "members/list" do
141
141
  it "can take an offset" do
142
142
  get :show, {
143
143
  :offset => 5
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:<< File.expand_path("../lib", File.dirname(__FILE__))
4
+
5
+ require "rubygems"
6
+ require "fdoc"
7
+ require "fdoc/cli"
8
+
9
+ Fdoc::Cli.start
@@ -23,14 +23,16 @@ Gem::Specification.new do |s|
23
23
  s.files = Dir['{lib,spec}/**/*'] + %w(fdoc.gemspec Rakefile README.md Gemfile)
24
24
  s.test_files = Dir['spec/**/*']
25
25
  s.bindir = "bin"
26
- s.executables << "fdoc_to_html"
26
+ s.executables << "fdoc"
27
27
 
28
28
  s.add_dependency("json")
29
29
  s.add_dependency("json-schema", ">= 1.0.1")
30
30
  s.add_dependency("kramdown")
31
+ s.add_dependency("thor")
31
32
 
32
33
  s.add_development_dependency("rake")
33
34
  s.add_development_dependency("rspec", "~> 2.5")
34
35
  s.add_development_dependency("nokogiri")
35
36
  s.add_development_dependency("cane")
37
+ s.add_development_dependency("guard-rspec")
36
38
  end
@@ -0,0 +1,129 @@
1
+ require 'thor'
2
+ require 'fdoc/service'
3
+ require 'fdoc/meta_service'
4
+
5
+ module Fdoc
6
+ # A Thor::Error to be thrown when an fdoc directory is not found
7
+ class NotFound < Thor::Error; end
8
+
9
+ # A Thor::Error to be thrown when an fdoc output destination is unavailable
10
+ class NotADirectory < Thor::Error; end
11
+
12
+ # A Thor definition for an fdoc to HTML conversion operation
13
+ class Cli < Thor
14
+ include Thor::Actions
15
+
16
+ attr_accessor :origin_path
17
+
18
+ def self.source_root
19
+ File.expand_path("../templates", __FILE__)
20
+ end
21
+
22
+ desc "convert FDOC_PATH", "Convert fdoc to HTML"
23
+ method_option :output, :aliases => "-o", :desc => "HTML output path"
24
+ method_option :url_base_path, :aliases => "-u", :desc => "URL base path"
25
+ def convert(fdoc_path)
26
+ say_status nil, "Converting fdoc to HTML"
27
+
28
+ self.origin_path = File.expand_path(fdoc_path)
29
+ raise Fdoc::NotFound.new(origin_path) unless has_valid_origin?
30
+ say_status :using, fdoc_path
31
+
32
+ self.destination_root = output_path
33
+ raise Fdoc::NotADirectory.new(output_path) unless has_valid_destination?
34
+ say_status :inside, output_path
35
+
36
+ in_root do
37
+ copy_file("styles.css")
38
+ create_file("index.html", meta_presenter.to_html) if has_meta_service?
39
+ end
40
+
41
+ service_presenters.each do |service_presenter|
42
+ inside_service_presenter(service_presenter) do
43
+ create_file("index.html", service_presenter.to_html)
44
+
45
+ service_presenter.endpoints.each do |endpoint_prefix_group|
46
+ endpoint_prefix_group.each do |endpoint|
47
+ create_file(endpoint.url, endpoint.to_html)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ no_tasks do
55
+ def inside_service_presenter(service, &block)
56
+ if has_meta_service?
57
+ inside(service.slug_name, {:verbose => true}, &block)
58
+ else
59
+ in_root(&block)
60
+ end
61
+ end
62
+
63
+ def output_path
64
+ @output_path ||=
65
+ if options[:output]
66
+ File.expand_path(options[:output])
67
+ else
68
+ File.expand_path("../html", origin_path)
69
+ end
70
+ end
71
+
72
+ def has_valid_origin?
73
+ origin.directory?
74
+ end
75
+
76
+ def has_valid_destination?
77
+ !destination.exist? || destination.directory?
78
+ end
79
+
80
+ def has_meta_service?
81
+ !meta_service.empty?
82
+ end
83
+
84
+ def service_presenters
85
+ @service_presenters ||= services.map do |service|
86
+ Fdoc::ServicePresenter.new(service, html_options)
87
+ end
88
+ end
89
+
90
+ def html_options
91
+ {
92
+ :static_html => true,
93
+ :url_base_path => options[:url_base_path],
94
+ :html_directory => destination_root
95
+ }
96
+ end
97
+ end
98
+
99
+ private
100
+
101
+ def services
102
+ @services ||=
103
+ if has_meta_service?
104
+ meta_service.services
105
+ else
106
+ [Fdoc::Service.new(origin_path)]
107
+ end
108
+ end
109
+
110
+ def meta_presenter
111
+ @meta_presenter ||= Fdoc::MetaServicePresenter.new(
112
+ meta_service,
113
+ html_options
114
+ )
115
+ end
116
+
117
+ def meta_service
118
+ @meta_service ||= Fdoc::MetaService.new(origin_path)
119
+ end
120
+
121
+ def origin
122
+ Pathname.new(origin_path)
123
+ end
124
+
125
+ def destination
126
+ Pathname.new(destination_root)
127
+ end
128
+ end
129
+ end
@@ -22,9 +22,13 @@ class Fdoc::Endpoint
22
22
 
23
23
  def consume_response(params, status_code, successful=true)
24
24
  response_code = response_codes.find do |rc|
25
- rc["status"] == status_code && rc["successful"] == successful
25
+ rc["successful"] == successful && (
26
+ rc["status"] == status_code || # 200
27
+ rc["status"].to_i == status_code # "200 OK"
28
+ )
26
29
  end
27
30
 
31
+
28
32
  if !response_code
29
33
  raise Fdoc::UndocumentedResponseCode,
30
34
  'Undocumented response: %s, successful: %s' % [
@@ -8,50 +8,62 @@ module Fdoc
8
8
  define_method(verb) do |*params|
9
9
  action, request_params = params
10
10
 
11
- request_params = if request_params.kind_of?(Hash)
12
- request_params
13
- else
14
- begin
15
- JSON.parse(request_params)
16
- rescue
17
- {}
18
- end
19
- end
11
+ super(*params)
20
12
 
21
- result = super(*params)
22
-
23
- path = if respond_to?(:example) # Rspec 2
24
- example.metadata[:fdoc]
25
- else # Rspec 1.3.2
26
- opts = {}
27
- __send__(:example_group_hierarchy).each do |example|
28
- opts.merge!(example.options)
29
- end
30
- opts.merge!(options)
31
- opts[:fdoc]
32
- end
13
+ check_response(verb, request_params) if path
14
+ end
15
+ end
33
16
 
34
- real_response = if respond_to? :response
35
- # we are on rails
36
- response
37
- else
38
- # we are on sinatra
39
- last_response
17
+ private
18
+
19
+ def check_response(verb, request_params)
20
+ successful = Fdoc.decide_success(response_params, real_response.status)
21
+ Service.verify!(verb, path, parsed_request_params(request_params), response_params,
22
+ real_response.status, successful)
23
+ end
24
+
25
+ def parsed_request_params request_params
26
+ if request_params.kind_of?(Hash)
27
+ request_params
28
+ else
29
+ begin
30
+ JSON.parse(request_params)
31
+ rescue
32
+ {}
40
33
  end
34
+ end
35
+ end
41
36
 
42
- if path
43
- response_params = begin
44
- JSON.parse(real_response.body)
45
- rescue
46
- {}
47
- end
48
- successful = Fdoc.decide_success(response_params, real_response.status)
49
- Service.verify!(verb, path, request_params, response_params,
50
- real_response.status, successful)
37
+ def path
38
+ if respond_to?(:example) # Rspec 2
39
+ example.metadata[:fdoc]
40
+ else # Rspec 1.3.2
41
+ opts = {}
42
+ __send__(:example_group_hierarchy).each do |example|
43
+ opts.merge!(example.options)
51
44
  end
45
+ opts.merge!(options)
46
+ opts[:fdoc]
47
+ end
48
+ end
52
49
 
53
- result
50
+ def real_response
51
+ if respond_to? :response
52
+ # we are on rails
53
+ response
54
+ else
55
+ # we are on sinatra
56
+ last_response
54
57
  end
55
58
  end
59
+
60
+ def response_params
61
+ begin
62
+ JSON.parse(real_response.body)
63
+ rescue
64
+ {}
65
+ end
66
+ end
67
+
56
68
  end
57
69
  end
@@ -0,0 +1,257 @@
1
+ require "spec_helper"
2
+
3
+ describe Fdoc::Cli do
4
+ let(:fixtures_path) { File.expand_path("../../fixtures", __FILE__) }
5
+ let(:temporary_path) { Dir.mktmpdir("fdoc-cli") }
6
+ let(:fdoc_path) { File.expand_path("fdoc", temporary_path) }
7
+ let(:html_path) { File.expand_path("html", temporary_path) }
8
+ let(:options) { {} }
9
+
10
+ subject(:cli) { Fdoc::Cli.new([fdoc_path], options) }
11
+
12
+ before { FileUtils.mkdir_p(fdoc_path) }
13
+
14
+ around { |e| capture(:stdout, &e) }
15
+
16
+ def with_fixture(fixture_file, destination_file = nil)
17
+ destination = File.expand_path(destination_file || fixture_file, fdoc_path)
18
+ FileUtils.mkdir_p(File.dirname(destination))
19
+ source = File.expand_path(fixture_file, fixtures_path)
20
+ FileUtils.cp(source, destination)
21
+ end
22
+
23
+ describe "#convert" do
24
+ let(:styles_css_path) { File.expand_path("styles.css", html_path) }
25
+
26
+ context "when the fdoc path does not exist" do
27
+ before { FileUtils.rmdir(fdoc_path) }
28
+
29
+ it "raises an exception" do
30
+ expect do
31
+ cli.convert(fdoc_path)
32
+ end.to raise_exception(Fdoc::NotFound)
33
+ end
34
+ end
35
+
36
+ context "when the fdoc path exists" do
37
+ context "when the destination does not exist" do
38
+ it "makes a destination directory" do
39
+ expect do
40
+ cli.convert(fdoc_path)
41
+ end.to change { File.directory?(html_path) }.to(true)
42
+ end
43
+ end
44
+
45
+ context "when the destination exists as a file" do
46
+ before { FileUtils.touch(html_path) }
47
+
48
+ it "raises an exception" do
49
+ expect do
50
+ cli.convert(fdoc_path)
51
+ end.to raise_exception(Fdoc::NotADirectory)
52
+ end
53
+ end
54
+
55
+ it "copies the css to the destination" do
56
+ expect do
57
+ cli.convert(fdoc_path)
58
+ end.to change { File.exist?(styles_css_path) }.from(false)
59
+ end
60
+
61
+ context "when there is a meta service fdoc" do
62
+ let(:root_html) { File.expand_path("index.html", html_path) }
63
+ let(:members_html) do
64
+ File.expand_path("members_api/index.html", html_path)
65
+ end
66
+ let(:endpoint_html) do
67
+ File.expand_path("members_api/add-PUT.html", html_path)
68
+ end
69
+
70
+ before { with_fixture("sample_group.fdoc.meta") }
71
+
72
+ context "when no service fdoc exists" do
73
+ specify { expect { cli.convert(fdoc_path) }.to raise_error }
74
+ end
75
+
76
+ context "when a service fdoc exists" do
77
+ before { with_fixture("members/members.fdoc.service") }
78
+
79
+ it "creates a root-level html file" do
80
+ expect do
81
+ cli.convert(fdoc_path)
82
+ end.to change { File.exist?(root_html) }.from(false)
83
+ end
84
+
85
+ it "writes the service-level html file" do
86
+ expect do
87
+ cli.convert(fdoc_path)
88
+ end.to change { File.exist?(members_html) }.from(false)
89
+ end
90
+
91
+ context "when an endpoint fdoc exists" do
92
+ before { with_fixture("members/add-PUT.fdoc") }
93
+
94
+ it "writes the endpoint html file" do
95
+ expect do
96
+ cli.convert(fdoc_path)
97
+ end.to change { File.exist?(endpoint_html) }.from(false)
98
+ end
99
+ end
100
+ end
101
+ end
102
+
103
+ context "when there is no meta service fdoc" do
104
+ let(:root_html) { File.expand_path("index.html", html_path) }
105
+ let(:endpoint_html) do
106
+ File.expand_path("add-PUT.html", html_path)
107
+ end
108
+
109
+ context "when no service fdoc exists" do
110
+ it "creates a dummy index" do
111
+ expect do
112
+ cli.convert(fdoc_path)
113
+ end.to change { File.exist?(root_html) }.from(false)
114
+ end
115
+ end
116
+
117
+ context "when a service fdoc exists" do
118
+ before do
119
+ with_fixture("members/members.fdoc.service", "a.fdoc.service")
120
+ end
121
+
122
+ it "writes the service-level html file" do
123
+ expect do
124
+ cli.convert(fdoc_path)
125
+ end.to change { File.exist?(root_html) }.from(false)
126
+ end
127
+
128
+ context "when an endpoint fdoc exists" do
129
+ before { with_fixture("members/add-PUT.fdoc", "add-PUT.fdoc") }
130
+
131
+ it "writes the endpoint html file" do
132
+ expect do
133
+ cli.convert(fdoc_path)
134
+ end.to change { File.exist?(endpoint_html) }.from(false)
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ describe "accessors" do
143
+ before do
144
+ subject.origin_path = fdoc_path
145
+ subject.destination_root = html_path
146
+ end
147
+
148
+ context "by default" do
149
+ it { should_not have_meta_service }
150
+ its(:service_presenters) { should have(1).service }
151
+ its(:output_path) { should =~ /html$/ }
152
+ end
153
+
154
+ context "when an output path is specified" do
155
+ let(:output_option) { "/a/path/for/html" }
156
+ let(:options) { {:output => output_option} }
157
+
158
+ its(:output_path) { should == output_option }
159
+ end
160
+
161
+ context "when a meta service file exists" do
162
+ before { with_fixture("sample_group.fdoc.meta") }
163
+
164
+ it { should have_meta_service }
165
+ its(:service_presenters) { should have(1).service }
166
+ end
167
+
168
+ context "when the origin is a directory" do
169
+ it { should have_valid_origin }
170
+ end
171
+
172
+ context "when the origin does not exist" do
173
+ before { FileUtils.rmdir(fdoc_path) }
174
+
175
+ it { should_not have_valid_origin }
176
+ end
177
+
178
+ context "when the origin is not a directory" do
179
+ before do
180
+ FileUtils.rmdir(fdoc_path)
181
+ FileUtils.touch(fdoc_path)
182
+ end
183
+
184
+ it { should_not have_valid_origin }
185
+ end
186
+
187
+ context "when the destination does not exist" do
188
+ it { should have_valid_destination }
189
+ end
190
+
191
+ context "when the destination is a directory" do
192
+ before { FileUtils.mkdir_p(html_path) }
193
+
194
+ it { should have_valid_destination }
195
+ end
196
+
197
+ context "when the destination is not a directory" do
198
+ before { FileUtils.touch(html_path) }
199
+
200
+ it { should_not have_valid_destination }
201
+ end
202
+ end
203
+
204
+ describe "#html_options" do
205
+ let(:html_path) { "/a/great/place/to/keep/html"}
206
+
207
+ before { subject.destination_root = html_path }
208
+
209
+ its(:html_options) { should include(:static_html => true) }
210
+ its(:html_options) { should include(:html_directory => html_path) }
211
+
212
+ context "when url_base_path is not provided" do
213
+ its(:html_options) { should include(:url_base_path => nil) }
214
+ end
215
+
216
+ context "when url_base_path is provided" do
217
+ let(:url_base_path) { "totally/not/like/a/wsdl" }
218
+ let(:options) { {:url_base_path => url_base_path} }
219
+
220
+ its(:html_options) { should include(:url_base_path => url_base_path) }
221
+ end
222
+ end
223
+
224
+ describe "#inside_service" do
225
+ let(:presenter) { cli.service_presenters.first }
226
+
227
+ before do
228
+ subject.origin_path = fdoc_path
229
+ subject.destination_root = html_path
230
+ end
231
+
232
+ context "when there is a meta service" do
233
+ before do
234
+ with_fixture("sample_group.fdoc.meta")
235
+ with_fixture("members/members.fdoc.service")
236
+ end
237
+
238
+ it "leaves the output directory" do
239
+ cli.inside_service_presenter(presenter) do
240
+ Dir.pwd.should =~ %r|#{html_path}/members_api$|
241
+ end
242
+ end
243
+ end
244
+
245
+ context "when there is a single service" do
246
+ before do
247
+ with_fixture("members/members.fdoc.service", "members.fdoc.service")
248
+ end
249
+
250
+ it "does not leave the output directory" do
251
+ cli.inside_service_presenter(presenter) do
252
+ Dir.pwd.should =~ /#{html_path}$/
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end
@@ -217,6 +217,10 @@ describe Fdoc::Endpoint do
217
217
  subject.consume_response(good_response_params, "200 OK").should be_true
218
218
  end
219
219
 
220
+ it "allows either fully-qualified or integer HTTP status codes" do
221
+ subject.consume_response(good_response_params, 200).should be_true
222
+ end
223
+
220
224
  context "with unknown keys" do
221
225
  it "throws an error when there an unknown key at the top level" do
222
226
  bad_params = good_response_params.merge({"extra_goodness" => true})
@@ -1,2 +1,9 @@
1
1
  require 'fdoc'
2
+ require 'fdoc/cli'
2
3
  require 'rspec'
4
+
5
+ Dir.glob(File.expand_path("../support/*.rb", __FILE__)).each { |f| require f }
6
+
7
+ RSpec.configure do |config|
8
+ config.include CaptureHelper
9
+ end
@@ -0,0 +1,14 @@
1
+ module CaptureHelper
2
+ def capture(stream)
3
+ begin
4
+ stream = stream.to_s
5
+ eval "$#{stream} = StringIO.new"
6
+ yield
7
+ result = eval("$#{stream}").string
8
+ ensure
9
+ eval("$#{stream} = #{stream.upcase}")
10
+ end
11
+
12
+ result
13
+ end
14
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fdoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -15,7 +15,7 @@ date: 2011-11-07 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: json
18
- requirement: &70224688026140 !ruby/object:Gem::Requirement
18
+ requirement: !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,15 @@ dependencies:
23
23
  version: '0'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *70224688026140
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
27
32
  - !ruby/object:Gem::Dependency
28
33
  name: json-schema
29
- requirement: &70224688025480 !ruby/object:Gem::Requirement
34
+ requirement: !ruby/object:Gem::Requirement
30
35
  none: false
31
36
  requirements:
32
37
  - - ! '>='
@@ -34,10 +39,15 @@ dependencies:
34
39
  version: 1.0.1
35
40
  type: :runtime
36
41
  prerelease: false
37
- version_requirements: *70224688025480
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.1
38
48
  - !ruby/object:Gem::Dependency
39
49
  name: kramdown
40
- requirement: &70224688024780 !ruby/object:Gem::Requirement
50
+ requirement: !ruby/object:Gem::Requirement
41
51
  none: false
42
52
  requirements:
43
53
  - - ! '>='
@@ -45,10 +55,31 @@ dependencies:
45
55
  version: '0'
46
56
  type: :runtime
47
57
  prerelease: false
48
- version_requirements: *70224688024780
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ - !ruby/object:Gem::Dependency
65
+ name: thor
66
+ requirement: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ type: :runtime
73
+ prerelease: false
74
+ version_requirements: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
49
80
  - !ruby/object:Gem::Dependency
50
81
  name: rake
51
- requirement: &70224688023900 !ruby/object:Gem::Requirement
82
+ requirement: !ruby/object:Gem::Requirement
52
83
  none: false
53
84
  requirements:
54
85
  - - ! '>='
@@ -56,10 +87,15 @@ dependencies:
56
87
  version: '0'
57
88
  type: :development
58
89
  prerelease: false
59
- version_requirements: *70224688023900
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
60
96
  - !ruby/object:Gem::Dependency
61
97
  name: rspec
62
- requirement: &70224688023100 !ruby/object:Gem::Requirement
98
+ requirement: !ruby/object:Gem::Requirement
63
99
  none: false
64
100
  requirements:
65
101
  - - ~>
@@ -67,10 +103,15 @@ dependencies:
67
103
  version: '2.5'
68
104
  type: :development
69
105
  prerelease: false
70
- version_requirements: *70224688023100
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ~>
110
+ - !ruby/object:Gem::Version
111
+ version: '2.5'
71
112
  - !ruby/object:Gem::Dependency
72
113
  name: nokogiri
73
- requirement: &70224688022600 !ruby/object:Gem::Requirement
114
+ requirement: !ruby/object:Gem::Requirement
74
115
  none: false
75
116
  requirements:
76
117
  - - ! '>='
@@ -78,10 +119,31 @@ dependencies:
78
119
  version: '0'
79
120
  type: :development
80
121
  prerelease: false
81
- version_requirements: *70224688022600
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
82
128
  - !ruby/object:Gem::Dependency
83
129
  name: cane
84
- requirement: &70224688022020 !ruby/object:Gem::Requirement
130
+ requirement: !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ - !ruby/object:Gem::Dependency
145
+ name: guard-rspec
146
+ requirement: !ruby/object:Gem::Requirement
85
147
  none: false
86
148
  requirements:
87
149
  - - ! '>='
@@ -89,16 +151,22 @@ dependencies:
89
151
  version: '0'
90
152
  type: :development
91
153
  prerelease: false
92
- version_requirements: *70224688022020
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
93
160
  description: A tool for documenting API endpoints.
94
161
  email: support@squareup.com
95
162
  executables:
96
- - fdoc_to_html
163
+ - fdoc
97
164
  extensions: []
98
165
  extra_rdoc_files:
99
166
  - README.md
100
167
  files:
101
168
  - lib/endpoint-schema.yaml
169
+ - lib/fdoc/cli.rb
102
170
  - lib/fdoc/endpoint.rb
103
171
  - lib/fdoc/endpoint_scaffold.rb
104
172
  - lib/fdoc/meta_service.rb
@@ -115,6 +183,7 @@ files:
115
183
  - lib/fdoc/templates/service.html.erb
116
184
  - lib/fdoc/templates/styles.css
117
185
  - lib/fdoc.rb
186
+ - spec/fdoc/cli_spec.rb
118
187
  - spec/fdoc/endpoint_scaffold_spec.rb
119
188
  - spec/fdoc/endpoint_spec.rb
120
189
  - spec/fdoc/presenters/endpoint_presenter_spec.rb
@@ -129,11 +198,12 @@ files:
129
198
  - spec/fixtures/members/members.fdoc.service
130
199
  - spec/fixtures/sample_group.fdoc.meta
131
200
  - spec/spec_helper.rb
201
+ - spec/support/capture_helper.rb
132
202
  - fdoc.gemspec
133
203
  - Rakefile
134
204
  - README.md
135
205
  - Gemfile
136
- - bin/fdoc_to_html
206
+ - bin/fdoc
137
207
  homepage: http://github.com/square/fdoc
138
208
  licenses: []
139
209
  post_install_message:
@@ -155,11 +225,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
225
  version: '0'
156
226
  requirements: []
157
227
  rubyforge_project:
158
- rubygems_version: 1.8.15
228
+ rubygems_version: 1.8.24
159
229
  signing_key:
160
230
  specification_version: 3
161
231
  summary: A tool for documenting API endpoints.
162
232
  test_files:
233
+ - spec/fdoc/cli_spec.rb
163
234
  - spec/fdoc/endpoint_scaffold_spec.rb
164
235
  - spec/fdoc/endpoint_spec.rb
165
236
  - spec/fdoc/presenters/endpoint_presenter_spec.rb
@@ -174,4 +245,4 @@ test_files:
174
245
  - spec/fixtures/members/members.fdoc.service
175
246
  - spec/fixtures/sample_group.fdoc.meta
176
247
  - spec/spec_helper.rb
177
- has_rdoc:
248
+ - spec/support/capture_helper.rb
@@ -1,77 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require File.join(File.dirname(__FILE__), '../lib/fdoc')
4
-
5
- if ARGV.length < 2
6
- exec_name = File.basename($0)
7
- abort "Usage: #{exec_name} [fdoc_directory] [html_directory] (url_base_path)"
8
- end
9
-
10
- fdoc_directory, html_directory, url_base_path = ARGV[0..2]
11
- fdoc_directory = File.expand_path(fdoc_directory)
12
- html_directory = File.expand_path(html_directory)
13
-
14
- html_options = {
15
- :html_directory => html_directory,
16
- :static_html => true,
17
- :url_base_path => url_base_path
18
- }
19
-
20
- def mkdir(dirname)
21
- `mkdir -p #{dirname}` unless File.directory?(dirname)
22
- end
23
-
24
- mkdir(html_directory)
25
-
26
- meta_service = Fdoc::MetaService.new(fdoc_directory)
27
- services = if !meta_service.empty?
28
- meta_service.services
29
- else
30
- Array(Fdoc::Service.new(fdoc_directory))
31
- end
32
-
33
- if !meta_service.empty?
34
- meta_service_presenter= Fdoc::MetaServicePresenter.new(
35
- meta_service, html_options
36
- )
37
-
38
- index_html_path = File.join(html_directory, "index.html")
39
- File.open(index_html_path, "w") do |file|
40
- file.write(meta_service_presenter.to_html)
41
-
42
- puts "created #{index_html_path}"
43
- end
44
- end
45
-
46
- css_path = File.join(File.dirname(__FILE__), '../lib/fdoc/templates/styles.css')
47
- `cp "#{css_path}" "#{html_directory}"`
48
- puts "created #{File.expand_path(css_path)}"
49
-
50
- services.each do |service|
51
- service_presenter = Fdoc::ServicePresenter.new(service, html_options)
52
- html_sub_directory = if meta_service.empty?
53
- html_directory
54
- else
55
- File.join(html_directory, service_presenter.slug_name)
56
- end
57
-
58
- mkdir(html_sub_directory)
59
-
60
- index_html_path = File.join(html_sub_directory, "index.html")
61
- File.open(index_html_path, "w") do |file|
62
- file.write(service_presenter.to_html)
63
-
64
- puts "created #{index_html_path}"
65
- end
66
-
67
- service_presenter.endpoints.flatten.each do |endpoint|
68
- endpoint_html_path = File.join(html_sub_directory, endpoint.url)
69
- mkdir(File.dirname(endpoint_html_path))
70
-
71
- File.open(endpoint_html_path, "w") do |file|
72
- file.write(endpoint.to_html)
73
-
74
- puts "created #{endpoint_html_path}"
75
- end
76
- end
77
- end