mock_api 0.1.0 → 0.2.1

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: 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: