lurker 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.gitignore +1 -0
  5. data/.travis.yml +4 -4
  6. data/README.md +4 -2
  7. data/Rakefile +13 -1
  8. data/features/controller_specs/nested_schema_scaffolding.feature +4 -4
  9. data/features/controller_specs/test_endpoint.feature +36 -15
  10. data/features/request_specs/nested_schema_scaffolding.feature +4 -4
  11. data/features/request_specs/schema_suffixes.feature +173 -0
  12. data/features/support/env.rb +7 -1
  13. data/gemfiles/Gemfile32.ci +6 -0
  14. data/{Gemfile.ci → gemfiles/Gemfile40.ci} +3 -1
  15. data/gemfiles/Gemfile41.ci +6 -0
  16. data/lib/lurker.rb +0 -2
  17. data/lib/lurker/cli.rb +10 -55
  18. data/lib/lurker/controller_spec_watcher.rb +12 -6
  19. data/lib/lurker/endpoint.rb +1 -1
  20. data/lib/lurker/presenters/base_presenter.rb +0 -13
  21. data/lib/lurker/presenters/endpoint_presenter.rb +7 -6
  22. data/lib/lurker/presenters/json_presenter.rb +0 -9
  23. data/lib/lurker/presenters/response_code_presenter.rb +0 -9
  24. data/lib/lurker/presenters/schema_presenter.rb +1 -33
  25. data/lib/lurker/presenters/service_presenter.rb +2 -24
  26. data/lib/lurker/request_spec_watcher.rb +11 -6
  27. data/lib/lurker/service.rb +1 -1
  28. data/lib/lurker/templates/javascripts/application.js +0 -2
  29. data/lib/lurker/templates/public/application.css +0 -148
  30. data/lib/lurker/templates/public/application.js +2 -1904
  31. data/lib/lurker/templates/stylesheets/application.css +0 -2
  32. data/lib/lurker/version.rb +1 -1
  33. data/lurker.gemspec +2 -1
  34. data/templates/generate_stuff.rb +111 -22
  35. data/templates/lurker_app.rb +0 -5
  36. metadata +31 -32
  37. metadata.gz.asc +7 -7
  38. data/lib/lurker/meta_service.rb +0 -46
  39. data/lib/lurker/presenters/meta_service_presenter.rb +0 -85
  40. data/lib/lurker/templates/endpoint.html.erb +0 -62
  41. data/lib/lurker/templates/endpoint.md.erb +0 -40
  42. data/lib/lurker/templates/javascripts/demo/dashboard-demo.js +0 -117
  43. data/lib/lurker/templates/javascripts/demo/flot-demo.js +0 -1242
  44. data/lib/lurker/templates/javascripts/demo/morris-demo.js +0 -155
  45. data/lib/lurker/templates/javascripts/plugins/dataTables/dataTables.bootstrap.js +0 -245
  46. data/lib/lurker/templates/javascripts/plugins/dataTables/jquery.dataTables.js +0 -14013
  47. data/lib/lurker/templates/javascripts/plugins/flot/excanvas.min.js +0 -1
  48. data/lib/lurker/templates/javascripts/plugins/flot/jquery.flot.js +0 -2599
  49. data/lib/lurker/templates/javascripts/plugins/flot/jquery.flot.pie.js +0 -750
  50. data/lib/lurker/templates/javascripts/plugins/flot/jquery.flot.resize.js +0 -60
  51. data/lib/lurker/templates/javascripts/plugins/flot/jquery.flot.tooltip.min.js +0 -12
  52. data/lib/lurker/templates/javascripts/plugins/morris/morris.js +0 -1888
  53. data/lib/lurker/templates/javascripts/plugins/morris/raphael-2.1.0.min.js +0 -10
  54. data/lib/lurker/templates/lurker/rendering/_endpoint.html.erb +0 -65
  55. data/lib/lurker/templates/meta_service.html.erb +0 -54
  56. data/lib/lurker/templates/service.html.erb +0 -50
  57. data/lib/lurker/templates/service.md.erb +0 -18
  58. data/lib/lurker/templates/styles.css +0 -75
  59. data/lib/lurker/templates/stylesheets/plugins/dataTables/dataTables.bootstrap.css +0 -233
  60. data/lib/lurker/templates/stylesheets/plugins/morris/morris-0.4.3.min.css +0 -2
  61. data/lib/lurker/templates/stylesheets/plugins/social-buttons/social-buttons.css +0 -68
  62. data/lib/lurker/templates/stylesheets/plugins/timeline/timeline.css +0 -144
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 96e03cec0753864d2fba1831cef5a23e4e8f7ee6
4
- data.tar.gz: 2c774884cdfceaab040541bf62587408186b3f8b
3
+ metadata.gz: e0db77bd62f588abb4fb1578efb4a2bb549757c4
4
+ data.tar.gz: bee8c146efa0e12da5b93bf39f279cdfd798ca1e
5
5
  SHA512:
6
- metadata.gz: 674d6b9eb0f82ed400c16dc63b251dc2640b75b5cefcc796f3bcf8053a8e5ddafa8b538d3dec7bda67bdd0b9e7463269ffcf7c0f022015f80eb7fb4aad1d83e6
7
- data.tar.gz: 161d9b376e1e6a8c3497877655677ed97478be2fcc711af971c166a8c8d64f4c31c2bbb4015f6c01c40de5a204c55750a1d7b83a9841044dba5112ff8d914105
6
+ metadata.gz: 3b80cbbda321aec3d97d7773344afed7315267d3c4be8504278d9ac951eeeaa16d1290674c42bf5de802e09c3a373654e440880078e07a13561b42dd62b70bea
7
+ data.tar.gz: ce9992065fe080a56c59007fe6b2d67b22e0858632df68d23a4c20227ba040f996a47a2634e790cb06d3498d3f99621a57f74c7799fd104f4b78d94a7e0a1c61
checksums.yaml.gz.asc CHANGED
@@ -2,11 +2,11 @@
2
2
  Version: GnuPG v1
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQEcBAABCgAGBQJTYSdKAAoJENcoxKfNVdjbUYAH+wVE2NmE7ol3wWjmxHMRAyr5
6
- Gc9vxOmbMPi70Cqf6IEC4L9pzn9Yy+qTDGjC98KolSDoULKKuvOn920eOJ1JOM5y
7
- YjV0pke1UF/ohX8edCK6KT4vt3pgoC++65ZNaYvAEBJGjo7ImDIM6yD17RCOrr39
8
- EhYFc3kMa403nnBK+XFYzhdeXFgI2f9yz8mOBlyKs009trRACih/vEJjrvWZtaKM
9
- StbjHXL/1hMGzTkvJHYxg6EvoegUarMxuKfq0CsY9gvJVp/bg5egItI12jgiYeGn
10
- Ucs//BpVz7uLaKDSmNi80s71pr3RRzZC4rBwnnR2Cp4BwQ5oa4GgqET6vAB4Pmc=
11
- =d8yD
5
+ iQEcBAABCgAGBQJTaes0AAoJENcoxKfNVdjbTfwH/RoJGVRj3ReOEemgkXBTaCVm
6
+ d3+jIU4Bj/hKl4l9bIy2izCwGuIropA9j4gHC8v8+slgpgtejggl1aH2FkNMrszS
7
+ 5wjLhJxXKCFWPZVe3k/LTg07JcJj9aInvP96jKyiwIKGnCQEYcAwVrko9tu3R8WV
8
+ ENpDqkH8E69P0KZ2XDH22va4aH4VtVDrw4VCJWftEg91ufPzyrsPoNbb5j+jk6DQ
9
+ X/IB4R+YDJ3ch3An2UuAQK6rpu1GFd5migwpdrYKUzZYO/6xenK/pjALia/Yj4jm
10
+ jvnN7pJzPm9357Gg6h6iPY4Q8Us89Ri6XqZrdT7cQ1Zzclco7crxWT+syYi2PL0=
11
+ =913O
12
12
  -----END PGP SIGNATURE-----
data.tar.gz.asc CHANGED
@@ -2,11 +2,11 @@
2
2
  Version: GnuPG v1
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQEcBAABCgAGBQJTYSdHAAoJENcoxKfNVdjbaXcH/0EznB410jliY+1FsQNauGfW
6
- 0KrnVLUPNrouYI/LPJ43XCRDEXo4VG9zI741o3RDPCamLi64nRO6bOmh3OoEYBTJ
7
- y+NE9h90zMJ4XtiBglNhMxo2OZz3C7DSw9ragA6+9VwCuhQUrYoSQ+X15YQXE1iE
8
- sczxQ+qGAg52sXoYnYydi7Ip/kPWWVZV4P4DbUZmf5LYNDOY7rzWGKrTJcKhaThy
9
- N5J3g+hWlap2v5bxP03G0xz+GF7K1ytWh5DZw8zT7p6P4Oo8aq1s7m+fCFcohEI3
10
- u1LNQrhXxloiSjq4tnibSZPmiyYPZmD4xx6tchE8ZnyLZ8ErX4EimDFxoP/Q9Bk=
11
- =T/zF
5
+ iQEcBAABCgAGBQJTaesyAAoJENcoxKfNVdjbuuAIAM6HJ0fiHPEW8Jl1jXGNW8gK
6
+ 6KCxhB8w9yRtVj7bQf6WfPV00OzpS7CVH3ln/NzLF75DYG6b6JQ6C2zmYFqwSH+M
7
+ LNrGef8gdIrTmanItakJ23xQ+ADxnNg6Ib0FCTCEs8BOfYoDtPnHv9Mp5hqLNQW3
8
+ XeOD5f9Q6DrTuMssWTDA3ZvmMtBPDYAsI/Xr3Ku9fZGnoqorHBhCnELWGZVTg4xo
9
+ IAhguO6vxMQPgyqSrPnj/kZLRVGiw2mF2LnlfRNAirKM+ByNklcwlrTvBcwRQhpJ
10
+ tBptan36Aier/uEaBkncd/dfKCmm/f8APSPJubc8aG+3SSL7rkw2lG7aN6RPGQ0=
11
+ =eB97
12
12
  -----END PGP SIGNATURE-----
data/.gitignore CHANGED
@@ -19,3 +19,4 @@ vendor/bundle
19
19
  features/support/selenuim.rb
20
20
  Gemfile.local.lock
21
21
  _site
22
+ gemfiles/*lock
data/.travis.yml CHANGED
@@ -1,9 +1,9 @@
1
1
  language: ruby
2
- gemfile: Gemfile.ci
2
+ gemfile:
3
+ - gemfiles/Gemfile32.ci
4
+ - gemfiles/Gemfile40.ci
5
+ - gemfiles/Gemfile41.ci
3
6
  install: bundle install -j4 --path vendor/bundle
4
- cache:
5
- directories:
6
- - vendor/bundle
7
7
  rvm:
8
8
  - 1.9.3
9
9
  - 2.0.0
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Lurker
2
2
 
3
- The new de-facto for API testing your Rails application (Rails 3 & 4 both compatible)
3
+ The new de-facto for API testing your Rails application.
4
+ Works on Rails 3.2, 4.0, 4.1 & Ruby 1.9.3, 2.0.0, 2.1.1.
4
5
 
5
6
  [![Gem Version][GV img]][Gem Version]
6
7
  [![Build Status][BS img]][Build Status]
@@ -132,8 +133,9 @@ This gem is quite opinionated and relies on rails & rspec - if you're
132
133
  interested in anything else, please take a look at [api_taster][api_taster] or [fdoc][fdoc],
133
134
  This gem is heavily inspirated by them. Thanks, @square & @fredwu
134
135
 
135
- Also thanks to [React.js][reactjs] for two-way binding.
136
+ Also thanks to [Andrey Deryabin][aderyabin] for advice and [React.js][reactjs] for two-way binding.
136
137
 
138
+ [aderyabin]: https://twitter.com/aderyabin
137
139
  [waffle]: https://waffle.io/razum2um/lurker
138
140
  [gh_api]: https://developer.github.com/v3/meta/
139
141
  [rspec]: https://github.com/rspec/rspec-rails
data/Rakefile CHANGED
@@ -91,7 +91,7 @@ namespace :clobber do
91
91
  desc "clobber the generated app"
92
92
  task :app do
93
93
  FileUtils.mkdir_p EXAMPLE_PATH
94
- in_lurker_app "bin/spring stop" if File.exist?("#{EXAMPLE_PATH}/bin/spring")
94
+ in_lurker_app "bin/spring stop" rescue nil
95
95
  Dir.chdir EXAMPLE_PATH do
96
96
  Dir.glob("*", File::FNM_DOTMATCH).each do |fname|
97
97
  next if fname == '.' || fname == '..' || fname == '.git'
@@ -111,7 +111,19 @@ namespace :generate do
111
111
 
112
112
  desc "generate a bunch of stuff with generators"
113
113
  task :stuff do
114
+ if ENV['BUNDLE_GEMFILE'].to_s.match(/Gemfile(32|40)\.ci$/)
115
+ in_lurker_app "bundle install"
116
+ %w[rake rspec-core spring].each do |gem|
117
+ in_lurker_app "bundle binstubs #{gem}"
118
+ end
119
+ end
114
120
  in_lurker_app "LOCATION='../../templates/generate_stuff.rb' bin/rake rails:template --quiet --silent"
121
+
122
+ unless ENV['TRAVIS']
123
+ in_lurker_app 'bin/rake db:setup'
124
+ in_lurker_app 'bin/rake db:import'
125
+ end
126
+ in_lurker_app 'bin/rake RAILS_ENV=test db:setup'
115
127
  end
116
128
  end
117
129
 
@@ -58,14 +58,14 @@ Feature: nested schema scaffolding
58
58
  description: ''
59
59
  type: integer
60
60
  example: 1
61
- user_id:
62
- description: ''
63
- type: integer
64
- example: 1
65
61
  name:
66
62
  description: ''
67
63
  type: string
68
64
  example: lurker
65
+ user_id:
66
+ description: ''
67
+ type: integer
68
+ example: 1
69
69
  required: []
70
70
  extensions:
71
71
  method: GET
@@ -10,17 +10,24 @@ Feature: test endpoint
10
10
  but specs are NOT passing because of nonsufficient `role` attribute
11
11
 
12
12
  Background:
13
- Given a file named "lurker/api/v1/users-POST.json.yml" with:
13
+ Given a file named "lurker/api/v1/users/__id-PATCH.json.yml" with:
14
14
  """yml
15
15
  ---
16
16
  prefix: ''
17
17
  description: ''
18
18
  responseCodes:
19
+ - status: 400
20
+ successful: true
21
+ description: ''
19
22
  - status: 200
20
23
  successful: true
21
24
  description: ''
22
25
  requestParameters:
23
26
  properties:
27
+ id:
28
+ description: ''
29
+ type: integer
30
+ example: 1
24
31
  user:
25
32
  description: ''
26
33
  type: object
@@ -43,14 +50,16 @@ Feature: test endpoint
43
50
  example: Bob
44
51
  required: []
45
52
  extensions:
46
- action: create
47
- controller: api/v1/users
48
- path_info: "/api/v1/users"
49
- method: POST
53
+ path_info: "/api/v1/users/1"
54
+ method: PATCH
50
55
  suffix: ''
56
+ path_params:
57
+ action: update
58
+ controller: api/v1/users
59
+ id: 1
51
60
  """
52
61
 
53
- Scenario: json schema tests request and response using "users/create"
62
+ Scenario: json schema tests request and response using "users/update"
54
63
  Given a file named "spec/controllers/api/v1/users_controller_spec.rb" with:
55
64
  """ruby
56
65
  require "spec_helper"
@@ -58,8 +67,12 @@ Feature: test endpoint
58
67
  describe Api::V1::UsersController, :lurker do
59
68
  render_views
60
69
 
61
- it "creates a new users" do
62
- post :create, user: { name: 'Bob' }
70
+ let(:user) do
71
+ User.where(name: 'razum2um').first_or_create!
72
+ end
73
+
74
+ it "updates a user" do
75
+ patch :update, id: user.id, user: { name: 'Bob' }
63
76
  expect(response).to be_success
64
77
  end
65
78
  end
@@ -68,7 +81,7 @@ Feature: test endpoint
68
81
  When I run `bin/rspec spec/controllers/api/v1/users_controller_spec.rb`
69
82
  Then the example should pass
70
83
 
71
- Scenario: json schema tests request parameters and tell what fails using "users/create"
84
+ Scenario: json schema tests request parameters and tell what fails using "users/update"
72
85
  Given a file named "spec/controllers/api/v1/users_controller_spec.rb" with:
73
86
  """ruby
74
87
  require "spec_helper"
@@ -76,8 +89,12 @@ Feature: test endpoint
76
89
  describe Api::V1::UsersController, :lurker do
77
90
  render_views
78
91
 
79
- it "creates a new users" do
80
- post :create, user: { name: 1 }
92
+ let(:user) do
93
+ User.where(name: 'razum2um').first_or_create!
94
+ end
95
+
96
+ it "updates a user" do
97
+ patch :update, id: user.id, user: { name: 1 }
81
98
  expect(response).not_to be_success
82
99
  end
83
100
  end
@@ -93,7 +110,7 @@ Feature: test endpoint
93
110
  1 example, 1 failure
94
111
  """
95
112
 
96
- Scenario: json schema tests response parameters and tell what fails using "users/create"
113
+ Scenario: json schema tests response parameters and tell what fails using "users/update"
97
114
  Given a file named "spec/controllers/api/v1/users_controller_spec.rb" with:
98
115
  """ruby
99
116
  require "spec_helper"
@@ -101,9 +118,13 @@ Feature: test endpoint
101
118
  describe Api::V1::UsersController, :lurker do
102
119
  render_views
103
120
 
104
- it "creates a new users" do
105
- post :create, user: { name: '' }
106
- expect(response).to be_success
121
+ let(:user) do
122
+ User.where(name: 'razum2um').first_or_create!
123
+ end
124
+
125
+ it "updates a user" do
126
+ patch :update, id: user.id, user: { name: '' }
127
+ expect(response).not_to be_success
107
128
  end
108
129
  end
109
130
  """
@@ -43,14 +43,14 @@ Feature: nested schema scaffolding
43
43
  description: ''
44
44
  type: integer
45
45
  example: 1
46
- user_id:
47
- description: ''
48
- type: integer
49
- example: 1
50
46
  name:
51
47
  description: ''
52
48
  type: string
53
49
  example: lurker
50
+ user_id:
51
+ description: ''
52
+ type: integer
53
+ example: 1
54
54
  required: []
55
55
  extensions:
56
56
  method: GET
@@ -0,0 +1,173 @@
1
+ Feature: schema suffixes
2
+
3
+ If your API is stable and the new code isn't breaking it
4
+ you'll see nothing special, just passing specs
5
+
6
+ **NOTE:** the second request example is expecting a nonsuccessful response and it is,
7
+ but specs are NOT passing because of nonsufficient `name` parameter
8
+
9
+ **NOTE:** the third response example is expecting a successful response and it is,
10
+ but specs are NOT passing because of nonsufficient `role` attribute
11
+
12
+ Scenario: json schema tests request and response using "repos/update"
13
+ Given a file named "lurker/api/v1/users/__user_id/repos/__id-PATCH.json.yml" with:
14
+ """yml
15
+ ---
16
+ prefix: 'repos management'
17
+ description: 'repo updating'
18
+ responseCodes:
19
+ - status: 200
20
+ successful: true
21
+ description: ''
22
+ requestParameters:
23
+ properties:
24
+ id:
25
+ description: ''
26
+ type: string
27
+ example: 1
28
+ user_id:
29
+ description: ''
30
+ type: string
31
+ example: razum2um
32
+ repo:
33
+ description: ''
34
+ type: object
35
+ properties:
36
+ name:
37
+ description: ''
38
+ type: string
39
+ example: 'updated-name'
40
+ required: []
41
+ required: []
42
+ responseParameters:
43
+ properties:
44
+ id:
45
+ description: ''
46
+ type: integer
47
+ example: 1
48
+ name:
49
+ description: ''
50
+ type: string
51
+ example: 'updated-name'
52
+ user_id:
53
+ description: ''
54
+ type: integer
55
+ example: 1
56
+ required: []
57
+ extensions:
58
+ path_info: "/api/v1/users/razum2um/repos/lurker"
59
+ method: PATCH
60
+ suffix: ''
61
+ path_params:
62
+ action: update
63
+ controller: api/v1/repos
64
+ user_id: razum2um
65
+ id: lurker
66
+ """
67
+ And a file named "spec/requests/updating_repos_spec.rb" with:
68
+ """ruby
69
+ require "spec_helper"
70
+
71
+ describe Api::V1::ReposController, :lurker, type: :request do
72
+
73
+ let(:user) do
74
+ User.where(name: 'razum2um').first_or_create!
75
+ end
76
+
77
+ let(:repo) do
78
+ user.repos.where(name: 'lurker').first_or_create!
79
+ end
80
+
81
+ it "updates a repo name" do
82
+ expect {
83
+ patch "/api/v1/users/#{user.name}/repos/#{repo.name}", repo: { name: 'updated-name' }
84
+ expect(response).to be_success
85
+ }.to change { repo.reload.name } .from('lurker').to('updated-name')
86
+ end
87
+ end
88
+ """
89
+
90
+ When I run `bin/rspec spec/requests/updating_repos_spec.rb`
91
+ Then the example should pass
92
+
93
+ Scenario: json schema tests request parameters and tell what fails using "users/update"
94
+ Given a file named "lurker/api/v1/users/__user_id/repos/__id-failed-PATCH.json.yml" with:
95
+ """yml
96
+ ---
97
+ prefix: 'repos management'
98
+ description: 'failed repo updating'
99
+ responseCodes:
100
+ - status: 400
101
+ successful: true
102
+ description: ''
103
+ requestParameters:
104
+ properties:
105
+ id:
106
+ description: ''
107
+ type: string
108
+ example: 1
109
+ user_id:
110
+ description: ''
111
+ type: string
112
+ example: razum2um
113
+ repo:
114
+ description: ''
115
+ type: object
116
+ properties:
117
+ name:
118
+ description: ''
119
+ type: string
120
+ example: ''
121
+ required: []
122
+ required: []
123
+ responseParameters:
124
+ properties:
125
+ errors:
126
+ description: ''
127
+ type: object
128
+ example: 1
129
+ properties:
130
+ name:
131
+ description: ''
132
+ type: array
133
+ items:
134
+ description: ''
135
+ type: string
136
+ example: can't be blank
137
+ required: []
138
+ extensions:
139
+ path_info: "/api/v1/users/razum2um/repos/lurker"
140
+ method: PATCH
141
+ suffix: 'failed'
142
+ path_params:
143
+ action: update
144
+ controller: api/v1/repos
145
+ user_id: razum2um
146
+ id: lurker
147
+ """
148
+ And a file named "spec/requests/failed_updating_repos_spec.rb" with:
149
+ """ruby
150
+ require "spec_helper"
151
+
152
+ describe Api::V1::ReposController, type: :request do
153
+
154
+ let(:user) do
155
+ User.where(name: 'razum2um').first_or_create!
156
+ end
157
+
158
+ let(:repo) do
159
+ user.repos.where(name: 'lurker').first_or_create!
160
+ end
161
+
162
+ it "fails to update a repo with a blank name", lurker: 'failed' do
163
+ expect {
164
+ patch "/api/v1/users/#{user.name}/repos/#{repo.name}", repo: { name: '' }
165
+ expect(response).not_to be_success
166
+ }.not_to change { repo.reload.name }
167
+ end
168
+ end
169
+ """
170
+
171
+ When I run `bin/rspec spec/requests/failed_updating_repos_spec.rb`
172
+ Then the example should pass
173
+