webspicy 0.20.8 → 0.20.13

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