http_stub 0.15.1 → 0.15.2

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
  SHA1:
3
- metadata.gz: 438c42456ebda9bd71a4c56735be06a71c62ef68
4
- data.tar.gz: d9c2910a45e9c6ec166e58d7d02dd1f8a2d31357
3
+ metadata.gz: 473cfd88f509d2e18bbf47ffbcd7d013d5bae137
4
+ data.tar.gz: 3c2afdb69d93618e52df58e22a7e1fd9de623756
5
5
  SHA512:
6
- metadata.gz: 79748781d578ca9908fb56d818605e2ad1670958d69c9f47a5b1d692227d156f34fa4ed1f22caf26f0ef07a5838bbe98ba9190d3bae21ba79d4b779101562107
7
- data.tar.gz: 719ec839fe7f02751cf4ea178e33daac0a9502c43ec3bac543c5f7f319e756decb8e0ab05b08fb2cc79a4bed2bb1d3938ac15476eecd3b1414114a96ecb1f811
6
+ metadata.gz: e024dcbeb70730ee13353fde8845fff7f6b2bedb3a668d3f33428f5069c40b3f0ed3a7104ef6c6f803644fe8f5bf42a74b6511524e07ff33cec4c00744f40f97
7
+ data.tar.gz: d191926b0caf32e8553cc7c109912f23ada60a360f211c682214476bfca9ea41f269bce5ebce0fae1d615c1b6da4b9660d1fe7f07e46108c49428f28ca4b61fa
data/lib/http_stub.rb CHANGED
@@ -31,8 +31,8 @@ require_relative 'http_stub/server/stub_response'
31
31
  require_relative 'http_stub/server/response'
32
32
  require_relative 'http_stub/server/stub_triggers'
33
33
  require_relative 'http_stub/server/stub'
34
- require_relative 'http_stub/server/stub_factory'
35
34
  require_relative 'http_stub/server/stub_activator'
35
+ require_relative 'http_stub/server/request_parser'
36
36
  require_relative 'http_stub/server/registry'
37
37
  require_relative 'http_stub/server/stub_registry'
38
38
  require_relative 'http_stub/server/response_pipeline'
@@ -1,14 +1,14 @@
1
1
  module HttpStub
2
2
  module Server
3
3
 
4
- class StubFactory
4
+ class RequestParser
5
5
 
6
6
  class << self
7
7
 
8
- def create(request)
9
- payload = JSON.parse(request.params["payload"] || request.body.read)
10
- consolidated_payload = consolidate_files_into_payload(payload, request)
11
- HttpStub::Server::Stub.new(consolidated_payload)
8
+ def parse(request)
9
+ JSON.parse(request.params["payload"] || request.body.read).tap do |payload|
10
+ consolidate_files_into_payload(payload, request)
11
+ end
12
12
  end
13
13
 
14
14
  private
@@ -19,7 +19,6 @@ module HttpStub
19
19
  payload["triggers"].each do |trigger_payload|
20
20
  consolidate_files_into_payload(trigger_payload, request)
21
21
  end if payload["triggers"]
22
- payload
23
22
  end
24
23
 
25
24
  end
@@ -3,10 +3,6 @@ module HttpStub
3
3
 
4
4
  class StubActivator
5
5
 
6
- def self.create_from(request)
7
- self.new(JSON.parse(request.params["payload"] || request.body.read))
8
- end
9
-
10
6
  def initialize(args)
11
7
  @args = args
12
8
  @stub = HttpStub::Server::Stub.new(args)
@@ -9,7 +9,8 @@ module HttpStub
9
9
  end
10
10
 
11
11
  def register(request)
12
- @stub_activator_registry.add(HttpStub::Server::StubActivator.create_from(request), request)
12
+ stub_activator = HttpStub::Server::StubActivator.new(HttpStub::Server::RequestParser.parse(request))
13
+ @stub_activator_registry.add(stub_activator, request)
13
14
  HttpStub::Server::Response::SUCCESS
14
15
  end
15
16
 
@@ -8,7 +8,8 @@ module HttpStub
8
8
  end
9
9
 
10
10
  def register(request)
11
- @registry.add(HttpStub::Server::StubFactory.create(request), request)
11
+ stub = HttpStub::Server::Stub.new(HttpStub::Server::RequestParser.parse(request))
12
+ @registry.add(stub, request)
12
13
  HttpStub::Server::Response::SUCCESS
13
14
  end
14
15
 
@@ -1,3 +1,3 @@
1
1
  module HttpStub
2
- VERSION = "0.15.1".freeze
2
+ VERSION = "0.15.2".freeze
3
3
  end
@@ -19,15 +19,38 @@ describe HttpStub::Configurer, "when the server is running" do
19
19
 
20
20
  context "and a stub is activated" do
21
21
 
22
- before(:example) { configurer.activate!("/an_activator") }
22
+ context "and the response contains text" do
23
23
 
24
- context "and the stub request is made" do
24
+ before(:example) { configurer.activate!("/an_activator") }
25
25
 
26
- let(:response) { HTTParty.get("#{server_uri}/stub_path") }
26
+ context "and the stub request is made" do
27
+
28
+ let(:response) { HTTParty.get("#{server_uri}/stub_path") }
29
+
30
+ it "replays the stubbed response" do
31
+ expect(response.code).to eql(200)
32
+ expect(response.body).to eql("Stub activator body")
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ context "and the response contains a file" do
40
+
41
+ let(:configurer) { HttpStub::Examples::ConfigurerWithFileResponse.new }
42
+
43
+ before(:example) { configurer.activate!("/a_file_activator") }
44
+
45
+ context "and the stub request is made" do
46
+
47
+ let(:response) { HTTParty.get("#{server_uri}/activated_response_with_file") }
48
+
49
+ it "replays the stubbed response" do
50
+ expect(response.code).to eql(200)
51
+ expect_response_to_contain_file(HttpStub::Examples::ConfigurerWithFileResponse::FILE_PATH)
52
+ end
27
53
 
28
- it "replays the stubbed response" do
29
- expect(response.code).to eql(200)
30
- expect(response.body).to eql("Stub activator body")
31
54
  end
32
55
 
33
56
  end
@@ -584,7 +607,7 @@ describe HttpStub::Configurer, "when the server is running" do
584
607
 
585
608
  it "replays the triggered response" do
586
609
  expect(response.code).to eql(201)
587
- assert_response_contains_file(pdf_file_path)
610
+ expect_response_to_contain_file(pdf_file_path)
588
611
  end
589
612
 
590
613
  end
@@ -655,7 +678,7 @@ describe HttpStub::Configurer, "when the server is running" do
655
678
  end
656
679
 
657
680
  it "responds with the file" do
658
- assert_response_contains_file(HttpStub::Examples::ConfigurerWithFileResponse::FILE_PATH)
681
+ expect_response_to_contain_file(HttpStub::Examples::ConfigurerWithFileResponse::FILE_PATH)
659
682
  end
660
683
 
661
684
  end
@@ -781,7 +804,7 @@ describe HttpStub::Configurer, "when the server is running" do
781
804
 
782
805
  end
783
806
 
784
- def assert_response_contains_file(path)
807
+ def expect_response_to_contain_file(path)
785
808
  response_file = Tempfile.new(File.basename(path)).tap do |file|
786
809
  file.write(response.parsed_response)
787
810
  file.flush
@@ -0,0 +1,90 @@
1
+ describe HttpStub::Server::RequestParser do
2
+
3
+ let(:request_parser) { HttpStub::Server::RequestParser }
4
+
5
+ describe "::parse" do
6
+
7
+ let(:params) { {} }
8
+ let(:body_hash) { {} }
9
+ let(:request) { instance_double(Rack::Request, params: params, body: StringIO.new(body_hash.to_json)) }
10
+
11
+ subject { request_parser.parse(request) }
12
+
13
+ context "when the request contains a payload parameter" do
14
+
15
+ let(:payload) { HttpStub::StubFixture.new.server_payload }
16
+ let(:params) { { "payload" => payload.to_json } }
17
+
18
+ it "returns the payload" do
19
+ expect(subject).to eql(payload)
20
+ end
21
+
22
+ end
23
+
24
+ context "when the request body contains the payload (for API backwards compatibility)" do
25
+
26
+ let(:body_hash) { HttpStub::StubFixture.new.server_payload }
27
+
28
+ it "returns the request body" do
29
+ expect(subject).to eql(body_hash)
30
+ end
31
+
32
+ end
33
+
34
+ context "when the payload contains a response file and has a corresponding file parameter" do
35
+
36
+ let(:payload_fixture) { HttpStub::StubFixture.new.with_file_response! }
37
+ let(:payload) { payload_fixture.server_payload }
38
+ let(:file_params) { { "response_file_#{payload_fixture.id}" => payload_fixture.file_parameter } }
39
+ let(:params) { { "payload" => payload.to_json }.merge(file_params) }
40
+
41
+ it "returns the payload with a response body that contains the file parameter value" do
42
+ expected_payload = payload.clone.tap { |hash| hash["response"]["body"] = payload_fixture.file_parameter }
43
+
44
+ expect(subject).to eql(expected_payload)
45
+ end
46
+
47
+ end
48
+
49
+ context "when the payload contains triggers" do
50
+
51
+ let(:payload_fixture) { HttpStub::StubFixture.new.with_triggers!(trigger_fixtures) }
52
+ let(:payload) { payload_fixture.server_payload }
53
+
54
+ context "and the trigger payloads contain response text" do
55
+
56
+ let(:trigger_fixtures) { (1..3).map { HttpStub::StubFixture.new.with_text_response! } }
57
+ let(:params) { { "payload" => payload.to_json } }
58
+
59
+ it "returns the payload unchanged" do
60
+ expect(subject).to eql(payload)
61
+ end
62
+
63
+ end
64
+
65
+ context "and the trigger payloads contain a response file with corresponding file parameters" do
66
+
67
+ let(:trigger_fixtures) { (1..3).map { HttpStub::StubFixture.new.with_file_response! } }
68
+ let(:file_params) do
69
+ trigger_fixtures.reduce({}) do |result, fixture|
70
+ result.merge("response_file_#{fixture.id}" => fixture.file_parameter)
71
+ end
72
+ end
73
+ let(:params) { { "payload" => payload.to_json }.merge(file_params) }
74
+
75
+ it "returns the payload with the trigger response bodies replaced by the files" do
76
+ expected_payload = payload_fixture.server_payload
77
+ expected_payload["triggers"].zip(trigger_fixtures.map(&:file_parameter)).each do |trigger, file_param|
78
+ trigger["response"]["body"] = file_param
79
+ end
80
+
81
+ expect(subject).to eql(expected_payload)
82
+ end
83
+
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+
90
+ end
@@ -1,21 +1,31 @@
1
1
  describe HttpStub::Server::StubActivatorController do
2
2
 
3
- let(:request) { double("HttpRequest") }
4
- let(:the_stub) { double(HttpStub::Server::Stub) }
5
- let(:stub_activator) { double(HttpStub::Server::StubActivator, the_stub: the_stub) }
6
- let(:stub_activator_registry) { double("HttpStub::Server::StubActivatorRegistry").as_null_object }
7
- let(:stub_registry) { double("HttpStub::Server::StubRegistry").as_null_object }
3
+ let(:request) { instance_double(Rack::Request) }
4
+ let(:payload) { HttpStub::StubFixture.new.server_payload.merge("activation_uri" => "/some/activation/uri") }
5
+ let(:the_stub) { instance_double(HttpStub::Server::Stub) }
6
+ let(:stub_activator) { instance_double(HttpStub::Server::StubActivator, the_stub: the_stub) }
7
+ let(:stub_activator_registry) { instance_double(HttpStub::Server::Registry).as_null_object }
8
+ let(:stub_registry) { instance_double(HttpStub::Server::StubRegistry).as_null_object }
8
9
 
9
10
  let(:controller) { HttpStub::Server::StubActivatorController.new(stub_activator_registry, stub_registry) }
10
11
 
11
- before(:example) { allow(HttpStub::Server::StubActivator).to receive(:create_from).and_return(stub_activator) }
12
+ before(:example) do
13
+ allow(HttpStub::Server::RequestParser).to receive(:parse).and_return(payload)
14
+ allow(HttpStub::Server::StubActivator).to receive(:new).and_return(stub_activator)
15
+ end
12
16
 
13
17
  describe "#register" do
14
18
 
15
19
  subject { controller.register(request) }
16
20
 
17
- it "creates a stub activator from the provided request" do
18
- expect(HttpStub::Server::StubActivator).to receive(:create_from).with(request).and_return(stub_activator)
21
+ it "parses the payload from the request" do
22
+ expect(HttpStub::Server::RequestParser).to receive(:parse).with(request).and_return(payload)
23
+
24
+ subject
25
+ end
26
+
27
+ it "creates a stub activator with the parsed payload" do
28
+ expect(HttpStub::Server::StubActivator).to receive(:new).with(payload).and_return(stub_activator)
19
29
 
20
30
  subject
21
31
  end
@@ -8,43 +8,12 @@ describe HttpStub::Server::StubActivator do
8
8
 
9
9
  before(:example) { allow(HttpStub::Server::Stub).to receive(:new).and_return(underlying_stub) }
10
10
 
11
- describe "::create_from" do
11
+ describe "#constructor" do
12
12
 
13
- let(:payload) { args.to_json }
14
-
15
- subject { HttpStub::Server::StubActivator.create_from(request) }
16
-
17
- shared_context "verification a stub activator is created from a request" do
18
-
19
- it "creates a stub activator with JSON parsed from the request payload" do
20
- expect(HttpStub::Server::StubActivator).to receive(:new).with(args)
21
-
22
- subject
23
- end
24
-
25
- it "returns the created stub activator" do
26
- created_stub_activator = instance_double(HttpStub::Server::StubActivator)
27
- allow(HttpStub::Server::StubActivator).to receive(:new).and_return(created_stub_activator)
28
-
29
- expect(subject).to eql(created_stub_activator)
30
- end
31
-
32
- end
33
-
34
- context "when the request body contains the payload" do
35
-
36
- let(:request) { double("HttpRequest", params: {}, body: double("RequestBody", read: payload)) }
37
-
38
- include_context "verification a stub activator is created from a request"
39
-
40
- end
41
-
42
- context "when the request contains a payload parameter" do
43
-
44
- let(:request) { double("HttpRequest", params: { "payload" => payload }) }
45
-
46
- include_context "verification a stub activator is created from a request"
13
+ it "creates an underlying stub from the provided arguments" do
14
+ expect(HttpStub::Server::Stub).to receive(:new).with(args)
47
15
 
16
+ stub_activator
48
17
  end
49
18
 
50
19
  end
@@ -1,20 +1,30 @@
1
1
  describe HttpStub::Server::StubController do
2
2
 
3
- let(:request) { double("HttpRequest") }
4
- let(:response) { double(HttpStub::Server::Response) }
5
- let(:the_stub) { double(HttpStub::Server::Stub, response: response) }
6
- let(:registry) { double(HttpStub::Server::Registry).as_null_object }
3
+ let(:request) { instance_double(Rack::Request) }
4
+ let(:payload) { HttpStub::StubFixture.new.server_payload }
5
+ let(:response) { instance_double(HttpStub::Server::StubResponse::Base) }
6
+ let(:the_stub) { instance_double(HttpStub::Server::Stub, response: response) }
7
+ let(:registry) { instance_double(HttpStub::Server::StubRegistry).as_null_object }
7
8
 
8
9
  let(:controller) { HttpStub::Server::StubController.new(registry) }
9
10
 
10
- before(:example) { allow(HttpStub::Server::StubFactory).to receive(:create).and_return(the_stub) }
11
+ before(:example) do
12
+ allow(HttpStub::Server::RequestParser).to receive(:parse).and_return(payload)
13
+ allow(HttpStub::Server::Stub).to receive(:new).and_return(the_stub)
14
+ end
11
15
 
12
16
  describe "#register" do
13
17
 
14
18
  subject { controller.register(request) }
15
19
 
16
- it "creates a stub from the provided request via the factory" do
17
- expect(HttpStub::Server::StubFactory).to receive(:create).with(request).and_return(the_stub)
20
+ it "parses the payload from the request" do
21
+ expect(HttpStub::Server::RequestParser).to receive(:parse).with(request).and_return(payload)
22
+
23
+ subject
24
+ end
25
+
26
+ it "creates a stub with the parsed payload" do
27
+ expect(HttpStub::Server::Stub).to receive(:new).with(payload).and_return(the_stub)
18
28
 
19
29
  subject
20
30
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http_stub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.1
4
+ version: 0.15.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Ueckerman
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-05-19 00:00:00.000000000 Z
12
+ date: 2015-05-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -290,6 +290,7 @@ files:
290
290
  - "./lib/http_stub/server/regexp_value_matcher.rb"
291
291
  - "./lib/http_stub/server/registry.rb"
292
292
  - "./lib/http_stub/server/request_header_parser.rb"
293
+ - "./lib/http_stub/server/request_parser.rb"
293
294
  - "./lib/http_stub/server/response.rb"
294
295
  - "./lib/http_stub/server/response_pipeline.rb"
295
296
  - "./lib/http_stub/server/string_value_matcher.rb"
@@ -297,7 +298,6 @@ files:
297
298
  - "./lib/http_stub/server/stub_activator.rb"
298
299
  - "./lib/http_stub/server/stub_activator_controller.rb"
299
300
  - "./lib/http_stub/server/stub_controller.rb"
300
- - "./lib/http_stub/server/stub_factory.rb"
301
301
  - "./lib/http_stub/server/stub_headers.rb"
302
302
  - "./lib/http_stub/server/stub_parameters.rb"
303
303
  - "./lib/http_stub/server/stub_registry.rb"
@@ -350,13 +350,13 @@ files:
350
350
  - "./spec/lib/http_stub/server/regexp_value_matcher_spec.rb"
351
351
  - "./spec/lib/http_stub/server/registry_spec.rb"
352
352
  - "./spec/lib/http_stub/server/request_header_parser_spec.rb"
353
+ - "./spec/lib/http_stub/server/request_parser_spec.rb"
353
354
  - "./spec/lib/http_stub/server/response_pipeline_spec.rb"
354
355
  - "./spec/lib/http_stub/server/response_spec.rb"
355
356
  - "./spec/lib/http_stub/server/string_value_matcher_spec.rb"
356
357
  - "./spec/lib/http_stub/server/stub_activator_controller_spec.rb"
357
358
  - "./spec/lib/http_stub/server/stub_activator_spec.rb"
358
359
  - "./spec/lib/http_stub/server/stub_controller_spec.rb"
359
- - "./spec/lib/http_stub/server/stub_factory_spec.rb"
360
360
  - "./spec/lib/http_stub/server/stub_headers_spec.rb"
361
361
  - "./spec/lib/http_stub/server/stub_parameters_spec.rb"
362
362
  - "./spec/lib/http_stub/server/stub_registry_integration_spec.rb"
@@ -435,13 +435,13 @@ test_files:
435
435
  - "./spec/lib/http_stub/server/regexp_value_matcher_spec.rb"
436
436
  - "./spec/lib/http_stub/server/registry_spec.rb"
437
437
  - "./spec/lib/http_stub/server/request_header_parser_spec.rb"
438
+ - "./spec/lib/http_stub/server/request_parser_spec.rb"
438
439
  - "./spec/lib/http_stub/server/response_pipeline_spec.rb"
439
440
  - "./spec/lib/http_stub/server/response_spec.rb"
440
441
  - "./spec/lib/http_stub/server/string_value_matcher_spec.rb"
441
442
  - "./spec/lib/http_stub/server/stub_activator_controller_spec.rb"
442
443
  - "./spec/lib/http_stub/server/stub_activator_spec.rb"
443
444
  - "./spec/lib/http_stub/server/stub_controller_spec.rb"
444
- - "./spec/lib/http_stub/server/stub_factory_spec.rb"
445
445
  - "./spec/lib/http_stub/server/stub_headers_spec.rb"
446
446
  - "./spec/lib/http_stub/server/stub_parameters_spec.rb"
447
447
  - "./spec/lib/http_stub/server/stub_registry_integration_spec.rb"
@@ -1,117 +0,0 @@
1
- describe HttpStub::Server::StubFactory do
2
-
3
- describe "::create" do
4
-
5
- let(:params) { {} }
6
- let(:body_hash) { {} }
7
- let(:request) { instance_double(Rack::Request, params: params, body: StringIO.new(body_hash.to_json)) }
8
-
9
- subject { HttpStub::Server::StubFactory.create(request) }
10
-
11
- shared_context "returns the created stub" do
12
-
13
- it "returns the created stub" do
14
- stub = instance_double(HttpStub::Server::Stub)
15
- allow(HttpStub::Server::Stub).to receive(:new).and_return(stub)
16
-
17
- expect(subject).to eql(stub)
18
- end
19
-
20
- end
21
-
22
- context "when the request contains a payload parameter" do
23
-
24
- let(:payload) { HttpStub::StubFixture.new.server_payload }
25
- let(:params) { { "payload" => payload.to_json } }
26
-
27
- it "creates the stub with the payload" do
28
- expect(HttpStub::Server::Stub).to receive(:new).with(payload)
29
-
30
- subject
31
- end
32
-
33
- include_context "returns the created stub"
34
-
35
- end
36
-
37
- context "when the request body contains the payload (for API backwards compatibility)" do
38
-
39
- let(:body_hash) { HttpStub::StubFixture.new.server_payload }
40
-
41
- it "creates the stub with the request body" do
42
- expect(HttpStub::Server::Stub).to receive(:new).with(body_hash)
43
-
44
- subject
45
- end
46
-
47
- include_context "returns the created stub"
48
-
49
- end
50
-
51
- context "when a stub payload contains a response file and has a corresponding file parameter" do
52
-
53
- let(:stub_fixture) { HttpStub::StubFixture.new.with_file_response! }
54
- let(:payload) { stub_fixture.server_payload }
55
- let(:file_params) { { "response_file_#{stub_fixture.id}" => stub_fixture.file_parameter } }
56
- let(:params) { { "payload" => payload.to_json }.merge(file_params) }
57
-
58
- it "creates the stub with a response body that contains the file parameter value" do
59
- expected_args = payload.clone.tap { |hash| hash["response"]["body"] = stub_fixture.file_parameter }
60
- expect(HttpStub::Server::Stub).to receive(:new).with(expected_args)
61
-
62
- subject
63
- end
64
-
65
- include_context "returns the created stub"
66
-
67
- end
68
-
69
- context "when a stub payload contains triggers" do
70
-
71
- let(:stub_fixture) { HttpStub::StubFixture.new.with_triggers!(trigger_fixtures) }
72
- let(:payload) { stub_fixture.server_payload }
73
-
74
- context "and the trigger payloads contain response text" do
75
-
76
- let(:trigger_fixtures) { (1..3).map { HttpStub::StubFixture.new.with_text_response! } }
77
- let(:params) { { "payload" => payload.to_json } }
78
-
79
- it "creates the stub with the stub payload unchanged" do
80
- expect(HttpStub::Server::Stub).to receive(:new).with(payload)
81
-
82
- subject
83
- end
84
-
85
- include_context "returns the created stub"
86
-
87
- end
88
-
89
- context "and the trigger payloads contain a response file with corresponding file parameters" do
90
-
91
- let(:trigger_fixtures) { (1..3).map { HttpStub::StubFixture.new.with_file_response! } }
92
- let(:file_params) do
93
- trigger_fixtures.reduce({}) do |result, fixture|
94
- result.merge("response_file_#{fixture.id}" => fixture.file_parameter)
95
- end
96
- end
97
- let(:params) { { "payload" => payload.to_json }.merge(file_params) }
98
-
99
- it "creates the stub with the trigger response bodies replaced by the files" do
100
- expected_args = stub_fixture.server_payload
101
- expected_args["triggers"].zip(trigger_fixtures.map(&:file_parameter)).each do |trigger, file_param|
102
- trigger["response"]["body"] = file_param
103
- end
104
- expect(HttpStub::Server::Stub).to receive(:new).with(expected_args)
105
-
106
- subject
107
- end
108
-
109
- include_context "returns the created stub"
110
-
111
- end
112
-
113
- end
114
-
115
- end
116
-
117
- end