rails-response-dumper 2.0.0 → 3.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f3a97f78890f8b28c7d89704adeb5ff8239c1bddad4dc0aabc50b443dcc075f
4
- data.tar.gz: 6531326b53a3f906ee6bb104e1096404fe9e9213d4bbcfbcc06df34bcc6e1edf
3
+ metadata.gz: 33844c7b9a9480388327762b8a297daab7e464c47933b8559325283aa29fc5b3
4
+ data.tar.gz: 6b8984033d0040101a4577e9a8c9aedfb3bba372510c03655ddbc402eb07e016
5
5
  SHA512:
6
- metadata.gz: e6f6ba4d8eafe2efad495fa2f4ffc1e36e3d735fd6ac96cce293bcc696fc0d5d0cc2a5b989bd6b3ff4ad66f35a19ea178e4b814e0da1e88ba457a0d33d6ee745
7
- data.tar.gz: c0119049c2eaf7b47cf2d0b43450f0a720885fefca895a849d24aba8d855d3bdddf1e09a041a4a615cf1a1e2fdb17ba6babfd94142f3d4c574794339bf62d716
6
+ metadata.gz: 4c4aa80837f7f3ec7d70b5e245692e50ac8d612499deba1d269dc54800bae589aa9143ee33ad2f665b6a647b1a741bb77ffb83acc9aa1b12169150fcd543a796
7
+ data.tar.gz: 033d6714b3e5febebbf5aa063e7a538bda9ae101a4cbef7b196a446c567c5f4b4341bd6dca328f2ba084e8e3a378462b9c8caa909b111545e165de656db703fc
@@ -1,102 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'fileutils'
5
- require 'mime/types'
6
-
7
4
  ENV['RAILS_ENV'] ||= 'test'
8
- require "#{Dir.pwd}/config/environment"
9
-
10
- class ResponseDumper
11
- include ActionDispatch::Integration::Runner
12
-
13
- attr_reader :expected_status_code
14
-
15
- def self.inherited(subclass)
16
- super
17
- dumpers << subclass
18
- end
19
-
20
- def self.dumpers
21
- @dumpers ||= []
22
- end
23
-
24
- def self.reset_models(*models)
25
- @reset_models ||= []
26
- @reset_models += models
27
- end
28
-
29
- def self.reset_models!
30
- reset_models.each do |model|
31
- model.connection.exec_query "TRUNCATE #{model.quoted_table_name} RESTART IDENTITY CASCADE"
32
- end
33
- end
34
-
35
- # Delegates to `Rails.application`.
36
- def app
37
- Rails.application
38
- end
39
-
40
- def expect_status_code!(status_code)
41
- @expected_status_code = Rack::Utils::SYMBOL_TO_STATUS_CODE[status_code]
42
- end
43
-
44
- def responses
45
- @responses ||= []
46
- end
47
-
48
- [:get, :post, :patch, :put, :head, :delete].each do |method|
49
- module_eval <<~RUBY, __FILE__, __LINE__ + 1
50
- def #{method}(...)
51
- result = super
52
- self.responses << response
53
- result
54
- end
55
- RUBY
56
- end
57
- end
58
-
59
- def run_dumps
60
- dumps_dir = Rails.root.join('dumps')
61
- FileUtils.rm_rf dumps_dir
62
- FileUtils.mkdir_p dumps_dir
63
-
64
- Dir[Rails.root.join('dumpers/**/*.rb')].each { |f| require f }
65
-
66
- ResponseDumper.dumpers.each do |klass|
67
- klass.instance_methods.each do |method|
68
- next unless method.start_with?('dump_')
69
-
70
- klass.reset_models!
71
-
72
- dumper = klass.new
73
- ActiveRecord::Base.transaction do
74
- dumper.expect_status_code!(:ok)
75
- dumper.send(method)
76
- raise ActiveRecord::Rollback
77
- end
78
-
79
- klass_path = klass.name.underscore
80
- dumper_dir = "#{dumps_dir}/#{klass_path}/#{method}"
81
- FileUtils.mkdir_p dumper_dir
82
-
83
- dumper.responses.each_with_index do |response, index|
84
- unless response.status == dumper.expected_status_code
85
- raise <<~ERROR.squish
86
- Dumped response has unexpected status code #{response.status} #{response.status_message}
87
- (expected #{dumper.expected_status_code})
88
- ERROR
89
- end
90
-
91
- mime = response.content_type.split(/ *; */).first
92
- extension = MIME::Types[mime].first.preferred_extension
93
- File.write("#{dumper_dir}/#{index}.#{extension}", response.body)
94
- end
95
- end
96
- end
97
- end
5
+ require 'rails_response_dumper'
98
6
 
99
7
  # Prevent database truncation if the environment is production.
100
8
  abort 'The Rails environment is running in production mode!' if Rails.env.production?
101
- ActiveRecord::Migration.maintain_test_schema!
102
- run_dumps
9
+ ActiveRecord::Migration.maintain_test_schema! if defined?(ActiveRecord::Base)
10
+
11
+ runner = RailsResponseDumper::Runner.new
12
+ runner.run_dumps
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/module/delegation'
4
+ require_relative 'dump_block'
5
+
6
+ module RailsResponseDumper
7
+ class Defined
8
+ attr_accessor :name, :klass
9
+
10
+ delegate :include, to: :klass
11
+
12
+ def self.dumpers
13
+ @dumpers ||= []
14
+ end
15
+
16
+ def initialize(name, &block)
17
+ self.name = name
18
+ self.klass = Class.new(ResponseDumper)
19
+
20
+ instance_eval(&block)
21
+
22
+ self.class.dumpers << self
23
+ end
24
+
25
+ def dump(name, status_code: :ok, &block)
26
+ blocks << DumpBlock.new(name, Rack::Utils::SYMBOL_TO_STATUS_CODE[status_code], block)
27
+ end
28
+
29
+ def blocks
30
+ @blocks ||= []
31
+ end
32
+
33
+ def reset_models(*models)
34
+ @reset_models ||= []
35
+ @reset_models += models
36
+ end
37
+
38
+ def reset_models!
39
+ reset_models.each do |model|
40
+ model.connection.exec_query <<~SQL.squish
41
+ TRUNCATE #{model.quoted_table_name} RESTART IDENTITY CASCADE
42
+ SQL
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsResponseDumper
4
+ DumpBlock = Struct.new('DumpBlock', :name, :expected_status_code, :block)
5
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mime/types'
4
+ require_relative 'defined'
5
+
6
+ module RailsResponseDumper
7
+ class Runner
8
+ def run_dumps
9
+ dumps_dir = Rails.root.join('dumps')
10
+ FileUtils.rm_rf dumps_dir
11
+ FileUtils.mkdir_p dumps_dir
12
+
13
+ Dir[Rails.root.join('dumpers/**/*.rb')].each { |f| require f }
14
+
15
+ RailsResponseDumper::Defined.dumpers.each do |defined|
16
+ defined.blocks.each do |dump_block|
17
+ defined.reset_models!
18
+
19
+ dumper = defined.klass.new
20
+ dumper.mock_setup
21
+ begin
22
+ rollback_after do
23
+ dumper.instance_eval(&dump_block.block)
24
+ end
25
+ ensure
26
+ dumper.mock_teardown
27
+ end
28
+
29
+ klass_path = defined.name.underscore
30
+ dumper_dir = "#{dumps_dir}/#{klass_path}/#{dump_block.name}"
31
+ FileUtils.mkdir_p dumper_dir
32
+
33
+ dumper.responses.each_with_index do |response, index|
34
+ unless response.status == dump_block.expected_status_code
35
+ raise <<~ERROR.squish
36
+ #{defined.name}.#{dump_block.name} has unexpected status
37
+ code #{response.status} #{response.status_message}
38
+ (expected #{dump_block.expected_status_code})
39
+ ERROR
40
+ end
41
+
42
+ mime = response.content_type.split(/ *; */).first
43
+ extension = MIME::Types[mime].first.preferred_extension
44
+ File.write("#{dumper_dir}/#{index}.#{extension}", response.body)
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def rollback_after
53
+ if defined?(ActiveRecord::Base)
54
+ ActiveRecord::Base.transaction do
55
+ yield
56
+ raise ActiveRecord::Rollback
57
+ end
58
+ else
59
+ # ActiveRecord is not installed.
60
+ yield
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'rails_response_dumper/runner'
4
+ require_relative 'response_dumper'
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "#{Dir.pwd}/config/environment"
4
+ require 'rspec/mocks'
5
+
6
+ class ResponseDumper
7
+ include ActionDispatch::Integration::Runner
8
+ include ActiveSupport::Testing::TimeHelpers
9
+ include RSpec::Mocks::ExampleMethods
10
+
11
+ def self.define(name, &block)
12
+ RailsResponseDumper::Defined.new(name, &block)
13
+ end
14
+
15
+ # Delegates to `Rails.application`.
16
+ def app
17
+ Rails.application
18
+ end
19
+
20
+ def responses
21
+ @responses ||= []
22
+ end
23
+
24
+ def mock_setup
25
+ RSpec::Mocks.setup
26
+ end
27
+
28
+ def mock_teardown
29
+ RSpec::Mocks.verify
30
+ ensure
31
+ RSpec::Mocks.teardown
32
+ end
33
+
34
+ %i[get post patch put head delete].each do |method|
35
+ module_eval <<~RUBY, __FILE__, __LINE__ + 1
36
+ def #{method}(...)
37
+ result = super
38
+ self.responses << response
39
+ result
40
+ end
41
+ RUBY
42
+ end
43
+
44
+ # The list of methods is too long to be useful so shorten to just the class
45
+ # name.
46
+ def inspect
47
+ "#<#{self.class.name}>"
48
+ end
49
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-response-dumper
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pioneer Valley Books
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-03 00:00:00.000000000 Z
11
+ date: 2022-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mime-types
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rails
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -30,23 +44,42 @@ dependencies:
30
44
  - - "<"
31
45
  - !ruby/object:Gem::Version
32
46
  version: '8'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-mocks
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
33
61
  description: |
34
62
  Rails Response Dumper is a library and command line tool to dump HTTP
35
63
  responses from a Rails application to the file system. These responses can
36
64
  then be consumed by other tools for testing and verification purposes.
37
- email:
65
+ email:
38
66
  executables:
39
67
  - rails-response-dumper
40
68
  extensions: []
41
69
  extra_rdoc_files: []
42
70
  files:
43
71
  - bin/rails-response-dumper
72
+ - lib/rails_response_dumper.rb
73
+ - lib/rails_response_dumper/defined.rb
74
+ - lib/rails_response_dumper/dump_block.rb
75
+ - lib/rails_response_dumper/runner.rb
76
+ - lib/response_dumper.rb
44
77
  homepage: https://github.com/Pioneer-Valley-Books/rails-response-dumper
45
78
  licenses:
46
79
  - MIT
47
80
  metadata:
48
81
  rubygems_mfa_required: 'true'
49
- post_install_message:
82
+ post_install_message:
50
83
  rdoc_options: []
51
84
  require_paths:
52
85
  - lib
@@ -61,8 +94,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
94
  - !ruby/object:Gem::Version
62
95
  version: '0'
63
96
  requirements: []
64
- rubygems_version: 3.2.22
65
- signing_key:
97
+ rubygems_version: 3.3.7
98
+ signing_key:
66
99
  specification_version: 4
67
100
  summary: Dump HTTP responses from a Rails application to the file system
68
101
  test_files: []