lurker 0.6.6 → 0.6.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.hound.yml +3 -0
  5. data/.rubocop.yml +3 -0
  6. data/.travis.yml +15 -5
  7. data/Appraisals +20 -0
  8. data/Gemfile +11 -7
  9. data/README.md +46 -19
  10. data/features/atom_persistent_within_the_same_type.feature +3 -2
  11. data/features/controller_nested_schema_scaffolding.feature +2 -1
  12. data/features/controller_schema_scaffolding.feature +2 -1
  13. data/features/dereferencing_through_inlining.feature +2 -1
  14. data/features/html_generation.feature +5 -4
  15. data/features/minitest.feature +3 -2
  16. data/features/multidomain_support.feature +5 -5
  17. data/features/multitype_request_support.feature +3 -2
  18. data/features/partials.feature +6 -5
  19. data/features/request_nested_schema_scaffolding.feature +3 -3
  20. data/features/request_schema_scaffolding.feature +3 -2
  21. data/features/schema_suffixes.feature +2 -2
  22. data/features/schema_updating_within_test_suite.feature +3 -2
  23. data/features/step_definitions/additional_cli_steps.rb +7 -1
  24. data/features/support/env.rb +13 -6
  25. data/features/test_endpoint.feature +2 -30
  26. data/gemfiles/rails_32.gemfile +27 -0
  27. data/gemfiles/rails_40.gemfile +27 -0
  28. data/gemfiles/rails_41.gemfile +27 -0
  29. data/gemfiles/rails_42.gemfile +27 -0
  30. data/lib/lurker.rb +1 -1
  31. data/lib/lurker/cli.rb +29 -31
  32. data/lib/lurker/server.rb +7 -6
  33. data/lib/lurker/spec_helper/rails.rb +2 -0
  34. data/lib/lurker/spy.rb +16 -2
  35. data/lib/lurker/templates/public/application.css +1 -5
  36. data/lib/lurker/templates/public/application.js +12 -12
  37. data/lib/lurker/version.rb +1 -1
  38. data/lurker-bw.svg +19 -0
  39. data/lurker.gemspec +12 -6
  40. data/tasks/deploy.rake +1 -1
  41. data/tasks/generate.rake +13 -6
  42. data/templates/generate_stuff.rb +15 -9
  43. data/templates/lurker_app.rb +3 -0
  44. metadata +35 -18
  45. metadata.gz.sig +0 -0
  46. data/gemfiles/Gemfile32.ci +0 -6
  47. data/gemfiles/Gemfile40.ci +0 -6
  48. data/gemfiles/Gemfile41.ci +0 -6
  49. data/lib/lurker/engine.rb +0 -14
  50. data/lib/lurker/templates/stylesheets/bootstrap.css +0 -5831
@@ -8,7 +8,6 @@ Feature: request nested schema scaffolding
8
8
  require "spec_helper"
9
9
 
10
10
  describe Api::V1::ReposController, :lurker do
11
-
12
11
  let!(:user) do
13
12
  User.where(name: 'razum2um').first_or_create!.tap do |u|
14
13
  u.repos.first_or_create!(name: 'lurker')
@@ -16,7 +15,7 @@ Feature: request nested schema scaffolding
16
15
  end
17
16
 
18
17
  it "shows a user's repo" do
19
- get "api/v1/users/#{user.id}/repos/#{user.repos.first.id}.json"
18
+ get "/api/v1/users/#{user.id}/repos/#{user.repos.first.id}.json"
20
19
  expect(response).to be_success
21
20
  end
22
21
  end
@@ -62,9 +61,10 @@ Feature: request nested schema scaffolding
62
61
  method: GET
63
62
  path_info: "/api/v1/users/1/repos/1.json"
64
63
  path_params:
65
- action: show
66
64
  controller: api/v1/repos
65
+ action: show
67
66
  user_id: '1'
68
67
  id: '1'
69
68
 
70
69
  """
70
+
@@ -19,7 +19,7 @@ Feature: request schema scaffolding
19
19
  end
20
20
 
21
21
  it "lists all the users" do
22
- get "api/v1/users.json?limit=1"
22
+ get "/api/v1/users.json?limit=1"
23
23
  expect(response).to be_success
24
24
  expect(JSON.parse(response.body).size).to eq 1
25
25
  end
@@ -72,9 +72,10 @@ Feature: request schema scaffolding
72
72
  method: GET
73
73
  path_info: "/api/v1/users.json"
74
74
  path_params:
75
- action: index
76
75
  controller: api/v1/users
76
+ action: index
77
77
  query_params:
78
78
  limit: '1'
79
79
 
80
80
  """
81
+
@@ -49,8 +49,8 @@ Feature: schema suffixes
49
49
  path_info: "/api/v1/users/razum2um/repos/lurker.json"
50
50
  method: PATCH
51
51
  path_params:
52
- action: update
53
52
  controller: api/v1/repos
53
+ action: update
54
54
  user_id: razum2um
55
55
  id: lurker
56
56
  """
@@ -120,8 +120,8 @@ Feature: schema suffixes
120
120
  method: PATCH
121
121
  suffix: 'failed'
122
122
  path_params:
123
- action: update
124
123
  controller: api/v1/repos
124
+ action: update
125
125
  user_id: razum2um
126
126
  id: lurker
127
127
  """
@@ -54,9 +54,9 @@ Feature: schema updating within test suite
54
54
  method: PATCH
55
55
  path_info: "/api/v2/users/1"
56
56
  path_params:
57
- id: '1'
58
57
  controller: api/v2/users
59
58
  action: update
59
+ id: '1'
60
60
  """
61
61
 
62
62
  Scenario: json schema tests response parameters and request parameters and show errors from both using "users/update"
@@ -166,8 +166,9 @@ Feature: schema updating within test suite
166
166
  method: PATCH
167
167
  path_info: "/api/v2/users/1"
168
168
  path_params:
169
- id: '1'
170
169
  controller: api/v2/users
171
170
  action: update
171
+ id: '1'
172
172
 
173
173
  """
174
+
@@ -6,10 +6,16 @@ Given /^a checked file "([^"]*)" with:$/ do |file_name, file_content|
6
6
  end
7
7
 
8
8
  Given /^an empty directory named "([^"]*)"$/ do |dir_name|
9
- FileUtils.rm_rf File.expand_path("../../../tmp/lurker_app/#{dir_name}", __FILE__)
9
+ in_current_dir { _rm_rf(dir_name) }
10
10
  create_dir(dir_name)
11
11
  end
12
12
 
13
+ Given /^a service file with:$/ do |file_content|
14
+ in_current_dir do
15
+ write_file("#{Lurker::DEFAULT_SERVICE_PATH}/#{Rails.application.class.parent_name}#{Lurker::Service::SUFFIX}", file_content)
16
+ end
17
+ end
18
+
13
19
  When /^I go to "([^"]*)"$/ do |url|
14
20
  visit(url)
15
21
  end
@@ -6,6 +6,14 @@ SimpleCov.start do
6
6
  end
7
7
  end
8
8
 
9
+ def example_path
10
+ if rails_version = ENV['BUNDLE_GEMFILE'].to_s.match(/rails_\d\d/)
11
+ File.expand_path("../../../tmp/lurker_app_#{rails_version}", __FILE__)
12
+ else
13
+ raise "Use `appraisal rails-XY cucumber ...` or export BUNDLE_GEMFILE=gemfiles/... explicitly"
14
+ end
15
+ end
16
+
9
17
  require 'fileutils'
10
18
  require 'aruba/cucumber'
11
19
 
@@ -16,7 +24,7 @@ require 'capybara'
16
24
  require 'capybara/dsl'
17
25
  require 'capybara/cucumber'
18
26
  require 'capybara/poltergeist'
19
- require File.expand_path('../../../tmp/lurker_app/config/environment', __FILE__)
27
+ require "#{example_path}/config/environment"
20
28
  require 'database_cleaner'
21
29
  require 'database_cleaner/cucumber'
22
30
 
@@ -34,15 +42,14 @@ Aruba.configure do |config|
34
42
  end
35
43
 
36
44
  Before do
37
- @dirs = ["tmp/lurker_app"]
45
+ @dirs = [example_path]
38
46
  @aruba_timeout_seconds = 30
39
47
  DatabaseCleaner.start
40
48
  if ENV['CLEAN']
41
49
  system "bin/spring stop"
42
- FileUtils.rm_rf File.expand_path('../../../tmp/lurker_app/lurker', __FILE__)
43
- FileUtils.rm_rf File.expand_path('../../../tmp/lurker_app/html', __FILE__)
44
- FileUtils.rm_rf File.expand_path('../../../tmp/lurker_app/spec/requests', __FILE__)
45
- FileUtils.rm_rf File.expand_path('../../../tmp/lurker_app/spec/controllers', __FILE__)
50
+ %w[lurker html public/lurker spec/requests spec/controllers].each do |dir_name|
51
+ in_current_dir { _rm_rf(dir_name) }
52
+ end
46
53
  end
47
54
  end
48
55
 
@@ -48,8 +48,8 @@ Feature: test endpoint
48
48
  path_info: "/api/v1/users/1"
49
49
  method: PATCH
50
50
  path_params:
51
- action: update
52
51
  controller: api/v1/users
52
+ action: update
53
53
  id: 1
54
54
  """
55
55
 
@@ -75,35 +75,6 @@ Feature: test endpoint
75
75
  When I run `bin/rspec spec/controllers/api/v1/users_controller_spec.rb`
76
76
  Then the example should pass
77
77
 
78
- Scenario: json schema tests request parameters and tell what fails using "users/update"
79
- Given a file named "spec/controllers/api/v1/users_controller_spec.rb" with:
80
- """ruby
81
- require "spec_helper"
82
-
83
- describe Api::V1::UsersController, :lurker do
84
- render_views
85
-
86
- let(:user) do
87
- User.where(name: 'razum2um').first_or_create!
88
- end
89
-
90
- it "updates a user" do
91
- patch :update, id: user.id, user: { name: 1 }, format: 'json'
92
- expect(response).to be_success
93
- end
94
- end
95
- """
96
-
97
- When I run `bin/rspec spec/controllers/api/v1/users_controller_spec.rb`
98
- Then the output should contain failures:
99
- """
100
- Lurker::ValidationError:
101
- Response
102
- The property '#/name' of type Fixnum did not match the following type: string
103
-
104
- 1 example, 1 failure
105
- """
106
-
107
78
  Scenario: json schema tests response parameters and tell what fails using "users/update"
108
79
  Given a file named "spec/controllers/api/v1/users_controller_blank_spec.rb" with:
109
80
  """ruby
@@ -132,3 +103,4 @@ Feature: test endpoint
132
103
 
133
104
  1 example, 1 failure
134
105
  """
106
+
@@ -0,0 +1,27 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 3.2.21"
6
+
7
+ group :development do
8
+ gem "pry-byebug", :platforms => [:mri_20, :mri_21, :mri_22]
9
+ gem "pry-debugger", :platforms => :mri_19
10
+ gem "pry-stack_explorer", :platform => :mri
11
+ gem "pry-session", :platform => :mri
12
+ gem "fuubar"
13
+ gem "fuubar-cucumber"
14
+ gem "selenium-webdriver"
15
+ gem "highline"
16
+ gem "appraisal", :github => "razum2um/appraisal", :branch => "master"
17
+ gem "sprockets"
18
+ gem "uglifier"
19
+ gem "sass-rails"
20
+ gem "coffee-rails"
21
+ gem "bootstrap-sass", "~> 3.3.3"
22
+ gem "jquery-rails"
23
+ gem "remotipart"
24
+ gem "launchy"
25
+ end
26
+
27
+ gemspec :path => "../"
@@ -0,0 +1,27 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.0.13"
6
+
7
+ group :development do
8
+ gem "pry-byebug", :platforms => [:mri_20, :mri_21, :mri_22]
9
+ gem "pry-debugger", :platforms => :mri_19
10
+ gem "pry-stack_explorer", :platform => :mri
11
+ gem "pry-session", :platform => :mri
12
+ gem "fuubar"
13
+ gem "fuubar-cucumber"
14
+ gem "selenium-webdriver"
15
+ gem "highline"
16
+ gem "appraisal", :github => "razum2um/appraisal", :branch => "master"
17
+ gem "sprockets"
18
+ gem "uglifier"
19
+ gem "sass-rails"
20
+ gem "coffee-rails"
21
+ gem "bootstrap-sass", "~> 3.3.3"
22
+ gem "jquery-rails"
23
+ gem "remotipart"
24
+ gem "launchy"
25
+ end
26
+
27
+ gemspec :path => "../"
@@ -0,0 +1,27 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.1.9"
6
+
7
+ group :development do
8
+ gem "pry-byebug", :platforms => [:mri_20, :mri_21, :mri_22]
9
+ gem "pry-debugger", :platforms => :mri_19
10
+ gem "pry-stack_explorer", :platform => :mri
11
+ gem "pry-session", :platform => :mri
12
+ gem "fuubar"
13
+ gem "fuubar-cucumber"
14
+ gem "selenium-webdriver"
15
+ gem "highline"
16
+ gem "appraisal", :github => "razum2um/appraisal", :branch => "master"
17
+ gem "sprockets"
18
+ gem "uglifier"
19
+ gem "sass-rails"
20
+ gem "coffee-rails"
21
+ gem "bootstrap-sass", "~> 3.3.3"
22
+ gem "jquery-rails"
23
+ gem "remotipart"
24
+ gem "launchy"
25
+ end
26
+
27
+ gemspec :path => "../"
@@ -0,0 +1,27 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.2.0"
6
+
7
+ group :development do
8
+ gem "pry-byebug", :platforms => [:mri_20, :mri_21, :mri_22]
9
+ gem "pry-debugger", :platforms => :mri_19
10
+ gem "pry-stack_explorer", :platform => :mri
11
+ gem "pry-session", :platform => :mri
12
+ gem "fuubar"
13
+ gem "fuubar-cucumber"
14
+ gem "selenium-webdriver"
15
+ gem "highline"
16
+ gem "appraisal", :github => "razum2um/appraisal", :branch => "master"
17
+ gem "sprockets"
18
+ gem "uglifier"
19
+ gem "sass-rails"
20
+ gem "coffee-rails"
21
+ gem "bootstrap-sass", "~> 3.3.3"
22
+ gem "jquery-rails"
23
+ gem "remotipart"
24
+ gem "launchy"
25
+ end
26
+
27
+ gemspec :path => "../"
data/lib/lurker.rb CHANGED
@@ -85,10 +85,10 @@ require 'lurker/json/schema/extensions'
85
85
  require 'lurker/json/schema/response_codes'
86
86
  require 'lurker/json/schema/reference'
87
87
  require 'lurker/spy'
88
+ require 'lurker/server'
88
89
  require 'lurker/request'
89
90
  require 'lurker/response'
90
91
 
91
92
  if defined? Rails
92
- require 'lurker/engine'
93
93
  require 'lurker/sandbox'
94
94
  end
data/lib/lurker/cli.rb CHANGED
@@ -1,15 +1,13 @@
1
1
  require 'thor'
2
2
  require 'execjs'
3
3
  require 'digest/sha1'
4
- require 'lurker/service'
4
+ require 'lurker'
5
+ require 'active_support/inflector'
5
6
 
6
7
  module Lurker
7
8
  # A Thor::Error to be thrown when an lurker directory is not found
8
9
  class NotFound < Thor::Error; end
9
10
 
10
- # A Thor::Error to be thrown when an lurker output destination is unavailable
11
- class NotADirectory < Thor::Error; end
12
-
13
11
  # A Thor definition for an lurker to HTML conversion operation
14
12
  class Cli < Thor
15
13
  include Thor::Actions
@@ -28,8 +26,8 @@ module Lurker
28
26
  method_option :rails, :type => :boolean, :desc => "Includes Rails environment"
29
27
  method_option :exclude, :aliases => "-e", :desc => "Select endpoints by given regexp, if NOT matching prefix"
30
28
  method_option :select, :aliases => "-s", :desc => "Select endpoints by given regexp, matching prefix"
31
- method_option :output, :aliases => "-o", :desc => "Output path"
32
- method_option :url_base_path, :aliases => "-u", :desc => "URL base path"
29
+ method_option :output, :aliases => "-o", :desc => "Output path", :default => "public"
30
+ method_option :url_base_path, :aliases => "-u", :desc => "URL base path", :default => Lurker::DEFAULT_URL_BASE
33
31
  method_option :format, :aliases => "-f", :desc => "Format in html or pdf, defaults to html", :default => "html"
34
32
  method_option :templates, :aliases => "-t", :desc => "Template overrides path"
35
33
  method_option :content, :aliases => "-c", :desc => "Content to be rendered into html-docs main page"
@@ -41,8 +39,7 @@ module Lurker
41
39
  raise Lurker::NotFound.new(origin_path) unless has_valid_origin?
42
40
  say_status :using, lurker_path
43
41
 
44
- self.destination_root = output_path
45
- raise Lurker::NotADirectory.new(output_path) unless has_valid_destination?
42
+ FileUtils.mkdir_p(output_path)
46
43
  say_status :inside, output_path
47
44
 
48
45
  if options[:rails]
@@ -60,7 +57,7 @@ module Lurker
60
57
  def convert_to_pdf
61
58
  Lurker.safe_require('pdfkit')
62
59
  css = File.expand_path('application.css', self.class.precompiled_static_root)
63
- in_root do
60
+ inside(output_path) do
64
61
  service_presenters.each do |service_presenter|
65
62
  html = "<html><body>"
66
63
  service_presenter.endpoints.each do |endpoint_prefix_group|
@@ -71,13 +68,14 @@ module Lurker
71
68
  html << "</body></html>"
72
69
  kit = PDFKit.new(html, :page_size => 'Letter')
73
70
  kit.stylesheets << css
74
- create_file("#{service_presenter.name}.pdf", kit.to_pdf, force: true)
71
+ url_name = ActiveSupport::Inflector.parameterize(service_presenter.name, '_')
72
+ create_file("#{url_name}.pdf", kit.to_pdf, force: true)
75
73
  end
76
74
  end
77
75
  end
78
76
 
79
77
  def convert_to_html
80
- in_root do
78
+ inside(output_path) do
81
79
  # js, css, fonts
82
80
  static = []
83
81
  Dir["#{self.class.precompiled_static_root}/*"].each do |fname|
@@ -85,11 +83,10 @@ module Lurker
85
83
  sha1 = Digest::SHA1.hexdigest(open(fname).read)
86
84
  html_options.merge! match[1] => sha1
87
85
  static << (new_name = "application-#{sha1}.#{match[1]}")
88
- to = destination.join(new_name).to_s
89
- FileUtils.cp_r fname, to
90
- spawn "cat #{to} | gzip -9 > #{to}.gz"
86
+ FileUtils.cp_r fname, new_name
87
+ spawn "cat #{new_name} | gzip -9 > #{new_name}.gz"
91
88
  else
92
- FileUtils.cp_r fname, destination.to_s
89
+ FileUtils.cp_r fname, Pathname.new(fname).basename.to_s
93
90
  end
94
91
  end
95
92
 
@@ -117,12 +114,17 @@ module Lurker
117
114
  end
118
115
 
119
116
  def output_path
120
- @output_path ||=
121
- if options[:output]
122
- File.expand_path(options[:output])
123
- else
124
- File.expand_path("../#{options[:format]}", origin_path)
125
- end
117
+ "#{output_prefix}/#{url_base_path}"
118
+ end
119
+
120
+ def output_prefix
121
+ if explicit = options[:output]
122
+ explicit.sub(/\/?#{url_base_path}\/?$/, '')
123
+ elsif File.exists? "public"
124
+ "public"
125
+ else
126
+ raise "Please, run it from `Rails.root` or pass `-o` option"
127
+ end
126
128
  end
127
129
 
128
130
  def template_path
@@ -138,10 +140,6 @@ module Lurker
138
140
  origin.directory?
139
141
  end
140
142
 
141
- def has_valid_destination?
142
- !destination.exist? || destination.directory?
143
- end
144
-
145
143
  def service_presenters
146
144
  @service_presenters ||= services.map do |service|
147
145
  Lurker::ServicePresenter.new(service, html_options, &filtering_block)
@@ -170,9 +168,9 @@ module Lurker
170
168
  def html_options
171
169
  @html_options ||= {
172
170
  :static_html => true,
173
- :url_base_path => options[:url_base_path].presence || "/#{Lurker::DEFAULT_URL_BASE}",
171
+ :url_base_path => url_base_path.prepend('/'),
174
172
  :template_directory => template_path,
175
- :html_directory => destination_root,
173
+ :html_directory => output_path,
176
174
  :content => self.content,
177
175
  :footer => (`git rev-parse --short HEAD`.to_s.strip rescue ""),
178
176
  :lurker => gem_info
@@ -182,6 +180,10 @@ module Lurker
182
180
 
183
181
  private
184
182
 
183
+ def url_base_path
184
+ options[:url_base_path].presence.try(:strip).try(:sub, /^\/+/, '') || Lurker::DEFAULT_URL_BASE
185
+ end
186
+
185
187
  def gem_info
186
188
  spec = if Bundler.respond_to? :locked_gems
187
189
  Bundler.locked_gems.specs.select { |s| s.name == 'lurker' } .first # 1.6
@@ -217,9 +219,5 @@ module Lurker
217
219
  def origin
218
220
  Pathname.new(origin_path)
219
221
  end
220
-
221
- def destination
222
- Pathname.new(destination_root)
223
- end
224
222
  end
225
223
  end