rails-response-dumper 2.1.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d60e4df92e8fd8339624f1fa9244ace8b901368b64278579027bf9d824d4185
4
- data.tar.gz: 796e5b8b849ea40a02657078a7d324c2846fabdc29c31bf36fee50a362d48395
3
+ metadata.gz: 22c747acb9c14801e9dcb12be0d5dc1031932f8b5111620b8599903294116b1d
4
+ data.tar.gz: 5c97ba8bc6bdab090c0b6e93f01fede4638fe3e16f3e52abe9b1c0020bee7c9d
5
5
  SHA512:
6
- metadata.gz: 12ed413c69767aa0936b88f7e526c2ec419cdc435707390272a370c5f41c3dcbcaa845685c039b8dbe148110044d7aedb9e19916658aab59c2ffb365ec9024f5
7
- data.tar.gz: 8afe7bd7ba82df75de81a97576bdebb967fc116c42ddd37c36965d9ad027ac03b998b95994d9483c2a383ba76d96986ab2dffb68ee28ea6b6a970aae460a9650
6
+ metadata.gz: ae56654d82cd2dae48600ca54fcb4f07a9b2b2e02656f16db68326ed8c01b378b5b7ad2dc82202cdb6cb393d63037144068c12245fe80f02995448015bbd699f
7
+ data.tar.gz: b2f9e80a7069deec3e36d182bf3c4ed2e45838a3909c5633951e7bb1a728425d72e9533c6d7befe12caca9e84da55326913c2317ea03493f4a18d3901aaa7a7b
@@ -1,125 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'fileutils'
5
- require 'mime/types'
6
- require 'rspec/mocks'
7
-
8
4
  ENV['RAILS_ENV'] ||= 'test'
9
- require "#{Dir.pwd}/config/environment"
10
-
11
- class ResponseDumper
12
- include ActionDispatch::Integration::Runner
13
- include RSpec::Mocks::ExampleMethods
14
-
15
- attr_reader :expected_status_code
16
-
17
- def self.inherited(subclass)
18
- super
19
- dumpers << subclass
20
- end
21
-
22
- def self.dumpers
23
- @dumpers ||= []
24
- end
25
-
26
- def self.reset_models(*models)
27
- @reset_models ||= []
28
- @reset_models += models
29
- end
30
-
31
- def self.reset_models!
32
- reset_models.each do |model|
33
- model.connection.exec_query "TRUNCATE #{model.quoted_table_name} RESTART IDENTITY CASCADE"
34
- end
35
- end
36
-
37
- # Delegates to `Rails.application`.
38
- def app
39
- Rails.application
40
- end
41
-
42
- def expect_status_code!(status_code)
43
- @expected_status_code = Rack::Utils::SYMBOL_TO_STATUS_CODE[status_code]
44
- end
45
-
46
- def responses
47
- @responses ||= []
48
- end
49
-
50
- def mock_setup
51
- RSpec::Mocks.setup
52
- end
53
-
54
- def mock_teardown
55
- RSpec::Mocks.verify
56
- ensure
57
- RSpec::Mocks.teardown
58
- end
59
-
60
- [:get, :post, :patch, :put, :head, :delete].each do |method|
61
- module_eval <<~RUBY, __FILE__, __LINE__ + 1
62
- def #{method}(...)
63
- result = super
64
- self.responses << response
65
- result
66
- end
67
- RUBY
68
- end
69
-
70
- # The list of methods is too long to be useful so shorten to just the class
71
- # name.
72
- def inspect
73
- "#<#{self.class.name}>"
74
- end
75
- end
76
-
77
- def run_dumps
78
- dumps_dir = Rails.root.join('dumps')
79
- FileUtils.rm_rf dumps_dir
80
- FileUtils.mkdir_p dumps_dir
81
-
82
- Dir[Rails.root.join('dumpers/**/*.rb')].each { |f| require f }
83
-
84
- ResponseDumper.dumpers.each do |klass|
85
- klass.instance_methods.each do |method|
86
- next unless method.start_with?('dump_')
87
-
88
- klass.reset_models!
89
-
90
- dumper = klass.new
91
- dumper.mock_setup
92
- begin
93
- ActiveRecord::Base.transaction do
94
- dumper.expect_status_code!(:ok)
95
- dumper.send(method)
96
- raise ActiveRecord::Rollback
97
- end
98
- ensure
99
- dumper.mock_teardown
100
- end
101
-
102
- klass_path = klass.name.underscore
103
- dumper_dir = "#{dumps_dir}/#{klass_path}/#{method}"
104
- FileUtils.mkdir_p dumper_dir
105
-
106
- dumper.responses.each_with_index do |response, index|
107
- unless response.status == dumper.expected_status_code
108
- raise <<~ERROR.squish
109
- Dumped response has unexpected status code #{response.status} #{response.status_message}
110
- (expected #{dumper.expected_status_code})
111
- ERROR
112
- end
113
-
114
- mime = response.content_type.split(/ *; */).first
115
- extension = MIME::Types[mime].first.preferred_extension
116
- File.write("#{dumper_dir}/#{index}.#{extension}", response.body)
117
- end
118
- end
119
- end
120
- end
5
+ require 'rails_response_dumper'
121
6
 
122
7
  # Prevent database truncation if the environment is production.
123
8
  abort 'The Rails environment is running in production mode!' if Rails.env.production?
124
- ActiveRecord::Migration.maintain_test_schema!
125
- 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,50 @@
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_codes: [:ok], &block)
26
+ blocks << DumpBlock.new(
27
+ name,
28
+ status_codes.map { |status_code| Rack::Utils::SYMBOL_TO_STATUS_CODE[status_code] },
29
+ block
30
+ )
31
+ end
32
+
33
+ def blocks
34
+ @blocks ||= []
35
+ end
36
+
37
+ def reset_models(*models)
38
+ @reset_models ||= []
39
+ @reset_models += models
40
+ end
41
+
42
+ def reset_models!
43
+ reset_models.each do |model|
44
+ model.connection.exec_query <<~SQL.squish
45
+ TRUNCATE #{model.quoted_table_name} RESTART IDENTITY CASCADE
46
+ SQL
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsResponseDumper
4
+ DumpBlock = Struct.new('DumpBlock', :name, :expected_status_codes, :block)
5
+ end
@@ -0,0 +1,76 @@
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
+ unless dumper.responses.count == dump_block.expected_status_codes.count
30
+ raise <<~ERROR.squish
31
+ #{defined.name}.#{dump_block.name} received
32
+ #{dumper.responses.count} responses
33
+ (expected #{dump_block.expected_status_codes.count})
34
+ ERROR
35
+ end
36
+
37
+ klass_path = defined.name.underscore
38
+ dumper_dir = "#{dumps_dir}/#{klass_path}/#{dump_block.name}"
39
+ FileUtils.mkdir_p dumper_dir
40
+
41
+ dumper.responses.each_with_index do |response, index|
42
+ unless response.status == dump_block.expected_status_codes[index]
43
+ raise <<~ERROR.squish
44
+ #{defined.name}.#{dump_block.name} has unexpected status
45
+ code #{response.status} #{response.status_message}
46
+ (expected #{dump_block.expected_status_codes[index]})
47
+ ERROR
48
+ end
49
+
50
+ if response.content_type
51
+ mime = response.content_type.split(/ *; */).first
52
+ extension = ".#{MIME::Types[mime].first.preferred_extension}"
53
+ else
54
+ extension = ''
55
+ end
56
+ File.write("#{dumper_dir}/#{index}#{extension}", response.body)
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def rollback_after
65
+ if defined?(ActiveRecord::Base)
66
+ ActiveRecord::Base.transaction do
67
+ yield
68
+ raise ActiveRecord::Rollback
69
+ end
70
+ else
71
+ # ActiveRecord is not installed.
72
+ yield
73
+ end
74
+ end
75
+ end
76
+ 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.1.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pioneer Valley Books
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-03 00:00:00.000000000 Z
11
+ date: 2022-06-06 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
@@ -34,16 +48,16 @@ dependencies:
34
48
  name: rspec-mocks
35
49
  requirement: !ruby/object:Gem::Requirement
36
50
  requirements:
37
- - - ">="
51
+ - - "~>"
38
52
  - !ruby/object:Gem::Version
39
- version: '0'
53
+ version: '3.0'
40
54
  type: :runtime
41
55
  prerelease: false
42
56
  version_requirements: !ruby/object:Gem::Requirement
43
57
  requirements:
44
- - - ">="
58
+ - - "~>"
45
59
  - !ruby/object:Gem::Version
46
- version: '0'
60
+ version: '3.0'
47
61
  description: |
48
62
  Rails Response Dumper is a library and command line tool to dump HTTP
49
63
  responses from a Rails application to the file system. These responses can
@@ -55,6 +69,11 @@ extensions: []
55
69
  extra_rdoc_files: []
56
70
  files:
57
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
58
77
  homepage: https://github.com/Pioneer-Valley-Books/rails-response-dumper
59
78
  licenses:
60
79
  - MIT
@@ -75,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
94
  - !ruby/object:Gem::Version
76
95
  version: '0'
77
96
  requirements: []
78
- rubygems_version: 3.3.3
97
+ rubygems_version: 3.3.7
79
98
  signing_key:
80
99
  specification_version: 4
81
100
  summary: Dump HTTP responses from a Rails application to the file system