cuboid 0.0.0 → 0.0.1alpha

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.
Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +0 -0
  3. data/Gemfile +20 -5
  4. data/LICENSE.md +22 -0
  5. data/README.md +158 -19
  6. data/Rakefile +56 -3
  7. data/config/paths.yml +15 -0
  8. data/cuboid.gemspec +61 -23
  9. data/lib/cuboid.rb +96 -4
  10. data/lib/cuboid/application.rb +326 -0
  11. data/lib/cuboid/application/parts/data.rb +18 -0
  12. data/lib/cuboid/application/parts/report.rb +29 -0
  13. data/lib/cuboid/application/parts/state.rb +274 -0
  14. data/lib/cuboid/application/runtime.rb +25 -0
  15. data/lib/cuboid/banner.rb +13 -0
  16. data/lib/cuboid/data.rb +86 -0
  17. data/lib/cuboid/data/application.rb +52 -0
  18. data/lib/cuboid/error.rb +9 -0
  19. data/lib/cuboid/option_group.rb +129 -0
  20. data/lib/cuboid/option_groups.rb +8 -0
  21. data/lib/cuboid/option_groups/datastore.rb +23 -0
  22. data/lib/cuboid/option_groups/dispatcher.rb +38 -0
  23. data/lib/cuboid/option_groups/output.rb +14 -0
  24. data/lib/cuboid/option_groups/paths.rb +184 -0
  25. data/lib/cuboid/option_groups/report.rb +39 -0
  26. data/lib/cuboid/option_groups/rpc.rb +105 -0
  27. data/lib/cuboid/option_groups/scheduler.rb +27 -0
  28. data/lib/cuboid/option_groups/snapshot.rb +13 -0
  29. data/lib/cuboid/option_groups/system.rb +10 -0
  30. data/lib/cuboid/options.rb +254 -0
  31. data/lib/cuboid/processes.rb +13 -0
  32. data/lib/cuboid/processes/dispatchers.rb +140 -0
  33. data/lib/cuboid/processes/executables/base.rb +54 -0
  34. data/lib/cuboid/processes/executables/dispatcher.rb +5 -0
  35. data/lib/cuboid/processes/executables/instance.rb +12 -0
  36. data/lib/cuboid/processes/executables/rest_service.rb +13 -0
  37. data/lib/cuboid/processes/executables/scheduler.rb +5 -0
  38. data/lib/cuboid/processes/helpers.rb +4 -0
  39. data/lib/cuboid/processes/helpers/dispatchers.rb +23 -0
  40. data/lib/cuboid/processes/helpers/instances.rb +39 -0
  41. data/lib/cuboid/processes/helpers/processes.rb +23 -0
  42. data/lib/cuboid/processes/helpers/schedulers.rb +23 -0
  43. data/lib/cuboid/processes/instances.rb +203 -0
  44. data/lib/cuboid/processes/manager.rb +262 -0
  45. data/lib/cuboid/processes/schedulers.rb +128 -0
  46. data/lib/cuboid/report.rb +220 -0
  47. data/lib/cuboid/rest/server.rb +165 -0
  48. data/lib/cuboid/rest/server/instance_helpers.rb +99 -0
  49. data/lib/cuboid/rest/server/routes/dispatcher.rb +41 -0
  50. data/lib/cuboid/rest/server/routes/grid.rb +41 -0
  51. data/lib/cuboid/rest/server/routes/instances.rb +131 -0
  52. data/lib/cuboid/rest/server/routes/scheduler.rb +140 -0
  53. data/lib/cuboid/rpc/client.rb +3 -0
  54. data/lib/cuboid/rpc/client/base.rb +58 -0
  55. data/lib/cuboid/rpc/client/dispatcher.rb +58 -0
  56. data/lib/cuboid/rpc/client/instance.rb +100 -0
  57. data/lib/cuboid/rpc/client/instance/service.rb +37 -0
  58. data/lib/cuboid/rpc/client/scheduler.rb +46 -0
  59. data/lib/cuboid/rpc/serializer.rb +92 -0
  60. data/lib/cuboid/rpc/server/active_options.rb +38 -0
  61. data/lib/cuboid/rpc/server/application_wrapper.rb +138 -0
  62. data/lib/cuboid/rpc/server/base.rb +63 -0
  63. data/lib/cuboid/rpc/server/dispatcher.rb +317 -0
  64. data/lib/cuboid/rpc/server/dispatcher/node.rb +247 -0
  65. data/lib/cuboid/rpc/server/dispatcher/service.rb +145 -0
  66. data/lib/cuboid/rpc/server/instance.rb +338 -0
  67. data/lib/cuboid/rpc/server/output.rb +92 -0
  68. data/lib/cuboid/rpc/server/scheduler.rb +482 -0
  69. data/lib/cuboid/ruby.rb +4 -0
  70. data/lib/cuboid/ruby/array.rb +17 -0
  71. data/lib/cuboid/ruby/hash.rb +41 -0
  72. data/lib/cuboid/ruby/object.rb +32 -0
  73. data/lib/cuboid/snapshot.rb +186 -0
  74. data/lib/cuboid/state.rb +94 -0
  75. data/lib/cuboid/state/application.rb +309 -0
  76. data/lib/cuboid/state/options.rb +27 -0
  77. data/lib/cuboid/support.rb +11 -0
  78. data/lib/cuboid/support/buffer.rb +3 -0
  79. data/lib/cuboid/support/buffer/autoflush.rb +61 -0
  80. data/lib/cuboid/support/buffer/base.rb +91 -0
  81. data/lib/cuboid/support/cache.rb +7 -0
  82. data/lib/cuboid/support/cache/base.rb +226 -0
  83. data/lib/cuboid/support/cache/least_cost_replacement.rb +77 -0
  84. data/lib/cuboid/support/cache/least_recently_pushed.rb +21 -0
  85. data/lib/cuboid/support/cache/least_recently_used.rb +31 -0
  86. data/lib/cuboid/support/cache/preference.rb +31 -0
  87. data/lib/cuboid/support/cache/random_replacement.rb +20 -0
  88. data/lib/cuboid/support/crypto.rb +2 -0
  89. data/lib/cuboid/support/crypto/rsa_aes_cbc.rb +86 -0
  90. data/lib/cuboid/support/database.rb +5 -0
  91. data/lib/cuboid/support/database/base.rb +177 -0
  92. data/lib/cuboid/support/database/categorized_queue.rb +195 -0
  93. data/lib/cuboid/support/database/hash.rb +300 -0
  94. data/lib/cuboid/support/database/queue.rb +149 -0
  95. data/lib/cuboid/support/filter.rb +3 -0
  96. data/lib/cuboid/support/filter/base.rb +110 -0
  97. data/lib/cuboid/support/filter/set.rb +29 -0
  98. data/lib/cuboid/support/glob.rb +27 -0
  99. data/lib/cuboid/support/mixins.rb +8 -0
  100. data/lib/cuboid/support/mixins/observable.rb +99 -0
  101. data/lib/cuboid/support/mixins/parts.rb +20 -0
  102. data/lib/cuboid/support/mixins/profiler.rb +93 -0
  103. data/lib/cuboid/support/mixins/spec_instances.rb +65 -0
  104. data/lib/cuboid/support/mixins/terminal.rb +57 -0
  105. data/lib/cuboid/system.rb +119 -0
  106. data/lib/cuboid/system/platforms.rb +84 -0
  107. data/lib/cuboid/system/platforms/linux.rb +26 -0
  108. data/lib/cuboid/system/platforms/mixins/unix.rb +46 -0
  109. data/lib/cuboid/system/platforms/osx.rb +25 -0
  110. data/lib/cuboid/system/platforms/windows.rb +81 -0
  111. data/lib/cuboid/system/slots.rb +143 -0
  112. data/lib/cuboid/ui/output.rb +52 -0
  113. data/lib/cuboid/ui/output_interface.rb +43 -0
  114. data/lib/cuboid/ui/output_interface/abstract.rb +68 -0
  115. data/lib/cuboid/ui/output_interface/controls.rb +84 -0
  116. data/lib/cuboid/ui/output_interface/error_logging.rb +119 -0
  117. data/lib/cuboid/ui/output_interface/implemented.rb +58 -0
  118. data/lib/cuboid/ui/output_interface/personalization.rb +62 -0
  119. data/lib/cuboid/utilities.rb +155 -0
  120. data/lib/cuboid/version.rb +4 -3
  121. data/lib/version +1 -0
  122. data/logs/placeholder +0 -0
  123. data/spec/cuboid/application/parts/data_spec.rb +12 -0
  124. data/spec/cuboid/application/parts/report_spec.rb +6 -0
  125. data/spec/cuboid/application/parts/state_spec.rb +192 -0
  126. data/spec/cuboid/application/runtime_spec.rb +21 -0
  127. data/spec/cuboid/application_spec.rb +37 -0
  128. data/spec/cuboid/data/application_spec.rb +22 -0
  129. data/spec/cuboid/data_spec.rb +47 -0
  130. data/spec/cuboid/error_spec.rb +23 -0
  131. data/spec/cuboid/option_groups/datastore_spec.rb +54 -0
  132. data/spec/cuboid/option_groups/dispatcher_spec.rb +12 -0
  133. data/spec/cuboid/option_groups/output_spec.rb +11 -0
  134. data/spec/cuboid/option_groups/paths_spec.rb +184 -0
  135. data/spec/cuboid/option_groups/report_spec.rb +26 -0
  136. data/spec/cuboid/option_groups/rpc_spec.rb +53 -0
  137. data/spec/cuboid/option_groups/snapshot_spec.rb +26 -0
  138. data/spec/cuboid/option_groups/system.rb +12 -0
  139. data/spec/cuboid/options_spec.rb +218 -0
  140. data/spec/cuboid/report_spec.rb +221 -0
  141. data/spec/cuboid/rest/server_spec.rb +1205 -0
  142. data/spec/cuboid/rpc/client/base_spec.rb +151 -0
  143. data/spec/cuboid/rpc/client/dispatcher_spec.rb +13 -0
  144. data/spec/cuboid/rpc/client/instance_spec.rb +38 -0
  145. data/spec/cuboid/rpc/server/active_options_spec.rb +21 -0
  146. data/spec/cuboid/rpc/server/base_spec.rb +60 -0
  147. data/spec/cuboid/rpc/server/dispatcher/node_spec.rb +222 -0
  148. data/spec/cuboid/rpc/server/dispatcher/service_spec.rb +112 -0
  149. data/spec/cuboid/rpc/server/dispatcher_spec.rb +317 -0
  150. data/spec/cuboid/rpc/server/instance_spec.rb +307 -0
  151. data/spec/cuboid/rpc/server/output_spec.rb +32 -0
  152. data/spec/cuboid/rpc/server/scheduler_spec.rb +400 -0
  153. data/spec/cuboid/ruby/array_spec.rb +77 -0
  154. data/spec/cuboid/ruby/hash_spec.rb +63 -0
  155. data/spec/cuboid/ruby/object_spec.rb +22 -0
  156. data/spec/cuboid/snapshot_spec.rb +123 -0
  157. data/spec/cuboid/state/application_spec.rb +538 -0
  158. data/spec/cuboid/state/options_spec.rb +37 -0
  159. data/spec/cuboid/state_spec.rb +53 -0
  160. data/spec/cuboid/support/buffer/autoflush_spec.rb +78 -0
  161. data/spec/cuboid/support/buffer/base_spec.rb +193 -0
  162. data/spec/cuboid/support/cache/least_cost_replacement_spec.rb +61 -0
  163. data/spec/cuboid/support/cache/least_recently_pushed_spec.rb +90 -0
  164. data/spec/cuboid/support/cache/least_recently_used_spec.rb +80 -0
  165. data/spec/cuboid/support/cache/preference_spec.rb +37 -0
  166. data/spec/cuboid/support/cache/random_replacement_spec.rb +42 -0
  167. data/spec/cuboid/support/crypto/rsa_aes_cbc_spec.rb +28 -0
  168. data/spec/cuboid/support/database/categorized_queue_spec.rb +327 -0
  169. data/spec/cuboid/support/database/hash_spec.rb +204 -0
  170. data/spec/cuboid/support/database/scheduler_spec.rb +325 -0
  171. data/spec/cuboid/support/filter/set_spec.rb +19 -0
  172. data/spec/cuboid/support/glob_spec.rb +75 -0
  173. data/spec/cuboid/support/mixins/observable_spec.rb +95 -0
  174. data/spec/cuboid/system/platforms/linux_spec.rb +31 -0
  175. data/spec/cuboid/system/platforms/osx_spec.rb +32 -0
  176. data/spec/cuboid/system/platforms/windows_spec.rb +41 -0
  177. data/spec/cuboid/system/slots_spec.rb +202 -0
  178. data/spec/cuboid/system_spec.rb +105 -0
  179. data/spec/cuboid/utilities_spec.rb +131 -0
  180. data/spec/spec_helper.rb +46 -0
  181. data/spec/support/factories/placeholder +0 -0
  182. data/spec/support/factories/scan_report.rb +18 -0
  183. data/spec/support/fixtures/empty/placeholder +0 -0
  184. data/spec/support/fixtures/executables/node.rb +50 -0
  185. data/spec/support/fixtures/mock_app.rb +61 -0
  186. data/spec/support/fixtures/mock_app/test_service.rb +64 -0
  187. data/spec/support/fixtures/services/echo.rb +64 -0
  188. data/spec/support/helpers/framework.rb +3 -0
  189. data/spec/support/helpers/matchers.rb +5 -0
  190. data/spec/support/helpers/misc.rb +3 -0
  191. data/spec/support/helpers/paths.rb +15 -0
  192. data/spec/support/helpers/request_helpers.rb +38 -0
  193. data/spec/support/helpers/requires.rb +8 -0
  194. data/spec/support/helpers/resets.rb +52 -0
  195. data/spec/support/helpers/web_server.rb +15 -0
  196. data/spec/support/lib/factory.rb +107 -0
  197. data/spec/support/lib/web_server_client.rb +41 -0
  198. data/spec/support/lib/web_server_dispatcher.rb +25 -0
  199. data/spec/support/lib/web_server_manager.rb +118 -0
  200. data/spec/support/logs/placeholder +0 -0
  201. data/spec/support/pems/cacert.pem +37 -0
  202. data/spec/support/pems/client/cert.pem +37 -0
  203. data/spec/support/pems/client/foo-cert.pem +39 -0
  204. data/spec/support/pems/client/foo-key.pem +51 -0
  205. data/spec/support/pems/client/key.pem +51 -0
  206. data/spec/support/pems/server/cert.pem +37 -0
  207. data/spec/support/pems/server/key.pem +51 -0
  208. data/spec/support/reports/placeholder +0 -0
  209. data/spec/support/shared/application.rb +10 -0
  210. data/spec/support/shared/component.rb +31 -0
  211. data/spec/support/shared/component/options/base.rb +187 -0
  212. data/spec/support/shared/option_group.rb +98 -0
  213. data/spec/support/shared/support/cache.rb +419 -0
  214. data/spec/support/shared/support/filter.rb +143 -0
  215. data/spec/support/shared/system/platforms/base.rb +25 -0
  216. data/spec/support/shared/system/platforms/mixins/unix.rb +37 -0
  217. data/spec/support/snapshots/placeholder +0 -0
  218. metadata +566 -21
  219. data/.gitignore +0 -8
  220. data/bin/console +0 -15
  221. data/bin/setup +0 -8
@@ -0,0 +1,110 @@
1
+ module Cuboid
2
+ module Support::Filter
3
+
4
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
5
+ # @abstract
6
+ class Base
7
+
8
+ attr_reader :collection
9
+
10
+ DEFAULT_OPTIONS = {
11
+ hasher: :hash
12
+ }
13
+
14
+ # @param [Set] options
15
+ # @option options [Symbol] (:hasher)
16
+ # Method to call on the item to obtain its hash.
17
+ def initialize( options = {} )
18
+ @options = DEFAULT_OPTIONS.merge( options )
19
+ @hasher = @options[:hasher].to_sym
20
+ end
21
+
22
+ # @param [#persistent_hash] item
23
+ # Item to insert.
24
+ #
25
+ # @return [Base]
26
+ # `self`
27
+ def <<( item )
28
+ @collection << calculate_hash( item )
29
+ self
30
+ end
31
+
32
+ # @param [#persistent_hash] item
33
+ # Item to check.
34
+ #
35
+ # @return [Bool]
36
+ def include?( item )
37
+ @collection.include? calculate_hash( item )
38
+ end
39
+
40
+ def empty?
41
+ @collection.empty?
42
+ end
43
+
44
+ def any?
45
+ !empty?
46
+ end
47
+
48
+ def size
49
+ @collection.size
50
+ end
51
+
52
+ def clear
53
+ @collection.clear
54
+ end
55
+
56
+ def merge( other )
57
+ case other
58
+ when self.class
59
+
60
+ @collection.merge other.collection
61
+
62
+ when Array
63
+
64
+ other.each do |k|
65
+ fail 'Cannot merge with unhashed entries' if !k.is_a?( Numeric )
66
+ @collection << k
67
+ end
68
+
69
+ else
70
+ fail ArgumentError,
71
+ "Don't know how to merge with: #{other.class}"
72
+ end
73
+
74
+ self
75
+ end
76
+
77
+ def ==( other )
78
+ hash == other.hash
79
+ end
80
+
81
+ def hash
82
+ @collection.hash
83
+ end
84
+
85
+ def dup
86
+ self.class.new( @options.dup ).merge self
87
+ end
88
+
89
+ def _dump( _ )
90
+ Marshal.dump( to_rpc_data )
91
+ end
92
+
93
+ def self._load( data )
94
+ from_rpc_data Marshal.load( data )
95
+ end
96
+
97
+ def collection=( c )
98
+ @collection = c
99
+ end
100
+
101
+ private
102
+
103
+ def calculate_hash( item )
104
+ item.send @hasher
105
+ end
106
+
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,29 @@
1
+ require 'set'
2
+
3
+ module Cuboid
4
+ module Support::Filter
5
+
6
+ # Filter based on a Set.
7
+ #
8
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
9
+ class Set < Base
10
+
11
+ # @param (see Base#initialize)
12
+ def initialize(*)
13
+ super
14
+ @collection = ::Set.new
15
+ end
16
+
17
+ def to_rpc_data
18
+ [@options, @collection.to_a]
19
+ end
20
+
21
+ def self.from_rpc_data( data )
22
+ options, items = data
23
+ new( options ).merge items
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ module Cuboid
2
+ module Support
3
+
4
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
5
+ class Glob
6
+
7
+ def self.to_regexp( glob )
8
+ escaped = Regexp.escape( glob ).gsub( '\*', '.*?' )
9
+ Regexp.new( "^#{escaped}$", Regexp::IGNORECASE )
10
+ end
11
+
12
+ attr_reader :regexp
13
+
14
+ def initialize( glob )
15
+ @regexp = self.class.to_regexp( glob )
16
+ end
17
+
18
+ def =~( str )
19
+ @regexp.match? str
20
+ end
21
+ alias :matches? :=~
22
+ alias :match? :matches?
23
+
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,8 @@
1
+ module Cuboid::Mixins
2
+ end
3
+
4
+ lib = Cuboid::Options.paths.mixins
5
+ require lib + 'observable'
6
+ require lib + 'terminal'
7
+ require lib + 'profiler'
8
+ require lib + 'parts'
@@ -0,0 +1,99 @@
1
+ module Cuboid
2
+ module Support
3
+ module Mixins
4
+
5
+ # Provides a flexible way to make any object observable for multiple events.
6
+ #
7
+ # The observable classes use:
8
+ #
9
+ # * `notify_<event>( *args )`
10
+ #
11
+ # to notify observers of events.
12
+ #
13
+ # The observers request notifications using:
14
+ #
15
+ # * `observable.<event>( &block )`
16
+ #
17
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
18
+ module Observable
19
+ include UI::Output
20
+ include Utilities
21
+
22
+ include MonitorMixin
23
+
24
+ def self.included( base )
25
+ base.extend ClassMethods
26
+ end
27
+
28
+ module ClassMethods
29
+ def advertise( *ad_events )
30
+ ad_events.each do |event|
31
+ define_method event do |&block|
32
+ add_observer( event, &block )
33
+ end
34
+
35
+ define_method "notify_#{event}" do |*args|
36
+ notify_observers( event, *args )
37
+ end
38
+
39
+ private "notify_#{event}"
40
+ end
41
+
42
+ nil
43
+ end
44
+ end
45
+
46
+ def initialize
47
+ super
48
+
49
+ @__observers = {}
50
+ end
51
+
52
+ private
53
+
54
+ def observers
55
+ @__observers
56
+ end
57
+
58
+ def add_observer( event, &block )
59
+ fail ArgumentError, 'Missing block' if !block
60
+ synchronize do
61
+ observers_for( event ) << block
62
+ end
63
+
64
+ self
65
+ end
66
+
67
+ def notify_observers( event, *args )
68
+ synchronize do
69
+ observers_for( event ).each do |block|
70
+ exception_jail( false ) { block.call( *args ) }
71
+ end
72
+ end
73
+
74
+ nil
75
+ end
76
+
77
+ def dup_observers
78
+ observers.inject({}) { |h, (k, v)| h[k] = v.dup; h }
79
+ end
80
+
81
+ def set_observers( obs )
82
+ @__observers = obs
83
+ end
84
+
85
+ def observers_for( event )
86
+ observers[event.to_sym] ||= []
87
+ end
88
+
89
+ def clear_observers
90
+ synchronize do
91
+ observers.clear
92
+ end
93
+ end
94
+
95
+ end
96
+
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,20 @@
1
+ module Cuboid
2
+ module Support
3
+ module Mixins
4
+
5
+ module Parts
6
+
7
+ def self.included( base )
8
+ dir = Utilities.caller_path( 3 ).split( '.rb', 2 ).first
9
+ Dir.glob( "#{dir}/parts/**/*.rb" ).each { |f| require f }
10
+
11
+ parts = base.const_get( :Parts )
12
+ parts.constants.each do |part_name|
13
+ base.include parts.const_get( part_name )
14
+ end
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,93 @@
1
+ module Cuboid
2
+ module Support
3
+ module Mixins
4
+
5
+ module Profiler
6
+
7
+ @@on = false
8
+
9
+ class <<self
10
+
11
+ def included( base )
12
+ base.extend ClassMethods
13
+ end
14
+
15
+ def enable!
16
+ @@on = true
17
+ end
18
+
19
+ def disable!
20
+ @@on = false
21
+ end
22
+
23
+ def on?
24
+ @@on
25
+ end
26
+
27
+ def results
28
+ h = {}
29
+ ObjectSpace.each_object( Class ) do |klass|
30
+ next if !klass.included_modules.include? self
31
+ next if klass.profile_data.empty?
32
+
33
+ h[klass] = {
34
+ sorted_total: klass.profile_data_total,
35
+ sorted_avg: klass.profile_data_avg
36
+ }
37
+ end
38
+ h
39
+ end
40
+
41
+ end
42
+
43
+ module ClassMethods
44
+
45
+ def profile_data
46
+ @profile ||= {}
47
+ end
48
+
49
+ def profile_data_avg
50
+ ::Hash[self.profile_data.sort_by { |_, d| d[:avg] }.reverse]
51
+ end
52
+
53
+ def profile_data_total
54
+ ::Hash[self.profile_data.sort_by { |_, d| d[:total] }.reverse]
55
+ end
56
+
57
+ end
58
+
59
+ def profile_proc( *args, &block )
60
+ return block.call( *args ) if !Support::Mixins::Profiler.on?
61
+
62
+ profile_wrap_proc( &block ).call *args
63
+ end
64
+
65
+ def profile_wrap_proc( &block )
66
+ return block if !Support::Mixins::Profiler.on?
67
+
68
+ proc do |*args|
69
+ t = Time.now
70
+ r = block.call( *args )
71
+
72
+ loc = block.source_location.join( ':' )
73
+ loc.gsub!( Options.paths.root, '' )
74
+
75
+ data = self.class.profile_data[loc] ||= {
76
+ total: 0,
77
+ count: 0,
78
+ avg: 0
79
+ }
80
+
81
+ data[:total] += Time.now - t
82
+ data[:count] += 1
83
+ data[:avg] = data[:total] / data[:count]
84
+
85
+ r
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,65 @@
1
+ module Cuboid
2
+ module Support
3
+ module Mixins
4
+
5
+ # @note Only for when running specs!
6
+ #
7
+ # Keeps track of every initialized instance so that they can be properly
8
+ # cleaned-up later.
9
+ module SpecInstances
10
+
11
+ def self.prepended( base )
12
+ base.extend ClassMethods
13
+ end
14
+
15
+ module ClassMethods
16
+
17
+ # @abstract
18
+ def _spec_instance_cleanup( i )
19
+ fail 'Not implemented.'
20
+ end
21
+
22
+ def _spec_instances_cleanup
23
+ _spec_instances.each do |i|
24
+ _spec_instance_cleanup i
25
+ end
26
+
27
+ _spec_instances_clear
28
+ end
29
+
30
+ def _spec_instances_clear
31
+ _spec_instances.clear
32
+ end
33
+
34
+ def _spec_instance( instance )
35
+ return if !_spec_instances_collect?
36
+ _spec_instances << instance
37
+ end
38
+
39
+ def _spec_instances_collect!
40
+ @_spec_instances_collect = true
41
+ end
42
+
43
+ def _spec_instances_collect?
44
+ @_spec_instances_collect
45
+ end
46
+
47
+ private
48
+
49
+ def _spec_instances
50
+ @_spec_instances ||= Concurrent::Array.new
51
+ end
52
+
53
+ end
54
+
55
+ def initialize(*)
56
+ super
57
+
58
+ self.class._spec_instance self
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+ end
65
+ end