block_party 0.1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7082052cc6fb6dc34fc13315b87ce26e149f88d6
4
+ data.tar.gz: 8c4c0c8c5132bfa444d517860307694b7eec0be8
5
+ SHA512:
6
+ metadata.gz: 7ec8721d21b5613f64f80a9a789815d496ccd4fea2ee44c0914fca24040fa003385326b148d695db9e9eb4ed074e5242f4ffae11b48f7747515753f3afdb4a27
7
+ data.tar.gz: 0f901fd3cd122ce3ea62a48b6c1cb7193044d28e084fbba3b9bd52bc4d59b4ead10fbfe830758a1036d263c83c7fc7929b605848b53d74b25a018f86bf9a2e76
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/reports
17
+ test/version_tmp
18
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'pry'
6
+ gem 'pry-debugger'
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Christopher Keele
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # BlockParty
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'block_party'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install block_party
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'test'
6
+ t.test_files = Dir['test/**/*_test.rb']
7
+ end
8
+ task default: :test
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'block_party/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "block_party"
8
+ spec.version = BlockParty::VERSION
9
+ spec.authors = ["Christopher Keele"]
10
+ spec.email = ["dev@chriskeele.com"]
11
+ spec.summary = "block_party-#{BlockParty::VERSION}"
12
+ spec.description = "Make any object configurable; quickly, cleanly, easily."
13
+ spec.homepage = "http://github.com/christhekeele/block_party"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(/^test\//)
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake", "> 10.0"
23
+ spec.add_development_dependency "minitest", "> 5.0"
24
+ spec.add_development_dependency "simplecov", "> 0.7"
25
+ end
@@ -0,0 +1,43 @@
1
+ require "block_party/configuration"
2
+ require "block_party/configurable"
3
+
4
+ module BlockParty
5
+ include Configurable
6
+ configure_with Class.new(BlockParty::Configuration)
7
+ once_configured do
8
+ if self.configuration.global
9
+ Object.const_set 'Configurable', BlockParty::Configurable
10
+ Object.const_set 'Configuration', BlockParty::Configuration
11
+ end
12
+ BlockParty::Configurable.configure do |config|
13
+ defaults = [
14
+ :default_configuration_accessor,
15
+ :default_configuration_callbacks,
16
+ :default_initial_configuration_callbacks,
17
+ :default_configuration_class
18
+ ]
19
+ defaults.each do |default|
20
+ config.send :"#{default}=", BlockParty.configuration.send(default)
21
+ end
22
+ end
23
+ end
24
+ def self.new
25
+ self.configuration.default_configuration_class.new
26
+ end
27
+ end
28
+
29
+ BlockParty.configure do |config|
30
+ config.global = true
31
+ config.default_configuration_accessor = :configuration
32
+ config.default_configuration_callbacks = []
33
+ config.default_initial_configuration_callbacks = []
34
+ config.default_configuration_class = BlockParty::Configuration
35
+ end
36
+
37
+ require 'block_party/extensions/rails/railtie' if defined?(Rails)
38
+ if defined?(ActiveRecord)
39
+ require 'block_party/extensions/rails/active_record'
40
+ ::ActiveRecord::Base.extend BlockParty::Rails::ActiveRecord
41
+ end
42
+
43
+ require "block_party/version"
@@ -0,0 +1,101 @@
1
+ require "block_party/configuration"
2
+
3
+ module BlockParty
4
+ module Configurable
5
+
6
+ def self.inheritable_settings
7
+ [
8
+ :__configuration_class__,
9
+ :__configuration_callbacks__,
10
+ :__initial_configuration_callbacks__
11
+ ]
12
+ end
13
+
14
+ def self.included(base)
15
+ class << base
16
+ accessor = Configurable.configuration.default_configuration_accessor
17
+ unless method_defined? accessor
18
+ attr_accessor accessor
19
+ end
20
+ attr_accessor *Configurable.inheritable_settings
21
+ end
22
+ base.instance_variable_set :@__configuration_class__,
23
+ Configurable.configuration.default_configuration_class
24
+ base.instance_variable_set :@__configuration_callbacks__,
25
+ Configurable.configuration.default_configuration_callbacks
26
+ base.instance_variable_set :@__initial_configuration_callbacks__,
27
+ Configurable.configuration.default_initial_configuration_callbacks
28
+ base.extend ConfigurationMethods
29
+ end
30
+
31
+ def self.extended(base)
32
+ included(base)
33
+ end
34
+
35
+ module ConfigurationMethods
36
+ def configure
37
+ accessor = Configurable.configuration.default_configuration_accessor
38
+ configuration = send(accessor)
39
+ initial_configuration = !configuration
40
+
41
+ if initial_configuration
42
+ configuration = send(:"#{accessor}=", self.__configuration_class__.new)
43
+ end
44
+
45
+ yield(configuration) if block_given?
46
+
47
+ if initial_configuration
48
+ self.__initial_configuration_callbacks__.each do |callback|
49
+ self.class_eval &callback
50
+ end
51
+ end
52
+
53
+ self.__configuration_callbacks__.each do |callback|
54
+ self.class_eval &callback
55
+ end
56
+
57
+ configuration
58
+ end
59
+
60
+ def configure_with(klass)
61
+ self.__configuration_class__ = klass
62
+ end
63
+
64
+ def after_configuration(&block)
65
+ self.__configuration_callbacks__ += [block] if block_given?
66
+ end
67
+
68
+ def once_configured(&block)
69
+ self.__initial_configuration_callbacks__ += [block] if block_given?
70
+ end
71
+
72
+ def inherited(base)
73
+ Configurable.inheritable_settings.each do |setting|
74
+ base.instance_variable_set :"@#{setting}", send(setting)
75
+ end
76
+ super
77
+ end
78
+ end
79
+
80
+ ####
81
+ # An example of what using configurations would be like without `Configurable`
82
+ # since `Configurable` is configurable.
83
+ ##
84
+ class << self
85
+ attr_accessor :configuration
86
+ attr_accessor *Configurable.inheritable_settings
87
+ end
88
+ self.instance_variable_set :@__configuration_class__,
89
+ BlockParty::Configuration
90
+ self.instance_variable_set :@__configuration_callbacks__, []
91
+ self.instance_variable_set :@__initial_configuration_callbacks__, []
92
+
93
+ self.instance_variable_set :@configuration,
94
+ Class.new(BlockParty::Configuration).new
95
+ self.configuration.default_configuration_accessor = :configuration
96
+ self.configuration.default_configuration_class = BlockParty::Configuration
97
+ self.configuration.default_configuration_callbacks = []
98
+ self.configuration.default_initial_configuration_callbacks = []
99
+ extend ConfigurationMethods
100
+ end
101
+ end
@@ -0,0 +1,111 @@
1
+ require 'block_party/configuration/conversion'
2
+ require 'block_party/configuration/identity'
3
+ require 'block_party/configuration/comparison'
4
+ require 'block_party/configuration/enumeration'
5
+
6
+ module BlockParty
7
+ class Configuration
8
+
9
+ ####
10
+ # INTERFACE
11
+ ##
12
+ def configure
13
+ yield(self) if block_given?
14
+ self
15
+ end
16
+
17
+ def method_missing(setting, *args, &block)
18
+ setter, getter = derive_setting_names(setting)
19
+ create_accessors setter, getter
20
+ if setter? setting
21
+ set setter, *args, &block
22
+ else
23
+ set_nested_configuration setter, *args, &block
24
+ end
25
+ end
26
+
27
+
28
+ def instance_variables
29
+ super.reject do |var|
30
+ [:"@__hash_representation__", :"@__hash_representation__="].include? var
31
+ end
32
+ end
33
+
34
+ def settings
35
+ instance_variables.map do |var|
36
+ var.to_s.gsub('@', '').to_sym
37
+ end
38
+ end
39
+
40
+ def unset(setting)
41
+ setting = setting.to_sym
42
+ setting = :"@#{setting}" unless setting.to_s =~ /^@/
43
+ remove_instance_variable setting
44
+ end
45
+
46
+ protected
47
+
48
+ ####
49
+ # IMPLEMENTATION
50
+ ##
51
+ def derive_setting_names(setting_name)
52
+ if setter? setting_name
53
+ [ setting_name, setter_to_getter(setting_name) ]
54
+ else
55
+ [ getter_to_setter(setting_name), setting_name ]
56
+ end
57
+ end
58
+
59
+ def setter?(setting)
60
+ setting =~ /=$/
61
+ end
62
+
63
+ def create_accessors(setter, getter)
64
+ create_setter(setter)
65
+ create_getter(getter)
66
+ end
67
+
68
+ def create_setter(setter)
69
+ define_singleton_method setter do |value|
70
+ instance_variable_set :"@#{setter_to_getter(setter)}", value
71
+ end
72
+ end
73
+
74
+ def create_getter(getter)
75
+ define_singleton_method getter do
76
+ instance_variable_get :"@#{getter}"
77
+ end
78
+ end
79
+
80
+ def setter_to_getter(setter)
81
+ :"#{setter.to_s.gsub('=','')}"
82
+ end
83
+
84
+ def getter_to_setter(getter)
85
+ :"#{getter}="
86
+ end
87
+
88
+ def set(setter, *args, &block)
89
+ if block_given?
90
+ send setter, *args, &block
91
+ else
92
+ send setter, *args
93
+ end
94
+ end
95
+
96
+ def set_nested_configuration(setter, *args, &block)
97
+ configuration = send setter, Configuration.new
98
+ yield(configuration) if block_given?
99
+ configuration
100
+ end
101
+
102
+ ####
103
+ # COMPONENTS
104
+ ##
105
+ include Identity
106
+ include Conversion
107
+ include Comparison
108
+ include Enumeration
109
+
110
+ end
111
+ end
@@ -0,0 +1,33 @@
1
+ require "block_party/configuration"
2
+ require 'block_party/configuration/conversion'
3
+
4
+ module BlockParty
5
+ class Configuration
6
+ module Comparison
7
+
8
+ # Compare values only, class doesn't matter
9
+ def == other
10
+ if other.respond_to?(:to_hash)
11
+ to_hash == other.to_hash
12
+ end
13
+ end
14
+
15
+ # Compare values only, class matters
16
+ def eql?(other)
17
+ if other.respond_to?(:to_hash)
18
+ as_hash == other.to_hash
19
+ end
20
+ end
21
+
22
+ # Compare classes or instances for case statements
23
+ def === other
24
+ unless other.is_a? Class
25
+ to_hash(false) == other.to_hash if other.respond_to? :to_hash
26
+ else
27
+ super
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,97 @@
1
+ require "block_party/configuration"
2
+ require "block_party/extensions/hash"
3
+
4
+ module BlockParty
5
+ class Configuration
6
+ module Conversion
7
+
8
+ def self.included(base)
9
+ base.extend ClassMethods
10
+ end
11
+
12
+ module ClassMethods
13
+
14
+ def from_hash(source={})
15
+ initialize_from_hash source
16
+ end
17
+ alias_method :[], :from_hash
18
+
19
+ def load(source)
20
+ initialize_from_hash (JSON.load(source) or {})
21
+ end
22
+
23
+ def dump(configuration)
24
+ configuration.dump if configuration
25
+ end
26
+
27
+ protected
28
+
29
+ def initialize_from_hash(source)
30
+ klass = if klass_name = source.delete(:__configuration_class__)
31
+ Object.const_get klass_name
32
+ else; self; end
33
+
34
+ klass.new.load_hash source
35
+ end
36
+
37
+ end
38
+
39
+ def load_hash(source={})
40
+ source.each do |key, value|
41
+ if value.is_a? Hash
42
+ send :"#{key}=", self.class.from_hash(value)
43
+ else
44
+ send :"#{key}=", value
45
+ end
46
+ end
47
+ self
48
+ end
49
+
50
+ def to_hash
51
+ hash_representation.keep_if do |key|
52
+ settings.include? key
53
+ end
54
+ end
55
+
56
+ def dump
57
+ to_hash.to_json.to_s
58
+ end
59
+
60
+ def to_s
61
+ to_hash.inspect.to_s
62
+ end
63
+
64
+ # protected
65
+
66
+ def as_hash
67
+ @__hash_representation__ ||= hash_representation
68
+ end
69
+
70
+ def hash_representation
71
+ unless empty?
72
+ Hash[
73
+ instance_variables.map do |instance_variable_name|
74
+ key = instance_variable_name.to_s.gsub('@', '').to_sym
75
+ value = instance_variable_get(instance_variable_name)
76
+ value = value.hash_representation if value.is_a?(Configuration)
77
+ [key, value]
78
+ end
79
+ ]
80
+ else
81
+ {}
82
+ end
83
+ end
84
+
85
+ def invalidate_hash_representation!
86
+ @__hash_representation__ = nil
87
+ end
88
+
89
+ def create_setter(setter)
90
+ define_singleton_method setter do |value|
91
+ invalidate_hash_representation!
92
+ instance_variable_set :"@#{setter_to_getter(setter)}", value
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,15 @@
1
+ require "block_party/configuration"
2
+ require 'block_party/configuration/conversion'
3
+
4
+ module BlockParty
5
+ class Configuration
6
+ module Enumeration
7
+
8
+ include Enumerable
9
+ def each(*args, &block)
10
+ to_hash.each(*args, &block)
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ require "block_party/configuration"
2
+ require 'block_party/configuration/conversion'
3
+
4
+ module BlockParty
5
+ class Configuration
6
+ module Identity
7
+
8
+ def hash
9
+ as_hash.hash
10
+ end
11
+
12
+ def empty?
13
+ instance_variables.empty?
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ require 'block_party/configuration'
2
+
3
+ class Hash
4
+
5
+ def self.from_config(configuration, keep_classes=false)
6
+ configuration.to_hash keep_classes
7
+ end
8
+
9
+ def to_config(keep_classes=true)
10
+ BlockParty::Configuration.from_hash self, keep_classes
11
+ end
12
+
13
+ end
@@ -0,0 +1,6 @@
1
+ module BlockParty
2
+ module Rails
3
+ module ActiveRecord
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module BlockParty
2
+ module Rails
3
+ class Railtie < ::Rails::Railtie
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ module BlockParty
2
+ VERSION = "0.1.0.1"
3
+ end
@@ -0,0 +1,221 @@
1
+ require 'test_helper'
2
+
3
+ class ConfigurableTest < MiniTest::Test
4
+ def setup
5
+ @configurable = Class.new{ include Configurable }
6
+ end
7
+
8
+ ####
9
+ # Configure Method
10
+ ##
11
+ def test_nonconfigured_classes_have_no_configuration
12
+ assert_nil @configurable.configuration
13
+ end
14
+ def test_configured_classes_have_a_configuration
15
+ @configurable.configure
16
+ assert @configurable.configuration
17
+ end
18
+ def test_configured_classes_instanciate_configurations
19
+ @configurable.configure
20
+ assert_instance_of Configuration, @configurable.configuration
21
+ end
22
+ def test_configuration_blocks_are_consumed
23
+ @configurable.configure do |config|
24
+ config.is_set = true
25
+ end
26
+ assert @configurable.configuration.is_set
27
+ end
28
+ def test_inherited_classes_dont_preserve_configurations
29
+ @configurable.configure
30
+ inherited = Class.new(@configurable)
31
+ refute_equal @configurable.configuration, inherited.configuration
32
+ end
33
+
34
+ ####
35
+ # Configuration Class
36
+ ##
37
+ def test_config_class_defaults_to_Configuration
38
+ assert_equal Configuration, @configurable.__configuration_class__
39
+ end
40
+ def test_configure_with_sets_custom_configuration_classes
41
+ @configurable.configure_with BasicObject
42
+ assert_equal BasicObject, @configurable.__configuration_class__
43
+ end
44
+ def test_inherited_classes_preserve_configuration_class
45
+ @configurable.configure_with BasicObject
46
+ inherited = Class.new(@configurable)
47
+ assert_equal BasicObject, inherited.__configuration_class__
48
+ end
49
+
50
+
51
+ ####
52
+ # Configuration Callbacks
53
+ ##
54
+ def test_callbacks_run_more_than_once_per_configuring
55
+ class << @configurable
56
+ attr_accessor :times_ran
57
+ end
58
+ @configurable.after_configuration do
59
+ self.times_ran ||= 0
60
+ self.times_ran += 1
61
+ end
62
+ @configurable.configure
63
+ @configurable.configure
64
+ assert_equal 2, @configurable.times_ran
65
+ end
66
+ # Then run the normal callback gauntlet
67
+ def test_callbacks_default_to_none
68
+ assert_empty @configurable.__configuration_callbacks__
69
+ end
70
+ def test_after_configuration_sets_a_callback
71
+ @configurable.after_configuration {}
72
+ refute_empty @configurable.__configuration_callbacks__
73
+ end
74
+ def test_after_configuration_only_adds_blocks_to_callbacks
75
+ @configurable.after_configuration
76
+ assert_empty @configurable.__configuration_callbacks__
77
+ end
78
+ def test_after_configuration_sets_a_callback_proc
79
+ @configurable.after_configuration {}
80
+ assert_instance_of Proc, @configurable.__configuration_callbacks__.first
81
+ end
82
+ def test_callbacks_get_run
83
+ @configurable.after_configuration do
84
+ self.configuration.ran = true
85
+ end
86
+ @configurable.configure
87
+ assert @configurable.configuration.ran
88
+ end
89
+ def test_multiple_callbacks_get_run_in_context_of_their_class
90
+ @configurable.after_configuration do
91
+ self.configuration.ran_in_class = name
92
+ end
93
+ @configurable.configure
94
+ assert_equal @configurable.name, @configurable.configuration.ran_in_class
95
+ end
96
+ def test_multiple_callbacks_get_set
97
+ @configurable.after_configuration {}
98
+ @configurable.after_configuration {}
99
+ assert_equal 2, @configurable.__configuration_callbacks__.length
100
+ end
101
+ def test_multiple_callbacks_get_run
102
+ @configurable.after_configuration do
103
+ self.configuration.first_ran = true
104
+ end
105
+ @configurable.after_configuration do
106
+ self.configuration.second_ran = true
107
+ end
108
+ @configurable.configure
109
+ assert @configurable.configuration.first_ran
110
+ assert @configurable.configuration.second_ran
111
+ end
112
+ def test_multiple_callbacks_get_run_in_order
113
+ @configurable.after_configuration do
114
+ self.configuration.run = 1
115
+ end
116
+ @configurable.after_configuration do
117
+ self.configuration.run = 2
118
+ end
119
+ @configurable.configure
120
+ assert_equal 2, @configurable.configuration.run
121
+ end
122
+ def test_inherited_classes_preserve_callbacks
123
+ @configurable.after_configuration do
124
+ define_singleton_method(:callback) { true }
125
+ end
126
+ inherited = Class.new(@configurable)
127
+ inherited.configure
128
+ assert inherited.callback
129
+ end
130
+ def test_inherited_classes_dont_add_to_parent_callbacks
131
+ inherited = Class.new(@configurable)
132
+ inherited.after_configuration {}
133
+ assert_empty @configurable.__configuration_callbacks__
134
+ end
135
+
136
+ ####
137
+ # Initial Configuration Callbacks
138
+ ##
139
+ def test_inital_callbacks_only_run_once_per_configuring
140
+ class << @configurable
141
+ attr_accessor :times_ran
142
+ end
143
+ @configurable.once_configured do
144
+ self.times_ran ||= 0
145
+ self.times_ran += 1
146
+ end
147
+ @configurable.configure
148
+ @configurable.configure
149
+ assert_equal 1, @configurable.times_ran
150
+ end
151
+ # Then run the normal callback gauntlet
152
+ def test_initial_callbacks_default_to_none
153
+ assert_empty @configurable.__initial_configuration_callbacks__
154
+ end
155
+ def test_after_configuration_sets_a_initial_callback
156
+ @configurable.once_configured {}
157
+ refute_empty @configurable.__initial_configuration_callbacks__
158
+ end
159
+ def test_once_configured_only_adds_blocks_to_initial_callbacks
160
+ @configurable.once_configured
161
+ assert_empty @configurable.__initial_configuration_callbacks__
162
+ end
163
+ def test_once_configured_sets_a_initial_callback_proc
164
+ @configurable.once_configured {}
165
+ assert_instance_of Proc, @configurable.__initial_configuration_callbacks__.first
166
+ end
167
+ def test_initial_callbacks_get_run
168
+ @configurable.once_configured do
169
+ self.configuration.ran = true
170
+ end
171
+ @configurable.configure
172
+ assert @configurable.configuration.ran
173
+ end
174
+ def test_initial_callbacks_get_run_in_context_of_their_class
175
+ @configurable.once_configured do
176
+ self.configuration.ran_in_class = name
177
+ end
178
+ @configurable.configure
179
+ assert_equal @configurable.name, @configurable.configuration.ran_in_class
180
+ end
181
+ def test_multiple_initial_callbacks_get_set
182
+ @configurable.once_configured {}
183
+ @configurable.once_configured {}
184
+ assert_equal 2, @configurable.__initial_configuration_callbacks__.length
185
+ end
186
+ def test_multiple_initial_callbacks_get_run
187
+ @configurable.once_configured do
188
+ self.configuration.first_ran = true
189
+ end
190
+ @configurable.once_configured do
191
+ self.configuration.second_ran = true
192
+ end
193
+ @configurable.configure
194
+ assert @configurable.configuration.first_ran
195
+ assert @configurable.configuration.second_ran
196
+ end
197
+ def test_multiple_initial_callbacks_get_run_in_order
198
+ @configurable.once_configured do
199
+ self.configuration.run = 1
200
+ end
201
+ @configurable.once_configured do
202
+ self.configuration.run = 2
203
+ end
204
+ @configurable.configure
205
+ assert_equal 2, @configurable.configuration.run
206
+ end
207
+ def test_inherited_classes_preserve_initial_callbacks
208
+ @configurable.once_configured do
209
+ define_singleton_method(:initial_callback) { true }
210
+ end
211
+ inherited = Class.new(@configurable)
212
+ inherited.configure
213
+ assert inherited.initial_callback
214
+ end
215
+ def test_inherited_classes_dont_add_to_parent_initial_callbacks
216
+ inherited = Class.new(@configurable)
217
+ inherited.once_configured {}
218
+ assert_empty @configurable.__initial_configuration_callbacks__
219
+ end
220
+
221
+ end
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class ConfigurationTest < MiniTest::Test
4
+ def setup
5
+ @configuration = Configuration.new
6
+ end
7
+
8
+ end
@@ -0,0 +1,5 @@
1
+ require 'test_helper'
2
+
3
+ class HashTest < MiniTest::Test
4
+
5
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class BlockPartyTest < MiniTest::Test
4
+
5
+ def test_that_libray_is_preconfigured
6
+ assert BlockParty.configuration
7
+ end
8
+
9
+ def test_that_libray_is_preconfigured_to_load_globally
10
+ assert BlockParty.configuration.global
11
+ end
12
+ def test_that_configuration_is_globally_preloaded
13
+ assert defined?(::Configuration)
14
+ end
15
+ def test_that_configurable_is_globally_preloaded
16
+ assert defined?(::Configurable)
17
+ end
18
+
19
+ def test_that_new_returns_a_new_configuration
20
+ assert_instance_of BlockParty::Configuration, BlockParty.new
21
+ end
22
+
23
+ end
@@ -0,0 +1,9 @@
1
+ require "rubygems"
2
+ require "minitest/autorun"
3
+ require "simplecov"
4
+
5
+ SimpleCov.start do
6
+ add_filter "/test"
7
+ end
8
+
9
+ require "block_party"
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: block_party
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Christopher Keele
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>'
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>'
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>'
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>'
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>'
60
+ - !ruby/object:Gem::Version
61
+ version: '0.7'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>'
67
+ - !ruby/object:Gem::Version
68
+ version: '0.7'
69
+ description: Make any object configurable; quickly, cleanly, easily.
70
+ email:
71
+ - dev@chriskeele.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - block_party.gemspec
82
+ - lib/block_party.rb
83
+ - lib/block_party/configurable.rb
84
+ - lib/block_party/configuration.rb
85
+ - lib/block_party/configuration/comparison.rb
86
+ - lib/block_party/configuration/conversion.rb
87
+ - lib/block_party/configuration/enumeration.rb
88
+ - lib/block_party/configuration/identity.rb
89
+ - lib/block_party/extensions/hash.rb
90
+ - lib/block_party/extensions/rails/active_record.rb
91
+ - lib/block_party/extensions/rails/railtie.rb
92
+ - lib/block_party/version.rb
93
+ - test/block_party/configurable_test.rb
94
+ - test/block_party/configuration_test.rb
95
+ - test/block_party/extensions/hash_test.rb
96
+ - test/block_party_test.rb
97
+ - test/test_helper.rb
98
+ homepage: http://github.com/christhekeele/block_party
99
+ licenses:
100
+ - MIT
101
+ metadata: {}
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project:
118
+ rubygems_version: 2.0.3
119
+ signing_key:
120
+ specification_version: 4
121
+ summary: block_party-0.1.0.1
122
+ test_files:
123
+ - test/block_party/configurable_test.rb
124
+ - test/block_party/configuration_test.rb
125
+ - test/block_party/extensions/hash_test.rb
126
+ - test/block_party_test.rb
127
+ - test/test_helper.rb
128
+ has_rdoc: