fun_with_patterns 0.0.3 → 0.0.4
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 +8 -8
- data/CHANGELOG.markdown +12 -0
- data/Gemfile +7 -8
- data/README.rdoc +58 -0
- data/Rakefile +6 -0
- data/VERSION +1 -1
- data/lib/fun_with/patterns/get_and_set.rb +50 -0
- data/lib/fun_with/patterns/get_and_set_api.rb +13 -0
- data/lib/fun_with/patterns/hooks.rb +47 -0
- data/lib/fun_with/patterns/loader.rb +82 -10
- data/lib/fun_with/patterns/reloadable.rb +33 -0
- data/lib/fun_with_patterns.rb +6 -12
- data/test/helper.rb +19 -18
- data/test/reloadable/my_reloadable.rb +7 -0
- data/test/test_get_and_set.rb +77 -0
- data/test/test_hooks.rb +25 -0
- data/test/test_loader_pattern.rb +13 -1
- data/test/test_reloadable_pattern.rb +33 -0
- data/test/user.rb +12 -0
- metadata +30 -106
- data/.document +0 -5
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OWZlYzlkNjQ2MzBkZjY3ZGUxOTUwZTI2MmY0MzYzNDE4MjI1MGJjNA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZDM0ZDUzMmY2ZTM2YmJmNTNhNDRhZjg1ODZlMDc3ZjBkOTc0NWRkOA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YzRlM2IwOGMwNWNjN2RhOWJkYjNmYjgyMGU0YjgwMjE3NTU4NWViNDI2MDU2
|
10
|
+
NjY3Yzg3OTRiMzNhZTA3ZGJiY2UwNzg1YzNmMDcwMTk5NDQ1NmFmZTEwMDAx
|
11
|
+
NjU5Nzk5MDc0NDk0YTY1YTk2MzJmNDI1Y2MxMjA1YjE4M2EyMWE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NDZiNWMyOWQxMjUyZDk5ZWUwMWZlNjJjNDVhNmQ0OTk5NjdhY2FjMGIwMzBl
|
14
|
+
ZGEyNDg2MzBlOGZkYTkxNjM1MjBiNjk5Y2M0MDBkNDVmZDA3YzQyM2Q0NTk1
|
15
|
+
NjFlOThjNTNkNGM2YjgzOTE3MjQ1NjhjM2RjMzQzM2QxYzFjNTY=
|
data/CHANGELOG.markdown
ADDED
data/Gemfile
CHANGED
@@ -6,13 +6,12 @@ source "http://rubygems.org"
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
group :development do
|
9
|
-
gem "shoulda", "~> 3.5"
|
10
|
-
gem "rdoc", "~> 3.12"
|
11
|
-
gem "bundler", "~> 1.5"
|
12
|
-
gem "jeweler", "~> 2.0"
|
13
|
-
gem "
|
14
|
-
gem
|
9
|
+
# gem "shoulda", "~> 3.5"
|
10
|
+
# gem "rdoc", "~> 3.12"
|
11
|
+
# gem "bundler", "~> 1.5"
|
12
|
+
# gem "jeweler", "~> 2.0"
|
13
|
+
# gem "debugger", "~> 1.6"
|
14
|
+
gem 'fun_with_testing', '~> 0.0'
|
15
15
|
end
|
16
16
|
|
17
|
-
gem "
|
18
|
-
gem "fun_with_version_strings", "~> 0"
|
17
|
+
gem "fun_with_gems", "~> 0.0"
|
data/README.rdoc
CHANGED
@@ -46,6 +46,10 @@ To load your tasks, you'd run:
|
|
46
46
|
Task.loader_pattern_load_from_dir( "mylib/builtin/tasks" )
|
47
47
|
Task.loader_pattern_load_from_dir( "~/.config/mylib/tasks" )
|
48
48
|
Task.loader_pattern_load_from_dir( "~/project/tasks" )
|
49
|
+
|
50
|
+
or
|
51
|
+
|
52
|
+
Task.loader_pattern_load_from_dir( "mylib/builtin/tasks", "~/.config/mylib/tasks", "~/project/tasks" )
|
49
53
|
|
50
54
|
And to snag the backup.db task, you'd just say:
|
51
55
|
|
@@ -59,6 +63,8 @@ For each directory you give it, it will:
|
|
59
63
|
|
60
64
|
You can get some interesting behavior by overwriting individual methods. For example, loading individual configurations from YAML or JSON or XML. There's an example in the test/ folder.
|
61
65
|
|
66
|
+
Note: If you want to manage your own registry by redefining loader_pattern_load_from_dir( dir ), loader_pattern_register_item( item ), etc., make sure you handle and report exceptions.
|
67
|
+
|
62
68
|
|
63
69
|
|
64
70
|
== Reloadable ==
|
@@ -81,6 +87,58 @@ Easy as peasy. Note, it may be buggy if the file only contains part of the defi
|
|
81
87
|
|
82
88
|
|
83
89
|
|
90
|
+
== GetAndSet ==
|
91
|
+
|
92
|
+
When active, this module behaves a lot like #attr_accessor.
|
93
|
+
The difference is, only one method is defined. Whether you're
|
94
|
+
looking up the instance_variable's value or altering it depends
|
95
|
+
on whether you pass it an argument.
|
96
|
+
|
97
|
+
|
98
|
+
FunWith::Patterns::GetAndSet.activate
|
99
|
+
|
100
|
+
class A
|
101
|
+
get_and_set( :radio, :radius, :radium )
|
102
|
+
get_and_set( :radiate )
|
103
|
+
get_and_set_boolean( :stringy, :flurmish ) # unless changed (! called or @var set some other way), defaults to false (stringy! returns false, not_stringy! returns true)
|
104
|
+
end
|
105
|
+
|
106
|
+
a = A.new
|
107
|
+
|
108
|
+
a.radius( 3.14159 ) # ==> 3.14159
|
109
|
+
a.radius() # ==> 3.14159
|
110
|
+
|
111
|
+
a.radium() # ==> nil
|
112
|
+
a.radium( "radioactive" ) # ==> "radioactive"
|
113
|
+
a.radium( "Madame Curie") # ==> "Madame Curie"
|
114
|
+
a.radium() # ==> "Madame Curie"
|
115
|
+
|
116
|
+
a.stringy! # ==> true
|
117
|
+
a.stringy? # ==> true
|
118
|
+
a.not_stringy! # ==> false
|
119
|
+
a.stringy? # ==> false
|
120
|
+
|
121
|
+
a.flurmish? # ==> false # doesn't have a default, and hasn't had one of the !s run
|
122
|
+
a.not_flurmish? # ==> true # unfortunate implementation side-effect. Do not rely on it.
|
123
|
+
|
124
|
+
That's all you need to start using #get_and_set( :varname1, :varname2 )
|
125
|
+
|
126
|
+
If you want to make all objects more extensible, you can make
|
127
|
+
it available for all objects, not just classes and modules:
|
128
|
+
|
129
|
+
FunWith::Patterns::GetAndSet.activate( Object )
|
130
|
+
|
131
|
+
class A
|
132
|
+
end
|
133
|
+
|
134
|
+
a = A.new
|
135
|
+
|
136
|
+
a.get_and_set( :radiate )
|
137
|
+
a.get_and_set_boolean( :stringy? )
|
138
|
+
|
139
|
+
They work the same, but only apply to the object, not all objects of that class.
|
140
|
+
|
141
|
+
|
84
142
|
== Contributing to fun_with_patterns
|
85
143
|
|
86
144
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
data/Rakefile
CHANGED
@@ -22,7 +22,13 @@ Jeweler::Tasks.new do |gem|
|
|
22
22
|
gem.email = "keeputahweird@gmail.com"
|
23
23
|
gem.authors = ["Bryce Anderson"]
|
24
24
|
# dependencies defined in Gemfile
|
25
|
+
|
26
|
+
gem.files = Dir.glob( File.join( ".", "lib", "**", "*.rb" ) ) +
|
27
|
+
Dir.glob( File.join( ".", "test", "**", "*" ) ) +
|
28
|
+
%w( Gemfile Rakefile LICENSE.txt README.rdoc VERSION CHANGELOG.markdown )
|
29
|
+
|
25
30
|
end
|
31
|
+
|
26
32
|
Jeweler::RubygemsDotOrgTasks.new
|
27
33
|
|
28
34
|
require 'rake/testtask'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module FunWith
|
2
|
+
module Patterns
|
3
|
+
module GetAndSet
|
4
|
+
def get_and_set( *method_names )
|
5
|
+
for name in method_names
|
6
|
+
if self.is_a?(Class) || self.is_a?(Module)
|
7
|
+
eval "define_method( :#{name} ) do |*args|
|
8
|
+
self.instance_variable_set( :@#{name}, args.first ) if args.length == 1
|
9
|
+
self.instance_variable_get( :@#{name} )
|
10
|
+
end"
|
11
|
+
else
|
12
|
+
m = Module.new
|
13
|
+
m.get_and_set( *method_names )
|
14
|
+
self.extend( m )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Would also like to do a boolean version which creates
|
20
|
+
# .bool? .bool! and .not_bool!
|
21
|
+
|
22
|
+
def get_and_set_boolean( *method_names )
|
23
|
+
for name in method_names
|
24
|
+
if self.is_a?(Class) || self.is_a?(Module)
|
25
|
+
eval "define_method( :#{name}? ) do
|
26
|
+
self.instance_variable_get( :@#{name} ) || false
|
27
|
+
end
|
28
|
+
|
29
|
+
define_method( :not_#{name}? ) do
|
30
|
+
! self.#{name}?
|
31
|
+
end
|
32
|
+
|
33
|
+
define_method( :#{name}! ) do
|
34
|
+
self.instance_variable_set( :@#{name}, true )
|
35
|
+
end
|
36
|
+
|
37
|
+
define_method( :not_#{name}! ) do
|
38
|
+
self.instance_variable_set( :@#{name}, false )
|
39
|
+
end
|
40
|
+
"
|
41
|
+
else
|
42
|
+
m = Module.new
|
43
|
+
m.get_and_set_bool( *method_names )
|
44
|
+
self.extend( m )
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module FunWith
|
2
|
+
module Patterns
|
3
|
+
module GetAndSetAPI
|
4
|
+
def activate( classes_to_activate = [Class, Module] )
|
5
|
+
classes_to_activate = [classes_to_activate] unless classes_to_activate.is_a?(Array)
|
6
|
+
|
7
|
+
for klass in classes_to_activate
|
8
|
+
klass.send( :include, FunWith::Patterns::GetAndSet )
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module FunWith
|
2
|
+
module Patterns
|
3
|
+
module Hooks
|
4
|
+
def add_hook_before( method, &block )
|
5
|
+
hook_pattern_install_hooks_for_method( method )
|
6
|
+
end
|
7
|
+
|
8
|
+
def add_hook_after( method, &block )
|
9
|
+
hook_pattern_install_hooks_for_method( method )
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
def hook_pattern_hooks_installed_for_method?( method )
|
14
|
+
self.respond_to?( :"#{method}_method_without_hooks" )
|
15
|
+
end
|
16
|
+
|
17
|
+
def hook_pattern_install_hooks_for_method( method )
|
18
|
+
return false if hook_pattern_hooks_installed_for_method?( method )
|
19
|
+
|
20
|
+
alias :"#{method}_method_without_hooks" :"#{method}"
|
21
|
+
|
22
|
+
@hook_pattern_hooks ||= {}
|
23
|
+
@hook_pattern_hooks[method] ||= {}
|
24
|
+
@hook_pattern_hooks[method][:before] ||= []
|
25
|
+
@hook_pattern_hooks[method][:after] ||= []
|
26
|
+
|
27
|
+
|
28
|
+
# http://stackoverflow.com/questions/4470108/when-monkey-patching-a-method-can-you-call-the-overridden-method-from-the-new-i
|
29
|
+
old_method = instance_method(method)
|
30
|
+
|
31
|
+
# define_method(:bar) do
|
32
|
+
# old_bar.bind(self).() + ' World'
|
33
|
+
# end
|
34
|
+
|
35
|
+
define_method( method ) do |*args, &block|
|
36
|
+
self.hook_pattern_run( @hook_pattern_hooks[method][:before], *args, &block )
|
37
|
+
old_method.bind( self ).call( *args, &block )
|
38
|
+
self.hook_pattern_run( @hook_pattern_hooks[method][:after], *args, &block )
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def hook_pattern_run( hookset, *args, &block )
|
43
|
+
puts "running hookset"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -51,41 +51,113 @@ module FunWith
|
|
51
51
|
|
52
52
|
if self.loader_pattern_verbose
|
53
53
|
STDERR.puts( puts e.backtrace.map{|line| "\t\t#{line}"}.join("\n") )
|
54
|
-
STDERR.puts( "" )
|
54
|
+
STDERR.puts( "\n" )
|
55
55
|
end
|
56
56
|
|
57
57
|
nil
|
58
58
|
end
|
59
59
|
|
60
60
|
# Default, may want to override how the registry behaves.
|
61
|
-
|
61
|
+
# If you don't provide a key argument, then the object needs to
|
62
|
+
# respond to .loader_pattern_registry_key()
|
63
|
+
def loader_pattern_register_item( obj, key = nil )
|
62
64
|
return nil if obj.nil?
|
63
|
-
|
65
|
+
@loader_pattern_registry ||= {}
|
66
|
+
|
67
|
+
key = obj.loader_pattern_registry_key if key.nil?
|
68
|
+
|
69
|
+
if loader_pattern_is_item_registerable?( obj )
|
70
|
+
if @loader_pattern_warn_on_key_changes && loader_pattern_registry_lookup( key )
|
71
|
+
warn( "class #{self} is replacing lookup key #{key.inspect}" )
|
72
|
+
end
|
73
|
+
|
74
|
+
return @loader_pattern_registry[ key ] = obj
|
75
|
+
else
|
76
|
+
warn( "#{obj} is not an instance of a registerable class. Registerable classes: #{self.loader_pattern_only_register_classes.inspect}" )
|
77
|
+
return nil
|
78
|
+
end
|
64
79
|
end
|
65
80
|
|
66
81
|
def loader_pattern_registry_lookup( key )
|
82
|
+
@loader_pattern_registry ||= {}
|
67
83
|
@loader_pattern_registry[key]
|
68
84
|
end
|
69
85
|
|
86
|
+
def loader_pattern_registry
|
87
|
+
@loader_pattern_registry
|
88
|
+
end
|
89
|
+
|
90
|
+
def loader_pattern_only_register_classes( *args )
|
91
|
+
if args.length > 0
|
92
|
+
@loader_pattern_only_register_classes = args
|
93
|
+
end
|
94
|
+
|
95
|
+
@loader_pattern_only_register_classes || []
|
96
|
+
end
|
97
|
+
|
98
|
+
def loader_pattern_is_item_registerable?( item )
|
99
|
+
return true if loader_pattern_only_register_classes.fwf_blank?
|
100
|
+
|
101
|
+
for klass in @loader_pattern_only_register_classes
|
102
|
+
return true if item.is_a?( klass )
|
103
|
+
end
|
104
|
+
|
105
|
+
return false
|
106
|
+
end
|
107
|
+
|
70
108
|
|
71
109
|
# Assumes that every file in the directory and subdirectories contain ruby code that
|
72
110
|
# will yield an object that the loader is looking for. It also automatically
|
73
111
|
# adds the resulting object to a registry.
|
74
112
|
# You may want to override this if you're looking for different behavior.
|
75
|
-
def loader_pattern_load_from_dir(
|
76
|
-
dir
|
77
|
-
|
78
|
-
|
113
|
+
def loader_pattern_load_from_dir( *dirs )
|
114
|
+
for dir in dirs
|
115
|
+
dir = dir.fwf_filepath
|
116
|
+
@loader_pattern_directories ||= []
|
117
|
+
@loader_pattern_directories << dir
|
79
118
|
|
80
|
-
|
81
|
-
|
82
|
-
|
119
|
+
for file in dir.glob( "**", self.loader_pattern_extension )
|
120
|
+
obj = self.loader_pattern_load_item( file )
|
121
|
+
self.loader_pattern_register_item( obj ) if self.loader_pattern_is_item_registerable?( obj )
|
122
|
+
end
|
83
123
|
end
|
84
124
|
end
|
85
125
|
|
86
126
|
def loader_pattern_loaded_directories
|
87
127
|
@loader_pattern_directories ||= []
|
88
128
|
end
|
129
|
+
|
130
|
+
def loader_pattern_configure( *args )
|
131
|
+
for arg in args
|
132
|
+
case arg
|
133
|
+
when :bracketwise_lookup
|
134
|
+
self.class_eval do
|
135
|
+
def self.[]( key )
|
136
|
+
loader_pattern_registry_lookup( key )
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.[]=( key, val )
|
140
|
+
loader_pattern_register_item( val, key )
|
141
|
+
end
|
142
|
+
end
|
143
|
+
when :warn_on_key_changes
|
144
|
+
@loader_pattern_warn_on_key_changes = true
|
145
|
+
when :dont_warn_on_key_changes
|
146
|
+
@loader_pattern_warn_on_key_changes = false
|
147
|
+
when Hash
|
148
|
+
for key, val in arg
|
149
|
+
case key
|
150
|
+
when :key
|
151
|
+
self.class_eval do
|
152
|
+
eval( "alias :loader_pattern_registry_key #{val.inspect}" )
|
153
|
+
end
|
154
|
+
when :verbose
|
155
|
+
self.loader_pattern_verbose( val )
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
89
161
|
end
|
90
162
|
end
|
91
163
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
warn( "Something wrong with the Reloadable class. Flaky. Not recommended for use." )
|
2
|
+
module FunWith
|
3
|
+
module Patterns
|
4
|
+
# A bare-bones reloading system. Useful when the entire file defines exactly one
|
5
|
+
# class or module, with no dependencies or side-effects.
|
6
|
+
module Reloadable
|
7
|
+
def reload!
|
8
|
+
FunWith::Patterns::Reloadable.reload_class( self )
|
9
|
+
end
|
10
|
+
|
11
|
+
def reloader_filepath
|
12
|
+
@reloader_filepath
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module MakeInstancesReloadable
|
17
|
+
def reloadable!
|
18
|
+
self.extend( FunWith::Patterns::Reloadable )
|
19
|
+
kaller = caller.first.gsub(/:\d+:in.*/, '')
|
20
|
+
@reloader_filepath = kaller.fwf_filepath.expand
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module ClassReloaderMethod
|
25
|
+
def reload_class( klass )
|
26
|
+
if file = klass.reloader_filepath
|
27
|
+
Object.send( :remove_const, klass.name.to_sym )
|
28
|
+
file.load
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/fun_with_patterns.rb
CHANGED
@@ -1,16 +1,10 @@
|
|
1
|
-
require '
|
2
|
-
require 'fun_with_version_strings'
|
1
|
+
require 'fun_with_gems'
|
3
2
|
|
4
|
-
|
5
|
-
module Patterns
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
FunWith::Files::RootPath.rootify( FunWith::Patterns, __FILE__.fwf_filepath.dirname.up )
|
10
|
-
FunWith::VersionStrings.version( FunWith::Patterns )
|
11
|
-
|
12
|
-
FunWith::Patterns.root("lib", "fun_with").requir
|
3
|
+
FunWith::Gems.make_gem_fun( "FunWith::Patterns" )
|
13
4
|
|
14
5
|
Class.send( :include, FunWith::Patterns::MakeInstancesReloadable )
|
15
6
|
Module.send( :include, FunWith::Patterns::MakeInstancesReloadable )
|
16
|
-
FunWith::Patterns::Reloadable.extend( FunWith::Patterns::ClassReloaderMethod )
|
7
|
+
FunWith::Patterns::Reloadable.extend( FunWith::Patterns::ClassReloaderMethod )
|
8
|
+
|
9
|
+
# Activate Object#get_and_set / Module#get_and_set by calling GetAndSet.activate
|
10
|
+
FunWith::Patterns::GetAndSet.extend( FunWith::Patterns::GetAndSetAPI )
|
data/test/helper.rb
CHANGED
@@ -1,31 +1,32 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler'
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
require 'test/unit'
|
15
|
-
require 'shoulda'
|
1
|
+
# require 'rubygems'
|
2
|
+
# require 'bundler'
|
3
|
+
#
|
4
|
+
# begin
|
5
|
+
# Bundler.setup(:default, :development)
|
6
|
+
# rescue Bundler::BundlerError => e
|
7
|
+
# $stderr.puts e.message
|
8
|
+
# $stderr.puts "Run `bundle install` to install missing gems"
|
9
|
+
# exit e.status_code
|
10
|
+
# end
|
11
|
+
|
12
|
+
# require 'test/unit'
|
13
|
+
# require 'shoulda'
|
16
14
|
|
17
15
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
18
16
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
19
17
|
|
18
|
+
require 'fun_with_testing'
|
20
19
|
require 'fun_with_patterns'
|
21
20
|
|
22
21
|
require_relative 'user'
|
23
22
|
require_relative 'yaml_obj'
|
24
23
|
|
25
24
|
|
26
|
-
class Test::Unit::TestCase
|
27
|
-
end
|
25
|
+
# class Test::Unit::TestCase
|
26
|
+
# end
|
28
27
|
|
29
|
-
class FunWith::Patterns::TestCase <
|
28
|
+
class FunWith::Patterns::TestCase < FunWith::Testing::TestCase
|
29
|
+
self.gem_to_test = FunWith::Patterns
|
30
|
+
|
30
31
|
include FunWith::Testing::Assertions::Basics
|
31
32
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
FunWith::Patterns::GetAndSet.activate
|
4
|
+
|
5
|
+
class TestGetAndSet < FunWith::Patterns::TestCase
|
6
|
+
context "basics" do
|
7
|
+
should "be plumbed correctly" do
|
8
|
+
assert FunWith::Patterns::GetAndSet.respond_to?(:activate), "API not installed properly"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "trial run" do
|
13
|
+
should "get and set" do
|
14
|
+
c = Class.new
|
15
|
+
c.get_and_set( :radio, :radius, :radium )
|
16
|
+
c.get_and_set( :radiate )
|
17
|
+
c.get_and_set_boolean( :stringy, :flurmish )
|
18
|
+
|
19
|
+
o = c.new
|
20
|
+
|
21
|
+
pi = 3.14159
|
22
|
+
|
23
|
+
assert_nil o.radius
|
24
|
+
assert_equal pi, o.radius( pi ) # ==> 3.14159
|
25
|
+
assert_equal pi, o.radius() # ==> 3.14159
|
26
|
+
assert_nil o.radium() # ==> nil
|
27
|
+
|
28
|
+
v1 = "radioactive"
|
29
|
+
v2 = "Madame Curie"
|
30
|
+
|
31
|
+
assert_equal v1, o.radium( v1 ) # ==> "radioactive"
|
32
|
+
assert_equal v2, o.radium( v2 ) # ==> "Madame Curie"
|
33
|
+
assert_equal v2, o.radium() # ==> "Madame Curie"
|
34
|
+
|
35
|
+
assert_false o.stringy?
|
36
|
+
o.stringy!
|
37
|
+
assert_true o.stringy?
|
38
|
+
assert_false o.not_stringy!
|
39
|
+
assert_true !o.stringy?
|
40
|
+
|
41
|
+
assert_false o.flurmish?
|
42
|
+
assert_true o.not_flurmish?
|
43
|
+
end
|
44
|
+
|
45
|
+
should "get and set 2 : module boogaloo" do
|
46
|
+
m = Module.new
|
47
|
+
c = Class.new
|
48
|
+
|
49
|
+
c.send( :include, m )
|
50
|
+
|
51
|
+
m.get_and_set( :radio, :radius, :radium )
|
52
|
+
m.get_and_set( :radiate )
|
53
|
+
|
54
|
+
o = c.new
|
55
|
+
|
56
|
+
assert_respond_to( o, :radio )
|
57
|
+
assert_respond_to( o, :radius )
|
58
|
+
assert_respond_to( o, :radium )
|
59
|
+
assert_respond_to( o, :radiate )
|
60
|
+
|
61
|
+
|
62
|
+
pi = 3.14159
|
63
|
+
|
64
|
+
assert_nil o.radius
|
65
|
+
assert_equal pi, o.radius( pi ) # ==> 3.14159
|
66
|
+
assert_equal pi, o.radius() # ==> 3.14159
|
67
|
+
assert_nil o.radium() # ==> nil
|
68
|
+
|
69
|
+
v1 = "radioactive"
|
70
|
+
v2 = "Madame Curie"
|
71
|
+
|
72
|
+
assert_equal v1, o.radium( v1 ) # ==> "radioactive"
|
73
|
+
assert_equal v2, o.radium( v2 ) # ==> "Madame Curie"
|
74
|
+
assert_equal v2, o.radium() # ==> "Madame Curie"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/test/test_hooks.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestHooksPattern < FunWith::Patterns::TestCase
|
4
|
+
_context "first try" do
|
5
|
+
should "set up a class with hooks" do
|
6
|
+
class A
|
7
|
+
include FunWith::Patterns::Hooks
|
8
|
+
|
9
|
+
def called_x_times()
|
10
|
+
@called_x_times ||= 0
|
11
|
+
@called_x_times
|
12
|
+
end
|
13
|
+
|
14
|
+
add_hook_before( :called_x_times ) do
|
15
|
+
@called_x_times ||= 0
|
16
|
+
@called_x_times += 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
a = A.new
|
21
|
+
|
22
|
+
assert_one( a.called_x_times() )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/test/test_loader_pattern.rb
CHANGED
@@ -12,6 +12,7 @@ class TestLoaderPattern < FunWith::Patterns::TestCase
|
|
12
12
|
context "testing User" do
|
13
13
|
setup do
|
14
14
|
User.loader_pattern_load_from_dir( FunWith::Patterns.root( "test", "users" ) )
|
15
|
+
User2.loader_pattern_load_from_dir( FunWith::Patterns.root( "test", "users" ) )
|
15
16
|
end
|
16
17
|
|
17
18
|
should "have all the right methods" do
|
@@ -19,7 +20,8 @@ class TestLoaderPattern < FunWith::Patterns::TestCase
|
|
19
20
|
:loader_pattern_verbose,
|
20
21
|
:loader_pattern_load_item,
|
21
22
|
:loader_pattern_register_item,
|
22
|
-
:loader_pattern_load_from_dir
|
23
|
+
:loader_pattern_load_from_dir,
|
24
|
+
:loader_pattern_configure ]
|
23
25
|
assert_respond_to( User, method )
|
24
26
|
end
|
25
27
|
end
|
@@ -28,6 +30,16 @@ class TestLoaderPattern < FunWith::Patterns::TestCase
|
|
28
30
|
assert User.loader_pattern_registry_lookup("Gary Milhouse")
|
29
31
|
assert_equal 54, User.loader_pattern_registry_lookup("Gary Milhouse").age
|
30
32
|
end
|
33
|
+
|
34
|
+
should "lookup via brackets" do
|
35
|
+
User.loader_pattern_configure( :bracketwise_lookup )
|
36
|
+
assert_equal 54, User["Gary Milhouse"].age
|
37
|
+
|
38
|
+
# User2 class is already configured for bracketwise lookup
|
39
|
+
m = User2["Gary Milhouse"]
|
40
|
+
assert_kind_of( User, m )
|
41
|
+
assert_equal 54, m.age
|
42
|
+
end
|
31
43
|
end
|
32
44
|
|
33
45
|
context "testing YamlObj (non-standard loader)" do
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestReloadablePattern < FunWith::Patterns::TestCase
|
4
|
+
context "testing basics" do
|
5
|
+
setup do
|
6
|
+
Class.send( :include, FunWith::Patterns::Reloadable )
|
7
|
+
assert_has_instance_method( Class, :reload! )
|
8
|
+
assert_has_instance_method( Class, :reloadable! )
|
9
|
+
|
10
|
+
assert_respond_to( Object, :reload!)
|
11
|
+
assert_respond_to( Object, :reloadable!)
|
12
|
+
end
|
13
|
+
|
14
|
+
should "reload MyReloadable" do
|
15
|
+
refute defined?(MyReloadable)
|
16
|
+
FunWith::Patterns.root( "test", "reloadable", "my_reloadable.rb" ).requir
|
17
|
+
assert defined?(MyReloadable)
|
18
|
+
assert_respond_to( MyReloadable.new, :square )
|
19
|
+
|
20
|
+
MyReloadable.class_eval do
|
21
|
+
remove_method :square
|
22
|
+
end
|
23
|
+
|
24
|
+
refute_respond_to( MyReloadable.new, :square )
|
25
|
+
|
26
|
+
MyReloadable.reload!
|
27
|
+
|
28
|
+
assert defined?(MyReloadable)
|
29
|
+
|
30
|
+
assert_respond_to( MyReloadable.new, :square )
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/test/user.rb
CHANGED
@@ -11,3 +11,15 @@ class User
|
|
11
11
|
# For User, name will be used to look up the item in the registry.
|
12
12
|
alias :loader_pattern_registry_key :name
|
13
13
|
end
|
14
|
+
|
15
|
+
class User2
|
16
|
+
attr_accessor :name, :age
|
17
|
+
|
18
|
+
include FunWith::Patterns::Loader
|
19
|
+
loader_pattern_configure( :bracketwise_lookup, {:key => :name} )
|
20
|
+
|
21
|
+
def initialize( name, age )
|
22
|
+
@name = name
|
23
|
+
@age = age
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,127 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fun_with_patterns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryce Anderson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: fun_with_gems
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '0.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '0.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: shoulda
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ~>
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '3.5'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '3.5'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rdoc
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '3.12'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ~>
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '3.12'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: bundler
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ~>
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1.5'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ~>
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1.5'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: jeweler
|
28
|
+
name: fun_with_testing
|
85
29
|
requirement: !ruby/object:Gem::Requirement
|
86
30
|
requirements:
|
87
31
|
- - ~>
|
88
32
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
33
|
+
version: '0.0'
|
90
34
|
type: :development
|
91
35
|
prerelease: false
|
92
36
|
version_requirements: !ruby/object:Gem::Requirement
|
93
37
|
requirements:
|
94
38
|
- - ~>
|
95
39
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: fun_with_testing
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ! '>='
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ! '>='
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: debugger
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ! '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ! '>='
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
40
|
+
version: '0.0'
|
125
41
|
description: A collection of useful patterns
|
126
42
|
email: keeputahweird@gmail.com
|
127
43
|
executables: []
|
@@ -130,25 +46,33 @@ extra_rdoc_files:
|
|
130
46
|
- LICENSE.txt
|
131
47
|
- README.rdoc
|
132
48
|
files:
|
133
|
-
- .
|
49
|
+
- ./lib/fun_with/patterns/get_and_set.rb
|
50
|
+
- ./lib/fun_with/patterns/get_and_set_api.rb
|
51
|
+
- ./lib/fun_with/patterns/hooks.rb
|
52
|
+
- ./lib/fun_with/patterns/loader.rb
|
53
|
+
- ./lib/fun_with/patterns/reloadable.rb
|
54
|
+
- ./lib/fun_with_patterns.rb
|
55
|
+
- ./test/helper.rb
|
56
|
+
- ./test/reloadable/my_reloadable.rb
|
57
|
+
- ./test/test_get_and_set.rb
|
58
|
+
- ./test/test_hooks.rb
|
59
|
+
- ./test/test_loader_pattern.rb
|
60
|
+
- ./test/test_reloadable_pattern.rb
|
61
|
+
- ./test/user.rb
|
62
|
+
- ./test/users/mary.rb
|
63
|
+
- ./test/users/more/gary.rb
|
64
|
+
- ./test/users/steve.rb
|
65
|
+
- ./test/users/wanda.rb
|
66
|
+
- ./test/yaml_obj.rb
|
67
|
+
- ./test/yamls/mike/mike_amazon.yaml
|
68
|
+
- ./test/yamls/mike/mike_gmail.yaml
|
69
|
+
- ./test/yamls/steve/steve_instagram.yaml
|
70
|
+
- CHANGELOG.markdown
|
134
71
|
- Gemfile
|
135
72
|
- LICENSE.txt
|
136
73
|
- README.rdoc
|
137
74
|
- Rakefile
|
138
75
|
- VERSION
|
139
|
-
- lib/fun_with/patterns/loader.rb
|
140
|
-
- lib/fun_with_patterns.rb
|
141
|
-
- test/helper.rb
|
142
|
-
- test/test_loader_pattern.rb
|
143
|
-
- test/user.rb
|
144
|
-
- test/users/mary.rb
|
145
|
-
- test/users/more/gary.rb
|
146
|
-
- test/users/steve.rb
|
147
|
-
- test/users/wanda.rb
|
148
|
-
- test/yaml_obj.rb
|
149
|
-
- test/yamls/mike/mike_amazon.yaml
|
150
|
-
- test/yamls/mike/mike_gmail.yaml
|
151
|
-
- test/yamls/steve/steve_instagram.yaml
|
152
76
|
homepage: http://github.com/darthschmoo/fun_with_patterns
|
153
77
|
licenses:
|
154
78
|
- MIT
|