roqua-support 0.1.34 → 0.3.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 +4 -4
- data/.gitlab-ci.yml +22 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +5 -5
- data/lib/roqua-support/version.rb +1 -1
- data/lib/roqua/logging/roqua_logging_railtie.rb +0 -1
- data/lib/roqua/probes/base_probe.rb +2 -1
- data/lib/roqua/support.rb +1 -1
- data/lib/roqua/support/errors.rb +0 -1
- data/roqua-support.gemspec +1 -1
- data/spec/roqua/core_ext/enumerable/sort_by_alphanum_spec.rb +5 -8
- data/spec/roqua/core_ext/fabrication/singleton_spec.rb +4 -3
- data/spec/roqua/probes/delayed_job_probe_spec.rb +1 -1
- data/spec/roqua/support/helpers_spec.rb +1 -1
- data/spec/roqua/support/logwrapper_spec.rb +10 -10
- data/spec/roqua/support/request_logger_spec.rb +18 -17
- data/spec/roqua/support_spec.rb +3 -3
- metadata +7 -13
- data/lib/roqua/core_ext/array/stable_sort_by.rb +0 -37
- data/lib/roqua/core_ext/fixnum/clamp.rb +0 -8
- data/spec/roqua/core_ext/array/stable_sort_by_spec.rb +0 -40
- data/spec/roqua/core_ext/fixnum/clamp_spec.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b7684543b65ccc1553042df3e832dba5f40a8f42d0ff15fa31f42d865755b32
|
4
|
+
data.tar.gz: 3ba17388d2c2b947756ddb1ca3b4172a6bcbde85bef76b0c70a5eb9fe7fe16d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 880ee19112ad1e4f596a451228b7b3b6f5b07ad381f0d1706ee00c42b070af2c8dd3048a26363183c09ba9ceb2f7e34c72b3289b11f8829ee0e02a613e173742
|
7
|
+
data.tar.gz: fa8da4fcb52839b129019a08f4ba852cc629af98944c9aef9add34c4ef2244ace706e59f53765b551c95da8a6231bed7a096afeb0e4dacfa7e7a1d02a5f14f17
|
data/.gitlab-ci.yml
CHANGED
@@ -21,6 +21,13 @@ before_script:
|
|
21
21
|
paths:
|
22
22
|
- .gems
|
23
23
|
|
24
|
+
.ruby_25: &ruby_25
|
25
|
+
image: registry.roqua.nl/roqua/docker-base-images:ruby-2.5
|
26
|
+
cache:
|
27
|
+
key: ruby_25
|
28
|
+
paths:
|
29
|
+
- .gems
|
30
|
+
|
24
31
|
rails_42_ruby_23:
|
25
32
|
<<: *ruby_23
|
26
33
|
script:
|
@@ -36,6 +43,11 @@ rails_50_ruby_24:
|
|
36
43
|
script:
|
37
44
|
- bundle exec appraisal rails50 bundle exec rspec
|
38
45
|
|
46
|
+
rails_50_ruby_25:
|
47
|
+
<<: *ruby_25
|
48
|
+
script:
|
49
|
+
- bundle exec appraisal rails50 bundle exec rspec
|
50
|
+
|
39
51
|
rails_51_ruby_23:
|
40
52
|
<<: *ruby_23
|
41
53
|
script:
|
@@ -46,6 +58,11 @@ rails_51_ruby_24:
|
|
46
58
|
script:
|
47
59
|
- bundle exec appraisal rails51 bundle exec rspec
|
48
60
|
|
61
|
+
rails_51_ruby_25:
|
62
|
+
<<: *ruby_25
|
63
|
+
script:
|
64
|
+
- bundle exec appraisal rails51 bundle exec rspec
|
65
|
+
|
49
66
|
rails_52_ruby_23:
|
50
67
|
<<: *ruby_23
|
51
68
|
script:
|
@@ -55,3 +72,8 @@ rails_52_ruby_24:
|
|
55
72
|
<<: *ruby_24
|
56
73
|
script:
|
57
74
|
- bundle exec appraisal rails52 bundle exec rspec
|
75
|
+
|
76
|
+
rails_52_ruby_25:
|
77
|
+
<<: *ruby_25
|
78
|
+
script:
|
79
|
+
- bundle exec appraisal rails52 bundle exec rspec
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 0.3.0
|
2
|
+
|
3
|
+
* Support for Ruby 2.5
|
4
|
+
* Removed Fixnum#clamp, since Fixnum was deprecated and the clamp method was never used.
|
5
|
+
|
6
|
+
## 0.2.0
|
7
|
+
|
8
|
+
* Removed Array#stable_sort_by, since it was not stable and the name was wrong.
|
9
|
+
|
1
10
|
## 0.1.21
|
2
11
|
|
3
12
|
* Add Errors.add_parameters(add_to: 'error_report')
|
data/Gemfile
CHANGED
@@ -9,7 +9,7 @@ gem 'roqua_styleguide', git: 'https://gitlab.roqua.nl/roqua/styleguide.git'
|
|
9
9
|
group :test do
|
10
10
|
gem 'actionpack', '>= 4.0'
|
11
11
|
gem 'active_interaction', '~> 3.0'
|
12
|
-
gem 'appsignal'
|
12
|
+
gem 'appsignal', '~> 2.9.6'
|
13
13
|
gem 'climate_control' # For ENV modification in specs
|
14
14
|
gem 'combustion', '~> 0.5.2'
|
15
15
|
gem 'fakefs', require: 'fakefs/safe'
|
data/Gemfile.lock
CHANGED
@@ -8,7 +8,7 @@ GIT
|
|
8
8
|
PATH
|
9
9
|
remote: .
|
10
10
|
specs:
|
11
|
-
roqua-support (0.
|
11
|
+
roqua-support (0.3.0)
|
12
12
|
active_interaction (~> 3.0)
|
13
13
|
activesupport (>= 3.2, < 6)
|
14
14
|
naught (~> 1.0)
|
@@ -47,7 +47,7 @@ GEM
|
|
47
47
|
bundler
|
48
48
|
rake
|
49
49
|
thor (>= 0.14.0)
|
50
|
-
appsignal (2.
|
50
|
+
appsignal (2.9.6)
|
51
51
|
rack
|
52
52
|
arel (7.1.4)
|
53
53
|
ast (2.3.0)
|
@@ -181,7 +181,7 @@ DEPENDENCIES
|
|
181
181
|
actionpack (>= 4.0)
|
182
182
|
active_interaction (~> 3.0)
|
183
183
|
appraisal
|
184
|
-
appsignal
|
184
|
+
appsignal (~> 2.9.6)
|
185
185
|
bundler (~> 1.0)
|
186
186
|
climate_control
|
187
187
|
combustion (~> 0.5.2)
|
@@ -195,8 +195,8 @@ DEPENDENCIES
|
|
195
195
|
rspec (>= 2.12.0, < 4.0)
|
196
196
|
rspec-instrumentation-matcher
|
197
197
|
rspec-rails
|
198
|
-
sqlite3
|
198
|
+
sqlite3 (~> 1.3.6)
|
199
199
|
timecop
|
200
200
|
|
201
201
|
BUNDLED WITH
|
202
|
-
1.16.
|
202
|
+
1.16.6
|
@@ -3,7 +3,8 @@ module Roqua
|
|
3
3
|
module BaseProbe
|
4
4
|
def enable
|
5
5
|
new.tap do |probe|
|
6
|
-
|
6
|
+
probe_sym = probe.class.to_s.to_sym
|
7
|
+
Appsignal::Minutely.probes.register(probe_sym, probe) unless Appsignal::Minutely.probes[probe_sym]
|
7
8
|
end
|
8
9
|
end
|
9
10
|
end
|
data/lib/roqua/support.rb
CHANGED
data/lib/roqua/support/errors.rb
CHANGED
@@ -62,7 +62,6 @@ module Roqua
|
|
62
62
|
parameters: parameters}
|
63
63
|
exception_info[:notification_urls] = notification_urls if notification_urls.present?
|
64
64
|
exception_info[:backtrace] = exception.backtrace unless skip_backtrace
|
65
|
-
puts exception_info.inspect
|
66
65
|
Roqua.logger.error('roqua.exception', exception_info)
|
67
66
|
end
|
68
67
|
rescue Exception
|
data/roqua-support.gemspec
CHANGED
@@ -28,6 +28,6 @@ Gem::Specification.new do |gem|
|
|
28
28
|
gem.add_development_dependency 'delayed_job_active_record'
|
29
29
|
gem.add_development_dependency 'rake'
|
30
30
|
gem.add_development_dependency 'rspec', '>= 2.12.0', '< 4.0'
|
31
|
-
gem.add_development_dependency 'sqlite3'
|
31
|
+
gem.add_development_dependency 'sqlite3', '~> 1.3.6'
|
32
32
|
gem.add_development_dependency 'timecop'
|
33
33
|
end
|
@@ -2,20 +2,17 @@ require 'roqua/core_ext/enumerable/sort_by_alphanum'
|
|
2
2
|
|
3
3
|
describe Enumerable do
|
4
4
|
describe '#sort_by_alphanum' do
|
5
|
+
let(:input) { ["004some11thing", "004some10thing", "3another"] }
|
5
6
|
it 'sorts by chunks' do
|
6
|
-
["004some11thing"
|
7
|
-
"004some10thing",
|
8
|
-
"3another"].sort_by_alphanum.should == ["3another", "004some10thing", "004some11thing"]
|
7
|
+
expect(input.sort_by_alphanum).to eq ["3another", "004some10thing", "004some11thing"]
|
9
8
|
end
|
10
9
|
|
11
10
|
it 'can take a block which can transform values before comparison' do
|
12
|
-
["004some11thing",
|
13
|
-
"004some10thing",
|
14
|
-
"3another"].sort_by_alphanum(&:reverse).should == ["004some10thing", "004some11thing", "3another"]
|
11
|
+
expect(input.sort_by_alphanum(&:reverse)).to eq ["004some10thing", "004some11thing", "3another"]
|
15
12
|
end
|
16
13
|
|
17
14
|
it 'compares number chunks as integers' do
|
18
|
-
%w(004 3).sort_by_alphanum.
|
15
|
+
expect(%w(004 3).sort_by_alphanum).to eq %w(3 004)
|
19
16
|
end
|
20
17
|
end
|
21
|
-
end
|
18
|
+
end
|
@@ -6,11 +6,13 @@ end
|
|
6
6
|
|
7
7
|
describe Fabricate do
|
8
8
|
it "returns singleton objects" do
|
9
|
-
Fabricate.singleton(:one).should == Fabricate.singleton(:one)
|
9
|
+
# Fabricate.singleton(:one).should == Fabricate.singleton(:one)
|
10
|
+
expect(Fabricate.singleton(:one)).to eq Fabricate.singleton(:one)
|
10
11
|
end
|
11
12
|
|
12
13
|
it 'maintains multiple singletons' do
|
13
|
-
Fabricate.singleton(:one).should_not == Fabricate.singleton(:two)
|
14
|
+
# Fabricate.singleton(:one).should_not == Fabricate.singleton(:two)
|
15
|
+
expect(Fabricate.singleton(:one)).not_to eq Fabricate.singleton(:two)
|
14
16
|
end
|
15
17
|
|
16
18
|
it 'clears singletons' do
|
@@ -19,4 +21,3 @@ describe Fabricate do
|
|
19
21
|
expect(Fabricate.singleton(:one)).not_to eq(the_one)
|
20
22
|
end
|
21
23
|
end
|
22
|
-
|
@@ -40,7 +40,7 @@ describe Roqua::Probes::DelayedJobProbe do
|
|
40
40
|
expect { Roqua::Probes::DelayedJobProbe.enable }
|
41
41
|
.to change { Appsignal::Minutely.probes.count }.by(1)
|
42
42
|
|
43
|
-
expect(Appsignal::Minutely.probes
|
43
|
+
expect(Appsignal::Minutely.probes[:"Roqua::Probes::DelayedJobProbe"]).to be
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'will not add the same probe twice if called multiple times' do
|
@@ -4,7 +4,7 @@ require 'stringio'
|
|
4
4
|
|
5
5
|
module Roqua
|
6
6
|
describe LogWrapper do
|
7
|
-
before { Roqua.
|
7
|
+
before { allow(Roqua).to receive(:appname).and_return('roqua-support-testsuite') }
|
8
8
|
|
9
9
|
let(:logstream) { StringIO.new }
|
10
10
|
let(:logger) { Logger.new(logstream) }
|
@@ -17,17 +17,17 @@ module Roqua
|
|
17
17
|
describe '#add' do
|
18
18
|
it 'writes event name to log' do
|
19
19
|
logwrapper.add :info, "testevent"
|
20
|
-
log.
|
20
|
+
expect(log).to include("testevent {}\n")
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'writes given parameters as json hash' do
|
24
24
|
logwrapper.add :info, "testevent", extra: 'params', go: 'here'
|
25
|
-
log.
|
25
|
+
expect(log).to include('testevent {"extra":"params","go":"here"}' + "\n")
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'escapes newline characters in params' do
|
29
29
|
logwrapper.add :info, "testevent", param: "this\nshould not have newlines"
|
30
|
-
log.
|
30
|
+
expect(log).to include('testevent {"param":"this\nshould not have newlines"')
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -36,25 +36,25 @@ module Roqua
|
|
36
36
|
logwrapper.lifecycle 'testevent', extra: 'params' do
|
37
37
|
1 + 1
|
38
38
|
end
|
39
|
-
log.
|
40
|
-
log.
|
39
|
+
expect(log).to include('testevent:started {"extra":"params"}')
|
40
|
+
expect(log).to match(/testevent:finished.*"extra":"params"/)
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'logs the duration of the block with the finished event' do
|
44
44
|
logwrapper.lifecycle('testevent') { 1 + 1 }
|
45
|
-
log.
|
45
|
+
expect(log).to match(/testevent:finished.*"duration":/)
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'returns the value returned by the block' do
|
49
|
-
logwrapper.lifecycle('testevent') { 1 + 1 }.
|
49
|
+
expect(logwrapper.lifecycle('testevent') { 1 + 1 }).to eq 2
|
50
50
|
end
|
51
51
|
|
52
52
|
it 'logs the start and failure of a block if it raises' do
|
53
53
|
logwrapper.lifecycle 'testevent' do
|
54
54
|
raise StandardError, "Foo"
|
55
55
|
end rescue nil
|
56
|
-
log.
|
57
|
-
log.
|
56
|
+
expect(log).to include('testevent:started')
|
57
|
+
expect(log).to include('testevent:failed {"exception":"StandardError","message":"Foo"}')
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'reraises the exception' do
|
@@ -8,7 +8,8 @@ describe Roqua::Support::RequestLogger do
|
|
8
8
|
let(:logger) { Logger.new(logstream) }
|
9
9
|
let(:logwrapper) { Roqua::LogWrapper.new(logger) }
|
10
10
|
|
11
|
-
before { Roqua.stub(logger: logwrapper) }
|
11
|
+
# before { Roqua.stub(logger: logwrapper) }
|
12
|
+
before { allow(Roqua).to receive(:logger).and_return(logwrapper) }
|
12
13
|
|
13
14
|
def log
|
14
15
|
logstream.string
|
@@ -29,47 +30,47 @@ describe Roqua::Support::RequestLogger do
|
|
29
30
|
|
30
31
|
it "logs the URL" do
|
31
32
|
subscriber.process_action(event)
|
32
|
-
logstream.string.
|
33
|
+
expect(logstream.string).to include('/home')
|
33
34
|
end
|
34
35
|
|
35
36
|
it "does not log the query string" do
|
36
37
|
subscriber.process_action(event)
|
37
|
-
logstream.string.
|
38
|
+
expect(logstream.string).to_not include('?foo=bar')
|
38
39
|
end
|
39
40
|
|
40
41
|
it "logs the HTTP method" do
|
41
42
|
subscriber.process_action(event)
|
42
|
-
logstream.string.
|
43
|
+
expect(logstream.string).to include('"method":"GET"')
|
43
44
|
end
|
44
45
|
|
45
46
|
it "logs the status code returned" do
|
46
47
|
subscriber.process_action(event)
|
47
|
-
logstream.string.
|
48
|
+
expect(logstream.string).to include('"status":200')
|
48
49
|
end
|
49
50
|
|
50
51
|
it "logs the controller and action" do
|
51
52
|
subscriber.process_action(event)
|
52
|
-
logstream.string.
|
53
|
+
expect(logstream.string).to include('"controller":"home","action":"index"')
|
53
54
|
end
|
54
55
|
|
55
56
|
it 'logs request parameters' do
|
56
57
|
subscriber.process_action(event)
|
57
|
-
logstream.string.
|
58
|
+
expect(logstream.string).to include('"params":{"foo":"bar"}')
|
58
59
|
end
|
59
60
|
|
60
61
|
it "logs how long the request took" do
|
61
62
|
subscriber.process_action(event)
|
62
|
-
logstream.string.
|
63
|
+
expect(logstream.string).to match /"duration":1000.0/
|
63
64
|
end
|
64
65
|
|
65
66
|
it "logs the view rendering time" do
|
66
67
|
subscriber.process_action(event)
|
67
|
-
logstream.string.
|
68
|
+
expect(logstream.string).to match /"view":0.01/
|
68
69
|
end
|
69
70
|
|
70
71
|
it "logs the database rendering time" do
|
71
72
|
subscriber.process_action(event)
|
72
|
-
logstream.string.
|
73
|
+
expect(logstream.string).to match /"db":0.02/
|
73
74
|
end
|
74
75
|
|
75
76
|
it 'logs extra information added in the controller' do
|
@@ -82,12 +83,12 @@ describe Roqua::Support::RequestLogger do
|
|
82
83
|
end
|
83
84
|
controller.new.index
|
84
85
|
subscriber.process_action(event)
|
85
|
-
logstream.string.
|
86
|
+
expect(logstream.string).to include('"current_user":"johndoe"')
|
86
87
|
|
87
88
|
# next request should not still maintain this data
|
88
89
|
logstream.truncate 0
|
89
90
|
subscriber.process_action(event)
|
90
|
-
logstream.string.
|
91
|
+
expect(logstream.string).to_not include('current_user')
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
@@ -104,15 +105,15 @@ describe Roqua::Support::RequestLogger do
|
|
104
105
|
|
105
106
|
it "logs the 500 status when an exception occurred" do
|
106
107
|
subscriber.process_action(event)
|
107
|
-
logstream.string.
|
108
|
-
logstream.string.
|
108
|
+
expect(logstream.string).to match /"status":500/
|
109
|
+
expect(logstream.string).to match /"error":"AbstractController::ActionNotFound:Route not found"/
|
109
110
|
end
|
110
111
|
|
111
112
|
it "should return an unknown status when no status or exception is found" do
|
112
113
|
event.payload[:status] = nil
|
113
114
|
event.payload[:exception] = nil
|
114
115
|
subscriber.process_action(event)
|
115
|
-
logstream.string.
|
116
|
+
expect(logstream.string).to match /"status":0/
|
116
117
|
end
|
117
118
|
end
|
118
119
|
|
@@ -136,12 +137,12 @@ describe Roqua::Support::RequestLogger do
|
|
136
137
|
it 'logs the redirect' do
|
137
138
|
subscriber.redirect_to(redirect)
|
138
139
|
subscriber.process_action(event)
|
139
|
-
log.
|
140
|
+
expect(log).to include('"location":"http://example.com"')
|
140
141
|
|
141
142
|
# next request should no longer get location
|
142
143
|
logstream.truncate 0
|
143
144
|
subscriber.process_action(event)
|
144
|
-
log.
|
145
|
+
expect(log).to_not include('location')
|
145
146
|
end
|
146
147
|
end
|
147
148
|
end
|
data/spec/roqua/support_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'roqua/support'
|
|
3
3
|
describe Roqua do
|
4
4
|
describe '#logger' do
|
5
5
|
it 'has a default' do
|
6
|
-
Roqua.logger.
|
6
|
+
expect(Roqua.logger).to be_an_instance_of(Roqua::LogWrapper)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
@@ -12,8 +12,8 @@ describe Roqua do
|
|
12
12
|
|
13
13
|
it 'wraps a given logger' do
|
14
14
|
Roqua.logger = logger
|
15
|
-
Roqua.logger.
|
16
|
-
Roqua.logger.logger.
|
15
|
+
expect(Roqua.logger).to be_an_instance_of(Roqua::LogWrapper)
|
16
|
+
expect(Roqua.logger.logger).to eq logger
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roqua-support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marten Veldthuis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_interaction
|
@@ -152,16 +152,16 @@ dependencies:
|
|
152
152
|
name: sqlite3
|
153
153
|
requirement: !ruby/object:Gem::Requirement
|
154
154
|
requirements:
|
155
|
-
- - "
|
155
|
+
- - "~>"
|
156
156
|
- !ruby/object:Gem::Version
|
157
|
-
version:
|
157
|
+
version: 1.3.6
|
158
158
|
type: :development
|
159
159
|
prerelease: false
|
160
160
|
version_requirements: !ruby/object:Gem::Requirement
|
161
161
|
requirements:
|
162
|
-
- - "
|
162
|
+
- - "~>"
|
163
163
|
- !ruby/object:Gem::Version
|
164
|
-
version:
|
164
|
+
version: 1.3.6
|
165
165
|
- !ruby/object:Gem::Dependency
|
166
166
|
name: timecop
|
167
167
|
requirement: !ruby/object:Gem::Requirement
|
@@ -207,11 +207,9 @@ files:
|
|
207
207
|
- lib/roqua/core_ext/active_interaction/filters/duration_filter.rb
|
208
208
|
- lib/roqua/core_ext/active_interaction/rails_instrumentation.rb
|
209
209
|
- lib/roqua/core_ext/activerecord/uniq_find_or_create.rb
|
210
|
-
- lib/roqua/core_ext/array/stable_sort_by.rb
|
211
210
|
- lib/roqua/core_ext/delayed_job/activity_monitoring.rb
|
212
211
|
- lib/roqua/core_ext/enumerable/sort_by_alphanum.rb
|
213
212
|
- lib/roqua/core_ext/fabrication/singleton.rb
|
214
|
-
- lib/roqua/core_ext/fixnum/clamp.rb
|
215
213
|
- lib/roqua/logging/roqua_logging_railtie.rb
|
216
214
|
- lib/roqua/probes/base_probe.rb
|
217
215
|
- lib/roqua/probes/delayed_job_probe.rb
|
@@ -243,11 +241,9 @@ files:
|
|
243
241
|
- spec/roqua/core_ext/active_interaction/duration_filter_spec.rb
|
244
242
|
- spec/roqua/core_ext/active_interaction/rails_intrumentation_spec.rb
|
245
243
|
- spec/roqua/core_ext/activerecord/uniq_find_or_create_spec.rb
|
246
|
-
- spec/roqua/core_ext/array/stable_sort_by_spec.rb
|
247
244
|
- spec/roqua/core_ext/delayed_job/activity_monitoring_spec.rb
|
248
245
|
- spec/roqua/core_ext/enumerable/sort_by_alphanum_spec.rb
|
249
246
|
- spec/roqua/core_ext/fabrication/singleton_spec.rb
|
250
|
-
- spec/roqua/core_ext/fixnum/clamp_spec.rb
|
251
247
|
- spec/roqua/logging/roqua_logging_railtie_spec.rb
|
252
248
|
- spec/roqua/probes/delayed_job_probe_spec.rb
|
253
249
|
- spec/roqua/probes/monitoring_probe_spec.rb
|
@@ -286,7 +282,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
286
282
|
version: '0'
|
287
283
|
requirements: []
|
288
284
|
rubyforge_project:
|
289
|
-
rubygems_version: 2.7.
|
285
|
+
rubygems_version: 2.7.9
|
290
286
|
signing_key:
|
291
287
|
specification_version: 4
|
292
288
|
summary: Helper objects and proxies used by a lot of RoQua applications
|
@@ -297,11 +293,9 @@ test_files:
|
|
297
293
|
- spec/roqua/core_ext/active_interaction/duration_filter_spec.rb
|
298
294
|
- spec/roqua/core_ext/active_interaction/rails_intrumentation_spec.rb
|
299
295
|
- spec/roqua/core_ext/activerecord/uniq_find_or_create_spec.rb
|
300
|
-
- spec/roqua/core_ext/array/stable_sort_by_spec.rb
|
301
296
|
- spec/roqua/core_ext/delayed_job/activity_monitoring_spec.rb
|
302
297
|
- spec/roqua/core_ext/enumerable/sort_by_alphanum_spec.rb
|
303
298
|
- spec/roqua/core_ext/fabrication/singleton_spec.rb
|
304
|
-
- spec/roqua/core_ext/fixnum/clamp_spec.rb
|
305
299
|
- spec/roqua/logging/roqua_logging_railtie_spec.rb
|
306
300
|
- spec/roqua/probes/delayed_job_probe_spec.rb
|
307
301
|
- spec/roqua/probes/monitoring_probe_spec.rb
|
@@ -1,37 +0,0 @@
|
|
1
|
-
class Array
|
2
|
-
# Method for stably sorting elements in an array on multiple attributes.
|
3
|
-
#
|
4
|
-
# * Pass the method a block with two arrays containing the attributes for which the
|
5
|
-
# elements should be subsequently sorted. The first attribute is applied last.
|
6
|
-
# If for some attribute the sort order should be reversed, the parameters x and y can
|
7
|
-
# be exchanged between the arrays.
|
8
|
-
#
|
9
|
-
# ==== Example
|
10
|
-
# my_array.stable_sort_by{|x, y| [
|
11
|
-
# x.attribute1,
|
12
|
-
# y.attribute2,
|
13
|
-
# y.attribute3,
|
14
|
-
# y.attribute4
|
15
|
-
# ] <=> [
|
16
|
-
# y.attribute1,
|
17
|
-
# x.attribute2,
|
18
|
-
# x.attribute3,
|
19
|
-
# x.attribute4
|
20
|
-
# ]}
|
21
|
-
#
|
22
|
-
def stable_sort_by
|
23
|
-
sort do |x, y|
|
24
|
-
if not x
|
25
|
-
-1
|
26
|
-
elsif not y
|
27
|
-
1
|
28
|
-
else
|
29
|
-
if block_given?
|
30
|
-
yield x, y
|
31
|
-
else
|
32
|
-
x <=> y
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'roqua/core_ext/array/stable_sort_by'
|
2
|
-
|
3
|
-
describe Array do
|
4
|
-
describe "#stable_sort_by" do
|
5
|
-
it "wraps #sort" do
|
6
|
-
array = []
|
7
|
-
array.should_receive(:sort)
|
8
|
-
array.stable_sort_by
|
9
|
-
end
|
10
|
-
|
11
|
-
it "sorts nil values before all others" do
|
12
|
-
[1, nil, 3].stable_sort_by.should == [nil, 1, 3]
|
13
|
-
end
|
14
|
-
|
15
|
-
it "defaults to regular comparison" do
|
16
|
-
[1, 3, 2].stable_sort_by.should == [1, 2, 3]
|
17
|
-
end
|
18
|
-
|
19
|
-
it "accepts a block to do complex comparison" do
|
20
|
-
[{a: 2, b: 2, c: 3},
|
21
|
-
{a: 2, b: 2, c: 4},
|
22
|
-
{a: 1, b: 1, c: 6}].stable_sort_by do |x, y|
|
23
|
-
[x[:a], x[:b], x[:c]] <=> [y[:a], y[:b], y[:c]]
|
24
|
-
end.should == [{a: 1, b: 1, c: 6},
|
25
|
-
{a: 2, b: 2, c: 3},
|
26
|
-
{a: 2, b: 2, c: 4}]
|
27
|
-
end
|
28
|
-
|
29
|
-
it "leaves items in original order if they are the same" do
|
30
|
-
[{a: 2, b: 2, c: 4},
|
31
|
-
{a: 2, b: 1, c: 3},
|
32
|
-
{a: 1, b: 3, c: 6}].sort do |x, y|
|
33
|
-
[x[:a], x[:b]] <=> [y[:a], y[:b]]
|
34
|
-
end.should == [{a: 1, b: 3, c: 6},
|
35
|
-
{a: 2, b: 1, c: 3},
|
36
|
-
{a: 2, b: 2, c: 4}]
|
37
|
-
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'roqua/core_ext/fixnum/clamp'
|
2
|
-
|
3
|
-
describe Fixnum do
|
4
|
-
describe '#clamp' do
|
5
|
-
it "returns self if within bounds" do
|
6
|
-
5.clamp(1,10).should == 5
|
7
|
-
end
|
8
|
-
|
9
|
-
it "returns the lower bound if self < low" do
|
10
|
-
5.clamp(8,10).should == 8
|
11
|
-
end
|
12
|
-
|
13
|
-
it "returns the upper bound if self > high" do
|
14
|
-
5.clamp(1,3).should == 3
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should raise an exception if the lower bound is greater than the upper bound" do
|
18
|
-
expect {
|
19
|
-
5.clamp(10,1)
|
20
|
-
}.to raise_error
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|