webspicy 0.20.8 → 0.20.13

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: 9f14b3463098780f10139ffd28362d60eaa61e4b9e77d16a91e8ac597847ca1b
4
- data.tar.gz: 73571e1c2bd2764e4de2af708fa94d396ae943029ab11300ce9e14345c3479db
3
+ metadata.gz: 01b2fecc83c9d660dc6eba242b306e965196a6ecf9ad12b9b0e5929d9394e1ab
4
+ data.tar.gz: 16e008749db41f89755e9c0cc65457e438383044aaf54c6e171fc565b2da8ba0
5
5
  SHA512:
6
- metadata.gz: 3e6281472272c61b01898ff513b721a3203a6c21ad314c0932d069fab01529d060030db1d0a0d6bb445bf306a62618227aee1fd6dfaea08f0073247f338b9582
7
- data.tar.gz: 7136d69f3f9b5de2a1fb72a37377bc01262311c9f4e6bbf52e2062452368a5b81ace3f11b9173c88ac85f46ea3c2765582633b8cb22a43d85def530fb378c471
6
+ metadata.gz: 0f7a18cbbfead965fefc954c07ea8ebb2d91e60cfd0e72c2658ec5e7c5c1425b6d9f0c8e2d3c09e7b3399697ab299c36f9873e1837422f785e96e1a298cccfaa
7
+ data.tar.gz: 12377e4af44a7b6d65c6daf3c83a41d1201ec3deab8922343b25f8f6483f07fb997dca45ed6e3fbc243c5f869c915642a7e6a867bf90dc0e5f8bae5fda7fb726
@@ -22,7 +22,7 @@ module Webspicy
22
22
  def _each_specification_file(config, apply_filter = true)
23
23
  folder = config.folder
24
24
  world = config.folder/"world"
25
- fs = folder.glob("**/*.yml").reject{|f| f.to_s.start_with?(world.to_s) }
25
+ fs = folder.glob("**/*.{yml, yaml}").reject{|f| f.to_s.start_with?(world.to_s) }
26
26
  fs = fs.sort
27
27
  fs = fs.select(&to_filter_proc(config.file_filter)) if apply_filter
28
28
  fs.each do |file|
@@ -14,6 +14,10 @@ module Webspicy
14
14
  @location = Path(location)
15
15
  end
16
16
 
17
+ def relative_location
18
+ @location && @location.relative_to(config.folder)
19
+ end
20
+
17
21
  def locate(relative_path)
18
22
  file = @location.parent/relative_path
19
23
  raise "File not found: #{file}" unless file.exists?
@@ -21,7 +25,7 @@ module Webspicy
21
25
  end
22
26
 
23
27
  def name
24
- @raw[:name]
28
+ @raw[:name] || relative_location || "Unnamed"
25
29
  end
26
30
 
27
31
  def services
@@ -149,6 +149,8 @@ module Webspicy
149
149
  end
150
150
 
151
151
  def call_test_case_target
152
+ @invocation = nil
153
+ @invocation_error = nil
152
154
  reporter.before_invocation
153
155
  @invocation = client.call(test_case)
154
156
  reporter.invocation_done
@@ -0,0 +1,39 @@
1
+ module Webspicy
2
+ class Tester
3
+ class Fakesendgrid
4
+ include Webspicy::Support::World::Item
5
+
6
+ DEFAULT_OPTIONS = {
7
+ endpoint: "http://fakesendgrid"
8
+ }
9
+
10
+ def initialize(options = {})
11
+ @options = DEFAULT_OPTIONS.merge(options)
12
+ end
13
+ attr_reader :options
14
+
15
+ def endpoint
16
+ options[:endpoint]
17
+ end
18
+
19
+ def clear!
20
+ res = HTTP.delete("#{endpoint}/api/mails")
21
+ end
22
+
23
+ def emails
24
+ res = HTTP.get("#{endpoint}/api/mails")
25
+ JSON.parse(res.body).map{|data| Email.new(data) }
26
+ end
27
+
28
+ def emails_count
29
+ emails.length
30
+ end
31
+
32
+ def last_email
33
+ emails.first
34
+ end
35
+
36
+ end # class Fakesendgrid
37
+ end # class Tester
38
+ end # module Webspicy
39
+ require_relative 'fakesendgrid/email'
@@ -0,0 +1,31 @@
1
+ module Webspicy
2
+ class Tester
3
+ class Fakesendgrid
4
+ class Email
5
+
6
+ def initialize(data)
7
+ @data = data
8
+ end
9
+ attr_reader :data
10
+
11
+ def from
12
+ @from ||= data['from']['name'] ?
13
+ "#{data['from']['name']} <#{data['from']['email']}>" :
14
+ data['from']['email']
15
+ end
16
+
17
+ def to
18
+ @to ||= data["personalizations"]
19
+ .select{|h| h.key? "to" }
20
+ .map{|(h)| h["to"] }
21
+ .map{|(h)| h["email"] }
22
+ end
23
+
24
+ def subject
25
+ @subject ||= data["subject"]
26
+ end
27
+
28
+ end # class Email
29
+ end # class Fakesendgrid
30
+ end # class Tester
31
+ end # module Webspicy
@@ -9,7 +9,10 @@ module Webspicy
9
9
  attr_reader :data
10
10
 
11
11
  def from
12
- data["body"]["Source"]
12
+ rx = /^From:\s*(.*)$/
13
+ raw_data
14
+ .each_line
15
+ .find{|l| l =~ rx }[rx, 1].strip
13
16
  end
14
17
 
15
18
  def to
@@ -18,14 +21,14 @@ module Webspicy
18
21
  .select{|(k,v)|
19
22
  k =~ /Destinations.member/
20
23
  }
21
- .map{|(k,v)| v }
24
+ .map{|(k,v)| v.strip }
22
25
  end
23
26
 
24
27
  def subject
25
28
  rx = /^Subject:\s*(.*)$/
26
29
  raw_data
27
30
  .each_line
28
- .find{|l| l =~ rx }[rx, 1]
31
+ .find{|l| l =~ rx }[rx, 1].strip
29
32
  end
30
33
 
31
34
  def raw_data
@@ -88,3 +88,4 @@ require_relative 'reporter/composite'
88
88
  require_relative 'reporter/file_progress'
89
89
  require_relative 'reporter/file_summary'
90
90
  require_relative 'reporter/success_or_not'
91
+ require_relative 'reporter/junit_xml_file'
@@ -15,7 +15,7 @@ module Webspicy
15
15
  @spec_file_errors << spec_file_error_line(spec_file, e)
16
16
  end
17
17
 
18
- def after_each_done
18
+ def test_case_done
19
19
  @failed_results << result unless result.success?
20
20
  end
21
21
 
@@ -24,6 +24,8 @@ module Webspicy
24
24
  report_failed_results
25
25
  end
26
26
 
27
+ private
28
+
27
29
  def report_spec_file_errors
28
30
  return if spec_file_errors.empty?
29
31
  io.puts
@@ -0,0 +1,151 @@
1
+ module Webspicy
2
+ class Tester
3
+ class Reporter
4
+ class JunitXmlFile < Reporter
5
+
6
+ TPL = <<~XML
7
+ <?xml version="1.0" encoding="UTF-8"?>
8
+ <testsuites
9
+ disabled="{{counts.disabled}}"
10
+ errors="{{counts.errors}}"
11
+ failures="{{counts.failures}}"
12
+ tests="{{counts.total}}"
13
+ time="{{time}}s"
14
+ >
15
+ {{#testsuites}}
16
+ <testsuite
17
+ name="{{name}}"
18
+ tests="{{counts.total}}"
19
+ errors="{{counts.errors}}"
20
+ failures="{{counts.failures}}"
21
+ time="{{time}}s"
22
+ >
23
+ {{#testcases}}
24
+ <testcase
25
+ name="{{name}}"
26
+ assertions="{{assert}}"
27
+ classname="{{classname}}"
28
+ status=""
29
+ time="{{time}}s"
30
+ >
31
+ {{#errors}}
32
+ <error
33
+ message="{{message}}"
34
+ type="{{type}}"
35
+ ></error>
36
+ {{/errors}}
37
+ {{#failures}}
38
+ <failure
39
+ message="{{message}}"
40
+ type="{{type}}"
41
+ ></failure>
42
+ {{/failures}}
43
+ </testcase>
44
+ {{/testcases}}
45
+ </testsuite>
46
+ {{/testsuites}}
47
+ </testsuites>
48
+ XML
49
+
50
+ def initialize(path_or_io = STDOUT)
51
+ @path_or_io = path_or_io
52
+ path_or_io.parent.mkdir_p if path_or_io.is_a?(Path)
53
+ end
54
+
55
+ attr_reader :template_data, :timer_all, :timer_specification, :timer_testcase
56
+
57
+ def before_all
58
+ @timer_all = Time.now
59
+ @template_data = OpenStruct.new({
60
+ counts: Hash.new{|h,k| h[k] = 0 },
61
+ testsuites: []
62
+ })
63
+ end
64
+
65
+ def after_all
66
+ template_data.time = Time.now - timer_all
67
+ end
68
+
69
+ def before_specification
70
+ @timer_specification = Time.now
71
+ template_data.testsuites << OpenStruct.new({
72
+ :name => specification.name,
73
+ :counts => Hash.new{|h,k| h[k] = 0 },
74
+ :testcases => []
75
+ })
76
+ end
77
+
78
+ def specification_done
79
+ template_data.testsuites[-1].time = Time.now - timer_specification
80
+ end
81
+
82
+ def spec_file_error(e)
83
+ template_data.testsuites[-1].testcases << OpenStruct.new({
84
+ :name => "Specification can be loaded",
85
+ :assert => 1,
86
+ :classname => "Webspicy.Specification",
87
+ :failures => [],
88
+ :errors => [OpenStruct.new({
89
+ :type => e.class,
90
+ :message => e.message
91
+ })]
92
+ })
93
+ end
94
+
95
+ def before_test_case
96
+ @timer_testcase = Time.now
97
+ template_data.testsuites[-1].testcases << OpenStruct.new({
98
+ :name => test_case.description,
99
+ :assert => test_case.assert.length,
100
+ :classname => test_case.class.name.to_s.gsub(/::/, "."),
101
+ :failures => [],
102
+ :errors => [],
103
+ })
104
+ template_data.counts[:total] += 1
105
+ template_data.testsuites[-1].counts[:total] += 1
106
+ end
107
+
108
+ def test_case_done
109
+ template_data.testsuites[-1].testcases[-1].time = Time.now - timer_testcase
110
+ end
111
+
112
+ def check_failure(check, ex)
113
+ template_data.testsuites[-1].testcases[-1].failures << OpenStruct.new({
114
+ :type => check.class.name,
115
+ :message => ex.message
116
+ })
117
+ template_data.counts[:failures] += 1
118
+ template_data.testsuites[-1].counts[:failures] += 1
119
+ end
120
+
121
+ def check_error(check, ex)
122
+ template_data.testsuites[-1].testcases[-1].errors << OpenStruct.new({
123
+ :type => check.class.name,
124
+ :message => ex.message
125
+ })
126
+ template_data.counts[:errors] += 1
127
+ template_data.testsuites[-1].counts[:errors] += 1
128
+ end
129
+
130
+ def report
131
+ require 'mustache'
132
+ with_io do |io|
133
+ io << Mustache.render(TPL, template_data)
134
+ end
135
+ end
136
+
137
+ private
138
+
139
+ def with_io(&bl)
140
+ case io = @path_or_io
141
+ when IO, StringIO
142
+ bl.call(io)
143
+ else
144
+ Path(io).open('w', &bl)
145
+ end
146
+ end
147
+
148
+ end # class JunitXmlFile
149
+ end # class Reporter
150
+ end # class Tester
151
+ end # module Webspicy
@@ -7,7 +7,7 @@ module Webspicy
7
7
  io.print colorize_error("X", config)
8
8
  end
9
9
 
10
- def after_each_done
10
+ def test_case_done
11
11
  if result.success?
12
12
  io.print colorize_success(".", config)
13
13
  elsif result.failure?
@@ -26,7 +26,7 @@ module Webspicy
26
26
  @spec_file_errors_count += 1
27
27
  end
28
28
 
29
- def after_each_done
29
+ def test_case_done
30
30
  if tester.test_case.counterexample?
31
31
  @counterexamples_count += 1
32
32
  else
@@ -18,6 +18,7 @@ module Webspicy
18
18
  check!
19
19
  else
20
20
  @errors << [InvocationSuceeded.new(self), tester.invocation_error]
21
+ reporter.check_error(*errors.first)
21
22
  end
22
23
  end
23
24
  attr_reader :tester, :scope, :client
@@ -2,7 +2,7 @@ module Webspicy
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 20
5
- TINY = 8
5
+ TINY = 13
6
6
  end
7
7
  VERSION = "#{Version::MAJOR}.#{Version::MINOR}.#{Version::TINY}"
8
8
  end
@@ -9,7 +9,7 @@ module Webspicy
9
9
 
10
10
  def singleservice(raw)
11
11
  converted = {
12
- name: raw[:name] || "Unamed specification",
12
+ name: raw[:name],
13
13
  url: raw[:url],
14
14
  services: [
15
15
  Webspicy::Web.service(raw.reject{|k| k==:url or k==:name }, Webspicy.current_scope)
@@ -18,7 +18,7 @@ module Webspicy
18
18
  }
19
19
 
20
20
  it 'returns all files' do
21
- expect(subject.size).to eql(restful_folder.glob('**/*.yml').size)
21
+ expect(subject.size).to eql(restful_folder.glob('**/*.{yml, yaml}').size)
22
22
  end
23
23
  end
24
24
 
@@ -59,7 +59,7 @@ module Webspicy
59
59
  }
60
60
 
61
61
  it 'returns all files' do
62
- expect(subject.size).to eql(restful_folder.glob('**/*.yml').size)
62
+ expect(subject.size).to eql(restful_folder.glob('**/*.{yml, yaml}').size)
63
63
  end
64
64
  end
65
65
 
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+ require 'webspicy/tester/fakesendgrid'
3
+ module Webspicy
4
+ class Tester
5
+ class Fakesendgrid
6
+ describe Email do
7
+
8
+ DATA = JSON.parse <<~J
9
+ {
10
+ "datetime": "2021-06-02T15:29:27.161Z",
11
+ "from": {
12
+ "email": "info@mydomain.be",
13
+ "name": "Foo Bar"
14
+ },
15
+ "subject": "Hello World",
16
+ "personalizations": [
17
+ {
18
+ "to": [
19
+ {
20
+ "email": "support@mydomain.fr"
21
+ }
22
+ ]
23
+ }
24
+ ],
25
+ "content": [
26
+ {
27
+ "value": "test",
28
+ "type": "text/plain"
29
+ },
30
+ {
31
+ "value": "test <b>test</b> test",
32
+ "type": "text/html"
33
+ }
34
+ ]
35
+ }
36
+ J
37
+
38
+ subject{
39
+ Email.new(DATA)
40
+ }
41
+
42
+ it 'works as expected' do
43
+ expect(subject.from).to eql("Foo Bar <info@mydomain.be>")
44
+ expect(subject.to).to eql(["support@mydomain.fr"])
45
+ expect(subject.subject).to eql("Hello World")
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
@@ -6,9 +6,26 @@ module Webspicy
6
6
  describe Email do
7
7
 
8
8
  DATA = Base64.encode64 <<~J
9
- From: Webspicy <noreply@webspicy.io>
10
- To: someone@world.com
11
- Subject: Hey world, hello!
9
+ Content-Type: multipart/alternative;
10
+ boundary="--_NmP-d246fd025a6652c9-Part_1"
11
+ From: Webspicy <noreply@webspicy.io>
12
+ To: david.parloir@gmail.com
13
+ Subject: Hey world, hello!
14
+ Message-ID: <2421bae3-9c42-7988-23b4-b1f6168130c9@webspicy.io>
15
+ Date: Thu, 24 Jun 2021 13:45:16 +0000
16
+ MIME-Version: 1.0
17
+
18
+ ----_NmP-d246fd025a6652c9-Part_1
19
+ Content-Type: text/plain; charset=utf-8
20
+ Content-Transfer-Encoding: 7bit
21
+
22
+ Hello world, in a text version
23
+ ----_NmP-d246fd025a6652c9-Part_1
24
+ Content-Type: text/html; charset=utf-8
25
+ Content-Transfer-Encoding: 7bit
26
+
27
+ Hello world, in an html version
28
+ ----_NmP-d246fd025a6652c9-Part_1--
12
29
  J
13
30
 
14
31
  DATA = JSON.parse <<~J
@@ -29,7 +46,7 @@ module Webspicy
29
46
  }
30
47
 
31
48
  it 'works as expected' do
32
- expect(subject.from).to eql("noreply@webspicy.io")
49
+ expect(subject.from).to eql("Webspicy <noreply@webspicy.io>")
33
50
  expect(subject.to).to eql(["someone@world.com"])
34
51
  expect(subject.subject).to eql("Hey world, hello!")
35
52
  end
@@ -15,7 +15,7 @@ module Webspicy
15
15
  },
16
16
  {
17
17
  "key": "from",
18
- "line": "From: info@mydomain.be"
18
+ "line": "From: Webspicy <noreply@webspicy.io>"
19
19
  },
20
20
  {
21
21
  "key": "reply-to",
@@ -82,7 +82,7 @@ module Webspicy
82
82
  }
83
83
 
84
84
  it 'works as expected' do
85
- expect(subject.from).to eql("info@mydomain.be")
85
+ expect(subject.from).to eql("Webspicy <noreply@webspicy.io>")
86
86
  expect(subject.to).to eql(["support@mydomain.fr"])
87
87
  expect(subject.subject).to eql("Hello World")
88
88
  end
data/tasks/test.rake CHANGED
@@ -5,8 +5,12 @@ namespace :test do
5
5
 
6
6
  desc "Runs unit tests on the library itself"
7
7
  RSpec::Core::RakeTask.new(:unit) do |t|
8
+ require 'path'
9
+ root_folder = Path.dir.parent
10
+ test_results = root_folder/"test-results"
11
+ puts (test_results/"unit-tests.xml").inspect
8
12
  t.pattern = "spec/unit/**/test_*.rb"
9
- t.rspec_opts = ["-Ilib", "-Ispec/unit", "--color", "--backtrace", "--format=progress"]
13
+ t.rspec_opts = ["-Ilib", "-Ispec/unit", "--color", "--backtrace", "--format=progress", "--format RspecJunitFormatter", "--out #{test_results}/unit-tests.xml"]
10
14
  end
11
15
  tests << :unit
12
16
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webspicy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.8
4
+ version: 0.20.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernard Lambeau
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-28 00:00:00.000000000 Z
11
+ date: 2021-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -98,16 +98,16 @@ dependencies:
98
98
  name: http
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '4'
103
+ version: 4.4.1
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '4'
110
+ version: 4.4.1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: path
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -126,22 +126,22 @@ dependencies:
126
126
  name: rack-robustness
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: 1.1.0
132
129
  - - "~>"
133
130
  - !ruby/object:Gem::Version
134
131
  version: '1.1'
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: 1.1.0
135
135
  type: :runtime
136
136
  prerelease: false
137
137
  version_requirements: !ruby/object:Gem::Requirement
138
138
  requirements:
139
- - - ">="
140
- - !ruby/object:Gem::Version
141
- version: 1.1.0
142
139
  - - "~>"
143
140
  - !ruby/object:Gem::Version
144
141
  version: '1.1'
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 1.1.0
145
145
  - !ruby/object:Gem::Dependency
146
146
  name: mustermann
147
147
  requirement: !ruby/object:Gem::Requirement
@@ -198,11 +198,23 @@ dependencies:
198
198
  - - "~>"
199
199
  - !ruby/object:Gem::Version
200
200
  version: 0.8.2
201
+ - !ruby/object:Gem::Dependency
202
+ name: mustache
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '1.0'
208
+ type: :runtime
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '1.0'
201
215
  description: Webspicy helps testing web services as software operation black boxes
202
216
  email: blambeau@gmail.com
203
217
  executables:
204
- - sandr
205
- - search
206
218
  - webspicy
207
219
  extensions: []
208
220
  extra_rdoc_files: []
@@ -210,8 +222,6 @@ files:
210
222
  - Gemfile
211
223
  - README.md
212
224
  - Rakefile
213
- - bin/sandr
214
- - bin/search
215
225
  - bin/webspicy
216
226
  - doc/1-black-box-scene.md
217
227
  - doc/2-black-box-testing.md
@@ -251,6 +261,8 @@ files:
251
261
  - lib/webspicy/tester/assertions.rb
252
262
  - lib/webspicy/tester/client.rb
253
263
  - lib/webspicy/tester/failure.rb
264
+ - lib/webspicy/tester/fakesendgrid.rb
265
+ - lib/webspicy/tester/fakesendgrid/email.rb
254
266
  - lib/webspicy/tester/fakeses.rb
255
267
  - lib/webspicy/tester/fakeses/email.rb
256
268
  - lib/webspicy/tester/fakesmtp.rb
@@ -263,6 +275,7 @@ files:
263
275
  - lib/webspicy/tester/reporter/exceptions.rb
264
276
  - lib/webspicy/tester/reporter/file_progress.rb
265
277
  - lib/webspicy/tester/reporter/file_summary.rb
278
+ - lib/webspicy/tester/reporter/junit_xml_file.rb
266
279
  - lib/webspicy/tester/reporter/progress.rb
267
280
  - lib/webspicy/tester/reporter/success_or_not.rb
268
281
  - lib/webspicy/tester/reporter/summary.rb
@@ -312,6 +325,7 @@ files:
312
325
  - spec/unit/support/world/fixtures/yaml.yml
313
326
  - spec/unit/support/world/test_world.rb
314
327
  - spec/unit/test_configuration.rb
328
+ - spec/unit/tester/fakesendgrid/test_email.rb
315
329
  - spec/unit/tester/fakeses/test_email.rb
316
330
  - spec/unit/tester/fakesmtp/test_email.rb
317
331
  - spec/unit/tester/test_asserter.rb
@@ -326,7 +340,7 @@ homepage: http://github.com/enspirit/webspicy
326
340
  licenses:
327
341
  - MIT
328
342
  metadata: {}
329
- post_install_message:
343
+ post_install_message:
330
344
  rdoc_options: []
331
345
  require_paths:
332
346
  - lib
@@ -341,8 +355,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
341
355
  - !ruby/object:Gem::Version
342
356
  version: '0'
343
357
  requirements: []
344
- rubygems_version: 3.0.1
345
- signing_key:
358
+ rubygems_version: 3.2.15
359
+ signing_key:
346
360
  specification_version: 4
347
361
  summary: Webspicy helps testing web services as software operation black boxes!
348
362
  test_files: []
data/bin/sandr DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'path'
3
-
4
- def sandr(file)
5
- file.write file.read.gsub(ARGV[0], ARGV[1])
6
- end
7
-
8
- Path.dir.parent.glob("lib/**/*.rb") do |file|
9
- sandr(file)
10
- end
11
-
12
- Path.dir.parent.glob("spec/**/*.rb") do |file|
13
- sandr(file)
14
- end
data/bin/search DELETED
@@ -1,2 +0,0 @@
1
- #!/bin/bash
2
- grep -Rn --color $1 lib spec