aquarium 0.7.1 → 0.7.3

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: 607c8e2ff478a03b28cb82786e11db87f2809aeedb30749ca57c93e3da75a8e3
4
- data.tar.gz: 027f4f0635c170239546fde6547f8c84a684020046cd940f3466ab9f8bbb45a4
3
+ metadata.gz: df94cd118d921250a4c653a487c04b8446c311b8901f2fffe0dfb047a66b89f7
4
+ data.tar.gz: 6822873aecf444624668cbba457e5dad45b243b6d86d7b22f9a73f664fb3ce3a
5
5
  SHA512:
6
- metadata.gz: de21011f1c22b93eac2de02630836c40759511a80d2d02b6ee626e98a17b41bcaf50d1bb65393da9123b1638e7b503c37075764e30fbb380dd25e216134ac6e3
7
- data.tar.gz: 30157999d9b464b2bdcb8808a14ab7f1ed90b89a8959f7cc9fe5ed7cb52f4355c6a4770f6210622d47b3e2ec85fe6e8f80ab917eb74a26d2cedd5d3448fc911f
6
+ metadata.gz: 1244c4a7b426bdca859e6670323ad5320f078dab7616202aeb1a3a07743825af11f301757049df29339b55f37cada3b5024072ef5a3e4c4532e6b6071681318e
7
+ data.tar.gz: 73eac1c747752f01250cf22ea4401601da5b65880caac5b53b919cbd7d3e385e36c829f15debf07cba7d7f68c8f4d256f520667b0f7eb5672bc840390e1b3bd9
data/CHANGES CHANGED
@@ -1,3 +1,9 @@
1
+ == Version 0.7.3
2
+
3
+ (0.7.2 had documentation errors.)
4
+
5
+ Removed an ill-advised (if you'll pardon the expression...) use of monkey patching to add a `to_camel_case` method to `String`, which I only used in one place! Instead, I just call a utility to do this.
6
+
1
7
  == Version 0.7.1
2
8
 
3
9
  Adds support for Ruby 2.6. It was tested with 2.6.3p62 (2019-04-16 revision 67580). Basic JRuby 9.2.7.0 (2.5.3) 2019-04-09 8a269e3 support is provided, but using JRuby currently does *not* pass all the custom Java specs in the `jruby/spec` directory, which specifically test working with Java classes. However, JRuby does pass all the Ruby specs in the `spec` directory. This is a long-standing issue with JRuby support in Aquarium. Patches are welcome!
data/UPGRADE CHANGED
@@ -1,3 +1,7 @@
1
+ == Updating to Aquarium-0.7.3
2
+
3
+ Version 0.7.3 has only been tested with Ruby 2.7.0, but it should support the same versions as version 0.7.1, as this release contains only a relatively small set of code changes to fix issue #43.
4
+
1
5
  == Updating to Aquarium-0.7.1
2
6
 
3
7
  Version 0.7.1 supports only Ruby 2.6. It was tested with 2.6.3p62 (2019-04-16 revision 67580). Basic JRuby 9.2.7.0 (2.5.3) 2019-04-09 8a269e3 support is provided, but using JRuby currently does *not* pass all the custom Java specs in the `jruby/spec` directory, which specifically test working with Java classes. However, JRuby does pass all the Ruby specs in the `spec` directory. This is a long-standing issue with JRuby support in Aquarium. Patches are welcome!
@@ -12,7 +12,6 @@ Gem::Specification.new do |s|
12
12
  s.authors = ["Dean Wampler and other contributors"]
13
13
  s.email = "deanwampler@gmail.com"
14
14
  s.homepage = "https://deanwampler.github.io/open-source/aquarium/index.html"
15
- s.rubyforge_project = "aquarium"
16
15
  s.description = <<-EOF
17
16
  Aquarium is a full-featured Aspect-Oriented Programming (AOP) framework for Ruby that is
18
17
  designed to provide an intuitive syntax and support for large-scale, dynamic aspects.
@@ -1,29 +1,31 @@
1
1
  require 'aquarium/utils/array_utils'
2
- require 'aquarium/extensions/string'
2
+ require 'aquarium/utils/camel_case'
3
3
  require 'aquarium/utils/invalid_options'
4
4
  require 'aquarium/utils/nil_object'
5
5
 
6
+ include Aquarium::Utils::CamelCase
7
+
6
8
  module Aquarium
7
9
  module Aspects
8
10
  module Advice
9
-
11
+
10
12
  UNKNOWN_ADVICE_KIND = "unknown"
11
13
 
12
- KINDS_IN_PRIORITY_ORDER = [:around, :before, :after, :after_returning, :after_raising]
14
+ KINDS_IN_PRIORITY_ORDER = [:around, :before, :after, :after_returning, :after_raising]
13
15
 
14
16
  @DEBUG_BACKTRACES = false
15
17
 
16
18
  def self.debug_backtraces; @DEBUG_BACKTRACES; end
17
19
  def self.debug_backtraces=( val ); @DEBUG_BACKTRACES = val; end
18
-
20
+
19
21
  def self.kinds; KINDS_IN_PRIORITY_ORDER; end
20
22
 
21
23
  def self.sort_by_priority_order advice_kinds
22
- advice_kinds.sort do |x,y|
24
+ advice_kinds.sort do |x,y|
23
25
  KINDS_IN_PRIORITY_ORDER.index(x.to_sym) <=> KINDS_IN_PRIORITY_ORDER.index(y.to_sym)
24
26
  end.map {|x| x.to_sym}
25
27
  end
26
-
28
+
27
29
  def self.compare_advice_kinds kind1, kind2
28
30
  if kind1.nil?
29
31
  return kind2.nil? ? 0 : -1
@@ -35,18 +37,18 @@ module Aquarium
35
37
  return kind2.eql?(UNKNOWN_ADVICE_KIND) ? 1 : KINDS_IN_PRIORITY_ORDER.index(kind1) <=> KINDS_IN_PRIORITY_ORDER.index(kind2)
36
38
  end
37
39
  end
38
-
39
- end
40
+
41
+ end
40
42
 
41
43
  # Supports Enumerable, but not the sorting methods, as this class is a linked list structure.
42
44
  # This is of limited usefulness, because you wouldn't use an iterator to invoke the procs
43
45
  # in the chain, because each proc will invoke the next node arbitrarily or possibly not at all
44
46
  # in the case of around advice!
45
- class AdviceChainNode
47
+ class AdviceChainNode
46
48
  include Enumerable
47
49
  def initialize options = {}
48
50
  # assign :next_node and :static_join_point so the attributes are always created
49
- options[:next_node] ||= nil
51
+ options[:next_node] ||= nil
50
52
  options[:static_join_point] ||= nil
51
53
  options.each do |key, value|
52
54
  instance_variable_set "@#{key}".intern, value
@@ -55,7 +57,7 @@ module Aquarium
55
57
  EOF
56
58
  end
57
59
  end
58
-
60
+
59
61
  # Bug #19262 workaround: need to only pass jp argument if arity is 1.
60
62
  def call_advice jp
61
63
  if advice.arity == 1
@@ -64,7 +66,7 @@ module Aquarium
64
66
  advice.call jp, jp.context.advised_object, *jp.context.parameters
65
67
  end
66
68
  end
67
-
69
+
68
70
  def call jp
69
71
  begin
70
72
  advice_wrapper jp
@@ -72,7 +74,7 @@ module Aquarium
72
74
  handle_call_rescue e, "", jp
73
75
  end
74
76
  end
75
-
77
+
76
78
  def invoke_original_join_point current_jp
77
79
  begin
78
80
  last.advice_wrapper current_jp
@@ -80,41 +82,41 @@ module Aquarium
80
82
  handle_call_rescue e, "While executing the original join_point: ", current_jp
81
83
  end
82
84
  end
83
-
85
+
84
86
  # Supports Enumerable
85
- def each
86
- node = self
87
- while node.nil? == false
88
- yield node
89
- node = node.next_node
90
- end
87
+ def each
88
+ node = self
89
+ while node.nil? == false
90
+ yield node
91
+ node = node.next_node
92
+ end
91
93
  end
92
-
94
+
93
95
  def last
94
96
  last_node = nil
95
- each { |node| last_node = node unless node.nil? }
97
+ each { |node| last_node = node unless node.nil? }
96
98
  last_node
97
99
  end
98
-
100
+
99
101
  def size
100
102
  inject(0) {|memo, node| memo += 1}
101
103
  end
102
-
104
+
103
105
  def empty?
104
106
  next_node.nil?
105
107
  end
106
-
108
+
107
109
  # TODO: remove this method, which causes run-away recursions in R1.9.1
108
110
  # def inspect &block
109
- # block ? yield(self) : super
111
+ # block ? yield(self) : super
110
112
  # end
111
-
113
+
112
114
  NIL_OBJECT = Aquarium::Utils::NilObject.new
113
-
115
+
114
116
  protected
115
-
117
+
116
118
  #--
117
- # For performance reasons, we don't clone the context.
119
+ # For performance reasons, we don't clone the context.
118
120
  # TODO: There are potential concurrency issues!
119
121
  #++
120
122
  def update_current_context jp
@@ -124,12 +126,12 @@ module Aquarium
124
126
  jp.context.current_advice_node = self
125
127
  end
126
128
 
127
- def reset_current_context jp
129
+ def reset_current_context jp
128
130
  return if advice.arity == 0
129
131
  jp.context.advice_kind = @last_advice_kind
130
132
  jp.context.current_advice_node = @last_advice_node
131
133
  end
132
-
134
+
133
135
  def handle_call_rescue ex, error_message_prefix, jp
134
136
  if Aquarium::Aspects::Advice.debug_backtraces
135
137
  class_or_instance_method_separater = jp.instance_method? ? "#" : "."
@@ -154,7 +156,7 @@ module Aquarium
154
156
  # rather than object.method(...).call(*args). The latter fails when the original method
155
157
  # calls super. This is a Ruby bug: http://www.ruby-forum.com/topic/124276
156
158
  class NoAdviceChainNode < AdviceChainNode
157
- # Note that we extract the block passed to the original method call, if any,
159
+ # Note that we extract the block passed to the original method call, if any,
158
160
  # from the context and pass it to method invocation.
159
161
  def initialize options = {}
160
162
  super options
@@ -166,7 +168,7 @@ module Aquarium
166
168
 
167
169
  class BeforeAdviceChainNode < AdviceChainNode
168
170
  def initialize options = {}
169
- super options
171
+ super options
170
172
  end
171
173
  def advice_wrapper jp
172
174
  update_current_context jp
@@ -220,11 +222,11 @@ module Aquarium
220
222
  def after_raising_exceptions_list_includes raised_exception
221
223
  after_raising_exceptions_list.find {|x| raised_exception.kind_of? x}
222
224
  end
223
-
224
- def after_raising_exceptions_list
225
+
226
+ def after_raising_exceptions_list
225
227
  list = @after_raising.kind_of?(Set) ? @after_raising.to_a : @after_raising
226
228
  (list.nil? || list.empty? || (list.size == 1 && list[0] == "")) ? [Object] : list
227
- end
229
+ end
228
230
  end
229
231
 
230
232
  class AfterAdviceChainNode < AdviceChainNode
@@ -232,7 +234,7 @@ module Aquarium
232
234
  super options
233
235
  end
234
236
  def advice_wrapper jp
235
- # call_advice is invoked in each bloc, rather than once in an "ensure" clause, so the invocation in
237
+ # call_advice is invoked in each bloc, rather than once in an "ensure" clause, so the invocation in
236
238
  # the rescue clause can allow the advice to change the exception that will be raised.
237
239
  begin
238
240
  returned_value = next_node.call jp
@@ -270,18 +272,18 @@ module Aquarium
270
272
  end
271
273
 
272
274
  # The advice_kind argument must be one of the values returned by Advice.kinds or one of the special values
273
- # ":no" or ":none", signfying a node for which there is no advice, where the actual method being advised is
275
+ # ":no" or ":none", signfying a node for which there is no advice, where the actual method being advised is
274
276
  # called directly instead. This kind of node is normally used as the terminal leaf in the chain.
275
277
  module AdviceChainNodeFactory
276
278
  def self.make_node options = {}
277
279
  advice_kind = options[:advice_kind]
278
280
  raise Aquarium::Utils::InvalidOptions.new("Unknown advice kind specified: #{advice_kind}") unless valid(advice_kind)
279
281
  advice_kind = :no if advice_kind == :none
280
- advice_chain_node_name = advice_kind.to_s.to_camel_case + "AdviceChainNode"
282
+ advice_chain_node_name = Aquarium::Utils::CamelCase.to_camel_case(advice_kind.to_s) + "AdviceChainNode"
281
283
  clazz = Aquarium::Aspects.const_get advice_chain_node_name
282
284
  clazz.new options
283
285
  end
284
-
286
+
285
287
  def self.valid advice_kind
286
288
  advice_kind == :no || advice_kind == :none || Advice.kinds.include?(advice_kind)
287
289
  end
@@ -1,4 +1,3 @@
1
1
  require 'aquarium/extensions/hash'
2
2
  require 'aquarium/extensions/regexp'
3
3
  require 'aquarium/extensions/set'
4
- require 'aquarium/extensions/string'
@@ -1,6 +1,7 @@
1
1
  require 'aquarium/utils/array_utils'
2
2
  require 'aquarium/utils/hash_utils'
3
3
  require 'aquarium/utils/set_utils'
4
+ require 'aquarium/utils/camel_case'
4
5
 
5
6
  require 'aquarium/utils/method_utils'
6
7
  require 'aquarium/utils/name_utils'
@@ -0,0 +1,18 @@
1
+ module Aquarium
2
+ module Utils
3
+ module CamelCase
4
+ def to_camel_case str
5
+ str.split('_').map {|s| s[0,1]=s[0,1].capitalize; s}.join
6
+ end
7
+
8
+ def to_snake_case str
9
+ str.gsub(/([A-Z]+[a-z0-9_-]*)/, '\1_').downcase.gsub(/__*/, '_').gsub(/_$/, '').gsub(/^_/, '')
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ # bad id, as at least one other library wants to define from on string
16
+ # class String
17
+ # include Aquarium::Extensions::CamelCase
18
+ # end
@@ -9,7 +9,7 @@ module Aquarium
9
9
  unless defined? MAJOR
10
10
  MAJOR = 0
11
11
  MINOR = 7
12
- TINY = 1
12
+ TINY = 3
13
13
  RELEASE_CANDIDATE = nil
14
14
 
15
15
  # RANDOM_TOKEN: 0.598704893979657
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require 'aquarium/utils/camel_case'
3
+
4
+ describe CamelCase, "#to_camel_case" do
5
+ it "should return a camel-case string unchanged" do
6
+ CamelCase.to_camel_case("CamelCaseString").should == "CamelCaseString"
7
+ end
8
+
9
+ it "should return a camel-case string from an input string with substrings separated by underscores" do
10
+ CamelCase.to_camel_case("camel_case_string").should == "CamelCaseString"
11
+ end
12
+
13
+ it "should return a camel-case string with the first letters of each substring in uppercase and the rest of the letters in each substring unchanged" do
14
+ CamelCase.to_camel_case("cAmEl_cASE_stRinG").should == "CAmElCASEStRinG"
15
+ end
16
+
17
+ it "should remove leading and trailing underscores" do
18
+ CamelCase.to_camel_case("camel_case_string_").should == "CamelCaseString"
19
+ CamelCase.to_camel_case("_camel_case_string").should == "CamelCaseString"
20
+ CamelCase.to_camel_case("camel_case_string__").should == "CamelCaseString"
21
+ CamelCase.to_camel_case("__camel_case_string").should == "CamelCaseString"
22
+ CamelCase.to_camel_case("_camel_case_string_").should == "CamelCaseString"
23
+ CamelCase.to_camel_case("__camel_case_string__").should == "CamelCaseString"
24
+ end
25
+ end
26
+
27
+ describe CamelCase, "#to_snake_case" do
28
+ it "should return a snake-case string unchanged" do
29
+ CamelCase.to_snake_case("camel_case_string").should == "camel_case_string"
30
+ end
31
+
32
+ it "should return a snake-case string to an input string with substrings separated by underscores" do
33
+ CamelCase.to_snake_case("CamelCaseString").should == "camel_case_string"
34
+ end
35
+
36
+ it "should return a snake-case string with all characters converted to lower case" do
37
+ CamelCase.to_snake_case("CamelCaseString").should == "camel_case_string"
38
+ end
39
+
40
+ it "should partition the words by [A-Z]+[a-z0-9]*" do
41
+ CamelCase.to_snake_case("CAmElCASEStRinG").should == "cam_el_casest_rin_g"
42
+ end
43
+
44
+ it "should preserve embedded underscores" do
45
+ CamelCase.to_snake_case("C_Am_ElCA_SEStR_inG").should == "c_am_el_ca_sest_r_in_g"
46
+ end
47
+
48
+ it "should remove leading, trailing, and repeated underscores" do
49
+ puts CamelCase.to_snake_case("_Camel__CaseString_")
50
+ CamelCase.to_snake_case("_Camel__CaseString_").should == "camel_case_string"
51
+ end
52
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aquarium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dean Wampler and other contributors
8
8
  autorequire: aquarium
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-23 00:00:00.000000000 Z
11
+ date: 2020-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -205,7 +205,6 @@ files:
205
205
  - lib/aquarium/extensions/hash.rb
206
206
  - lib/aquarium/extensions/regexp.rb
207
207
  - lib/aquarium/extensions/set.rb
208
- - lib/aquarium/extensions/string.rb
209
208
  - lib/aquarium/extras.rb
210
209
  - lib/aquarium/extras/design_by_contract.rb
211
210
  - lib/aquarium/finders.rb
@@ -215,6 +214,7 @@ files:
215
214
  - lib/aquarium/finders/type_finder.rb
216
215
  - lib/aquarium/utils.rb
217
216
  - lib/aquarium/utils/array_utils.rb
217
+ - lib/aquarium/utils/camel_case.rb
218
218
  - lib/aquarium/utils/default_logger.rb
219
219
  - lib/aquarium/utils/hash_utils.rb
220
220
  - lib/aquarium/utils/html_escaper.rb
@@ -251,7 +251,6 @@ files:
251
251
  - spec/aquarium/extensions/hash_spec.rb
252
252
  - spec/aquarium/extensions/regex_spec.rb
253
253
  - spec/aquarium/extensions/set_spec.rb
254
- - spec/aquarium/extensions/string_spec.rb
255
254
  - spec/aquarium/extras/design_by_contract_spec.rb
256
255
  - spec/aquarium/finders/finder_result_spec.rb
257
256
  - spec/aquarium/finders/method_finder_spec.rb
@@ -263,6 +262,7 @@ files:
263
262
  - spec/aquarium/spec_example_types.rb
264
263
  - spec/aquarium/spec_helper.rb
265
264
  - spec/aquarium/utils/array_utils_spec.rb
265
+ - spec/aquarium/utils/camel_case_spec.rb
266
266
  - spec/aquarium/utils/default_logger_spec.rb
267
267
  - spec/aquarium/utils/hash_utils_spec.rb
268
268
  - spec/aquarium/utils/html_escaper_spec.rb
@@ -293,10 +293,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
293
293
  - !ruby/object:Gem::Version
294
294
  version: '0'
295
295
  requirements: []
296
- rubygems_version: 3.0.3
296
+ rubygems_version: 3.1.2
297
297
  signing_key:
298
298
  specification_version: 4
299
- summary: Aquarium-0.7.1 (r7) - Aspect-Oriented Programming toolkit for Ruby http://aquarium.rubyforge.org
299
+ summary: Aquarium-0.7.3 (r7) - Aspect-Oriented Programming toolkit for Ruby http://aquarium.rubyforge.org
300
300
  test_files:
301
301
  - spec/aquarium/aspects/advice_chain_node_spec.rb
302
302
  - spec/aquarium/aspects/advice_spec.rb
@@ -316,7 +316,6 @@ test_files:
316
316
  - spec/aquarium/extensions/hash_spec.rb
317
317
  - spec/aquarium/extensions/regex_spec.rb
318
318
  - spec/aquarium/extensions/set_spec.rb
319
- - spec/aquarium/extensions/string_spec.rb
320
319
  - spec/aquarium/extras/design_by_contract_spec.rb
321
320
  - spec/aquarium/finders/finder_result_spec.rb
322
321
  - spec/aquarium/finders/method_finder_spec.rb
@@ -328,6 +327,7 @@ test_files:
328
327
  - spec/aquarium/spec_example_types.rb
329
328
  - spec/aquarium/spec_helper.rb
330
329
  - spec/aquarium/utils/array_utils_spec.rb
330
+ - spec/aquarium/utils/camel_case_spec.rb
331
331
  - spec/aquarium/utils/default_logger_spec.rb
332
332
  - spec/aquarium/utils/hash_utils_spec.rb
333
333
  - spec/aquarium/utils/html_escaper_spec.rb
@@ -1,13 +0,0 @@
1
- module Aquarium
2
- module Extensions
3
- module StringHelper
4
- def to_camel_case
5
- split('_').map {|s| s[0,1]=s[0,1].capitalize; s}.join
6
- end
7
- end
8
- end
9
- end
10
-
11
- class String
12
- include Aquarium::Extensions::StringHelper
13
- end
@@ -1,25 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'aquarium/extensions/string'
3
-
4
- describe String, "#to_camel_case" do
5
- it "should return a camel-case string unchanged" do
6
- "CamelCaseString".to_camel_case.should == "CamelCaseString"
7
- end
8
-
9
- it "should return a camel-case string from an input string with substrings separated by underscores" do
10
- "camel_case_string".to_camel_case.should == "CamelCaseString"
11
- end
12
-
13
- it "should return a camel-case string with the first letters of each substring in uppercase and the rest of the letters in each substring unchanged" do
14
- "cAmEl_cASE_stRinG".to_camel_case.should == "CAmElCASEStRinG"
15
- end
16
-
17
- it "should remove leading and trailing underscores" do
18
- "camel_case_string_".to_camel_case.should == "CamelCaseString"
19
- "_camel_case_string".to_camel_case.should == "CamelCaseString"
20
- "camel_case_string__".to_camel_case.should == "CamelCaseString"
21
- "__camel_case_string".to_camel_case.should == "CamelCaseString"
22
- "_camel_case_string_".to_camel_case.should == "CamelCaseString"
23
- "__camel_case_string__".to_camel_case.should == "CamelCaseString"
24
- end
25
- end