mock_api 0.1.0 → 0.2.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: 90079dde3e422cd099d9cf1038ebb395ada91d6637b3137f515b50f48298568b
4
- data.tar.gz: eb7382e061fb65b4cf02b4ec0d5b3c9c9b066c72aefb83a054c67f87a716f507
3
+ metadata.gz: b013d99524a26ab89473f75ec3498400c495e4183ea90ce7689370b6fdd0ad06
4
+ data.tar.gz: 8b8ca7729b30a54baf14dc2836ab3e12d55022c32f9826f589a16f6e39763956
5
5
  SHA512:
6
- metadata.gz: 951fcc075cb569d22ee0d40206e59cd203b3120a96a7a54e45c9cc843995bf063bc4c9cbb3c9078466e1e69e39ed246c8f7f1a15554742a8a9decde7ceea2eea
7
- data.tar.gz: 378db69f81754959e6a740bdb668a535428cb4bab6aa32af2bcd9f8021b4ae23aef3b1e28d232ebb7cf6e684587c4626f9adb2fb115c4c55da7c0ff166a8b04e
6
+ metadata.gz: bfbe0a3caab065f84e5002ee04b1170841989c88dd6fe25b9a2ae02abef3e32a15bb3811ca2c531e7aa5ff7365eca8a8be6eee334af99e872b81740db14fc7e6
7
+ data.tar.gz: 4b9e5654ac0ff57cc2a459bc875119a727c1ffa8e232df4a5232eaea982a3457adabd3239ac42d11d078d20bf725c6a69164767ce7ed4f9523bad0d4b97f014b
@@ -0,0 +1,58 @@
1
+ module MockApi
2
+ class Runner
3
+ def initialize(url:, server:, store: nil)
4
+ @url = Regexp.new(url)
5
+ @server = server
6
+ @store = store
7
+ extend(store.mixin) unless store.nil?
8
+ end
9
+
10
+ def run(url = @url)
11
+ if defined?(::WebMock)
12
+ WebMock.stub_request(:any, url).to_rack(@server)
13
+ else
14
+ raise 'MockApi requires WebMock to be installed. ' \
15
+ 'Check out the setup guide at https://github.com/davidtkramer/mock_api#quick-start.'
16
+ end
17
+ end
18
+
19
+ def reset
20
+ @store&.reset
21
+ end
22
+
23
+ def hooks
24
+ this = self
25
+ Module.new do
26
+ define_singleton_method :included do |klass|
27
+ klass.class_eval do
28
+ if klass.method_defined?(:before_setup) # minitest
29
+ klass.define_method(:before_setup) do
30
+ super()
31
+ this.run
32
+ end
33
+ elsif respond_to?(:setup) # rails
34
+ setup { this.run }
35
+ elsif respond_to?(:before) # rspec
36
+ before { this.run }
37
+ else
38
+ raise "Unable to initialize MockApi setup hook in #{klass}"
39
+ end
40
+
41
+ if klass.method_defined?(:before_teardown) # minitest
42
+ klass.define_method(:before_teardown) do
43
+ super()
44
+ this.reset
45
+ end
46
+ elsif respond_to?(:teardown) # rails
47
+ teardown { this.reset }
48
+ elsif respond_to?(:after) # rspec
49
+ after { this.reset }
50
+ else
51
+ raise "Unable to initialize MockApi teardown hook in #{klass}"
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,47 @@
1
+ module MockApi
2
+ class Store
3
+ def initialize(*entity_types)
4
+ @store = {}
5
+ @entity_types = entity_types
6
+ entity_types.each do |entity_type|
7
+ @store[entity_type] = Repository.new([])
8
+ end
9
+ end
10
+
11
+ def add(entity_type, entity)
12
+ @store[entity_type].add(entity)
13
+ end
14
+
15
+ def [](entity_type)
16
+ @store[entity_type]
17
+ end
18
+
19
+ def reset
20
+ @store.transform_values! { Repository.new([]) }
21
+ end
22
+
23
+ def mixin
24
+ store = @store
25
+ entity_types = @entity_types
26
+ Module.new do
27
+ define_singleton_method :included do |klass|
28
+ entity_types.each do |entity_type|
29
+ klass.define_method(entity_type) { store[entity_type] }
30
+ end
31
+ end
32
+ define_singleton_method :extended do |klass|
33
+ entity_types.each do |entity_type|
34
+ klass.define_singleton_method(entity_type) { store[entity_type] }
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ class Repository < SimpleDelegator
41
+ def add(entity)
42
+ push(entity)
43
+ entity
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,3 +1,3 @@
1
1
  module MockApi
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/mock_api.rb CHANGED
@@ -1,7 +1,47 @@
1
- require_relative "mock_api/version"
1
+ require_relative 'mock_api/version'
2
+ require_relative 'mock_api/runner'
3
+ require_relative 'mock_api/store'
2
4
 
3
5
  module MockApi
4
- def self.hello
5
- puts 'hello'
6
+ def self.included(klass)
7
+ klass.extend(ClassMethods)
8
+ class << klass
9
+ attr_accessor :runner, :store
10
+ end
11
+ end
12
+
13
+ module ClassMethods
14
+ def mock(&block)
15
+ definition = MockDefinition.new
16
+ definition.instance_exec(&block)
17
+ self.store = Store.new(*definition.entity_types) unless definition.entity_types.nil?
18
+ self.runner = Runner.new(url: definition._url, server: self, store: store)
19
+ extend(store.mixin)
20
+ include(store.mixin)
21
+ end
22
+
23
+ def hooks
24
+ runner.hooks
25
+ end
26
+
27
+ def reset
28
+ runner.reset
29
+ end
30
+
31
+ def run(url = nil)
32
+ url.nil? ? runner.run : runner.run(url)
33
+ end
34
+
35
+ class MockDefinition
36
+ attr_reader :_url, :entity_types
37
+
38
+ def url(url)
39
+ @_url = url
40
+ end
41
+
42
+ def store(*entity_types)
43
+ @entity_types = entity_types
44
+ end
45
+ end
6
46
  end
7
47
  end
metadata CHANGED
@@ -1,15 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mock_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Kramer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-25 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2022-09-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '13.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '13.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.7'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: webmock
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.18'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.18'
69
+ - !ruby/object:Gem::Dependency
70
+ name: faraday
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sinatra
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 2.2.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 2.2.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: sinatra-contrib
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
13
111
  description: A library for building mock APIs in tests
14
112
  email:
15
113
  - david.kramer@redtailtechnology.com
@@ -18,6 +116,8 @@ extensions: []
18
116
  extra_rdoc_files: []
19
117
  files:
20
118
  - lib/mock_api.rb
119
+ - lib/mock_api/runner.rb
120
+ - lib/mock_api/store.rb
21
121
  - lib/mock_api/version.rb
22
122
  homepage: https://github.com/davidtkramer/mock_api
23
123
  licenses: