mock_api 0.1.0 → 0.2.0

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: 454465036d05401ec66979ba7b6fb09cee761a03d0fd6ccff3706c7da588a661
4
+ data.tar.gz: 7ba42e505589caaef943bcc6b2210ac8eb4be0fca7ab341b19448d2f5745c0ba
5
5
  SHA512:
6
- metadata.gz: 951fcc075cb569d22ee0d40206e59cd203b3120a96a7a54e45c9cc843995bf063bc4c9cbb3c9078466e1e69e39ed246c8f7f1a15554742a8a9decde7ceea2eea
7
- data.tar.gz: 378db69f81754959e6a740bdb668a535428cb4bab6aa32af2bcd9f8021b4ae23aef3b1e28d232ebb7cf6e684587c4626f9adb2fb115c4c55da7c0ff166a8b04e
6
+ metadata.gz: 98c2286140ccb4afcae8eb7cf4baac8e09c56d29944ca8547292d58cd9ae863a597b2d7825d58a009d72f6d41a5e353c66135c96789b8a945daa9b4a826f0f55
7
+ data.tar.gz: 1057bce5ebe4a1a8242dfd979e2a23258f3d866898008be5fbd0a0f9ac8c2e7469dc1b934dc2f923b704440f0377479e28c1a4e9d62e681b09dfa7f0cbc02ae7
@@ -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.0"
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,29 @@
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.0
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: sinatra
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.2.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.2.2
13
27
  description: A library for building mock APIs in tests
14
28
  email:
15
29
  - david.kramer@redtailtechnology.com
@@ -18,6 +32,8 @@ extensions: []
18
32
  extra_rdoc_files: []
19
33
  files:
20
34
  - lib/mock_api.rb
35
+ - lib/mock_api/runner.rb
36
+ - lib/mock_api/store.rb
21
37
  - lib/mock_api/version.rb
22
38
  homepage: https://github.com/davidtkramer/mock_api
23
39
  licenses: