lurker 0.6.6 → 0.6.7

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.
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