mixology 0.1.0-jruby

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.
@@ -0,0 +1,71 @@
1
+ require "rake"
2
+ require 'rake/clean'
3
+ require 'rake/gempackagetask'
4
+ require "rake/testtask"
5
+
6
+ if RUBY_PLATFORM =~ /java/
7
+ task :default => %w[clean compile_java test]
8
+ else
9
+ task :default => %w[clean compile test]
10
+ end
11
+
12
+ Rake::TestTask.new("test") do |t|
13
+ t.pattern = "test/**/*_test.rb"
14
+ end
15
+
16
+ desc "Builds the extension"
17
+ task :compile => ["ext/mixology/Makefile", "ext/mixology/mixology.#{Config::CONFIG['DLEXT']}" ]
18
+
19
+ file "ext/mixology/Makefile" => ["ext/mixology/extconf.rb"] do
20
+ Dir.chdir("ext/mixology") do
21
+ ruby "extconf.rb"
22
+ end
23
+ end
24
+
25
+ file "ext/mixology/mixology.#{Config::CONFIG['DLEXT']}" do
26
+ Dir.chdir("ext/mixology") do
27
+ sh "make"
28
+ end
29
+ cp "ext/mixology/mixology.#{Config::CONFIG['DLEXT']}", "lib"
30
+ end
31
+
32
+ CLEAN.include %w[ext/mixology/Makefile ext/mixology/mixology.bundle lib/mixology.bundle]
33
+ CLEAN.include %w[ext/mixology/MixableService.class ext/mixology/mixable.jar lib/mixology.jar]
34
+
35
+ Gem::manage_gems
36
+
37
+ specification = Gem::Specification.new do |s|
38
+ s.name = "mixology"
39
+ s.summary = "Mixology enables objects to mixin and unmix modules."
40
+ s.version = "0.1.0"
41
+ s.author = "anonymous z, Pat Farley, Dan Manges"
42
+ s.description = s.summary
43
+ s.homepage = "http://mixology.rubyforge.org"
44
+ s.rubyforge_project = "mixology"
45
+ s.has_rdoc = false
46
+ s.autorequire = "mixology"
47
+ s.files = FileList['ext/**/*.{c,rb}', '{lib,test}/**/*.rb', '^[A-Z]+$', 'Rakefile'].to_a
48
+ if RUBY_PLATFORM =~ /mswin/
49
+ s.platform = Gem::Platform::WIN32
50
+ s.files += ["lib/mixology.so"]
51
+ elsif RUBY_PLATFORM =~ /java/
52
+ s.platform = "jruby"
53
+ s.files += ["lib/mixology.jar"]
54
+ else
55
+ s.platform = Gem::Platform::RUBY
56
+ s.extensions = FileList["ext/**/extconf.rb"].to_a
57
+ end
58
+ end
59
+ Rake::GemPackageTask.new(specification) do |package|
60
+ package.need_zip = false
61
+ package.need_tar = false
62
+ end
63
+
64
+ desc "Compiles the JRuby extension"
65
+ task :compile_java do
66
+ Dir.chdir("ext/mixology") do
67
+ sh %{javac -source 1.4 -target 1.4 -classpath $JRUBY_HOME/lib/jruby.jar MixologyService.java}
68
+ sh %{jar cf mixology.jar MixologyService.class}
69
+ cp "mixology.jar", "../../lib/mixology.jar"
70
+ end
71
+ end
@@ -0,0 +1,3 @@
1
+ require "mkmf"
2
+ dir_config "mixology"
3
+ create_makefile "mixology"
@@ -0,0 +1,78 @@
1
+ #include "ruby.h"
2
+
3
+ static void remove_nested_module(VALUE klass, VALUE include_class) {
4
+
5
+ if(RBASIC(RCLASS(klass)->super)->klass != RBASIC(RCLASS(include_class)->super)->klass) {
6
+ return;
7
+ }
8
+ if(RCLASS(RCLASS(include_class)->super)->super && BUILTIN_TYPE(RCLASS(include_class)->super) == T_ICLASS) {
9
+ remove_nested_module(RCLASS(klass)->super, RCLASS(include_class)->super);
10
+ }
11
+ RCLASS(klass)->super = RCLASS(RCLASS(klass)->super)->super;
12
+ }
13
+
14
+ static VALUE rb_unmix(VALUE self, VALUE module) {
15
+ VALUE klass;
16
+ for (klass = RBASIC(self)->klass; klass != rb_class_real(klass); klass = RCLASS(klass)->super) {
17
+ VALUE super = RCLASS(klass)->super;
18
+ if (BUILTIN_TYPE(super) == T_ICLASS) {
19
+ if (RBASIC(super)->klass == module) {
20
+ if(RCLASS(module)->super && BUILTIN_TYPE(RCLASS(module)->super) == T_ICLASS)
21
+ remove_nested_module(super, module);
22
+ RCLASS(klass)->super = RCLASS(RCLASS(klass)->super)->super;
23
+ rb_clear_cache();
24
+ }
25
+ }
26
+ }
27
+ return self;
28
+ }
29
+
30
+ static void add_module(VALUE self, VALUE module) {
31
+ VALUE super = RCLASS(rb_singleton_class(self))->super;
32
+ NEWOBJ(klass, struct RClass);
33
+ OBJSETUP(klass, rb_cClass, T_ICLASS);
34
+
35
+ if (BUILTIN_TYPE(module) == T_ICLASS) {
36
+ module = RBASIC(module)->klass;
37
+ }
38
+ if (!RCLASS(module)->iv_tbl) {
39
+ RCLASS(module)->iv_tbl = (void*)st_init_numtable();
40
+ }
41
+ klass->iv_tbl = RCLASS(module)->iv_tbl;
42
+ klass->m_tbl = RCLASS(module)->m_tbl;
43
+ klass->super = super;
44
+ if (TYPE(module) == T_ICLASS) {
45
+ RBASIC(klass)->klass = RBASIC(module)->klass;
46
+ }
47
+ else {
48
+ RBASIC(klass)->klass = module;
49
+ }
50
+ OBJ_INFECT(klass, module);
51
+ OBJ_INFECT(klass, super);
52
+
53
+ RCLASS(rb_singleton_class(self))->super = (int)klass;
54
+
55
+ }
56
+
57
+ static VALUE rb_mixin(VALUE self, VALUE module) {
58
+ rb_unmix(self, module);
59
+
60
+ VALUE nested_modules = rb_mod_included_modules(module);
61
+ int index;
62
+ for (index = RARRAY(nested_modules)->len; index > 0; index--) {
63
+ VALUE nested_module = RARRAY(nested_modules)->ptr[index-1];
64
+ add_module(self, nested_module);
65
+ }
66
+
67
+ add_module(self, module);
68
+
69
+ rb_clear_cache();
70
+ return self;
71
+ }
72
+
73
+ void Init_mixology() {
74
+ VALUE Mixology = rb_define_module("Mixology");
75
+ rb_define_method(Mixology, "mixin", rb_mixin, 1);
76
+ rb_define_method(Mixology, "unmix", rb_unmix, 1);
77
+ rb_include_module(rb_cObject, Mixology);
78
+ }
@@ -0,0 +1,169 @@
1
+ # This file was created by mkconfig.rb when ruby was built. Any
2
+ # changes made to this file will be lost the next time ruby is built.
3
+
4
+ module Config
5
+ RUBY_VERSION == "1.8.5" or
6
+ raise "ruby lib version (1.8.4) doesn't match executable version (#{RUBY_VERSION})"
7
+
8
+ TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/1.8/i386-mingw32")
9
+ DESTDIR = '' unless defined? DESTDIR
10
+ CONFIG = {}
11
+ CONFIG["DESTDIR"] = DESTDIR
12
+ CONFIG["INSTALL"] = "/usr/bin/install -c"
13
+ CONFIG["prefix"] = (TOPDIR || DESTDIR + "/where/to/install/ruby-mingw32")
14
+ CONFIG["EXEEXT"] = ".exe"
15
+ CONFIG["ruby_install_name"] = "ruby"
16
+ CONFIG["RUBY_INSTALL_NAME"] = "ruby"
17
+ CONFIG["RUBY_SO_NAME"] = "msvcrt-ruby18"
18
+ CONFIG["SHELL"] = "/bin/sh"
19
+ CONFIG["PATH_SEPARATOR"] = ":"
20
+ CONFIG["PACKAGE_NAME"] = ""
21
+ CONFIG["PACKAGE_TARNAME"] = ""
22
+ CONFIG["PACKAGE_VERSION"] = ""
23
+ CONFIG["PACKAGE_STRING"] = ""
24
+ CONFIG["PACKAGE_BUGREPORT"] = ""
25
+ CONFIG["exec_prefix"] = "$(prefix)"
26
+ CONFIG["bindir"] = "$(exec_prefix)/bin"
27
+ CONFIG["sbindir"] = "$(exec_prefix)/sbin"
28
+ CONFIG["libexecdir"] = "$(exec_prefix)/libexec"
29
+ CONFIG["datadir"] = "$(prefix)/share"
30
+ CONFIG["sysconfdir"] = "$(prefix)/etc"
31
+ CONFIG["sharedstatedir"] = "$(prefix)/com"
32
+ CONFIG["localstatedir"] = "$(prefix)/var"
33
+ CONFIG["libdir"] = "$(exec_prefix)/lib"
34
+ CONFIG["includedir"] = "$(prefix)/include"
35
+ CONFIG["oldincludedir"] = "/usr/include"
36
+ CONFIG["infodir"] = "$(prefix)/info"
37
+ CONFIG["mandir"] = "$(prefix)/man"
38
+ CONFIG["build_alias"] = "i686-linux"
39
+ CONFIG["host_alias"] = "i586-mingw32msvc"
40
+ CONFIG["target_alias"] = "i386-mingw32"
41
+ CONFIG["ECHO_C"] = ""
42
+ CONFIG["ECHO_N"] = "-n"
43
+ CONFIG["ECHO_T"] = ""
44
+ CONFIG["LIBS"] = "-lwsock32 "
45
+ CONFIG["MAJOR"] = "1"
46
+ CONFIG["MINOR"] = "8"
47
+ CONFIG["TEENY"] = "4"
48
+ CONFIG["build"] = "i686-pc-linux"
49
+ CONFIG["build_cpu"] = "i686"
50
+ CONFIG["build_vendor"] = "pc"
51
+ CONFIG["build_os"] = "linux"
52
+ CONFIG["host"] = "i586-pc-mingw32msvc"
53
+ CONFIG["host_cpu"] = "i586"
54
+ CONFIG["host_vendor"] = "pc"
55
+ CONFIG["host_os"] = "mingw32msvc"
56
+ CONFIG["target"] = "i386-pc-mingw32"
57
+ CONFIG["target_cpu"] = "i386"
58
+ CONFIG["target_vendor"] = "pc"
59
+ CONFIG["target_os"] = "mingw32"
60
+ CONFIG["CC"] = "i586-mingw32msvc-gcc"
61
+ CONFIG["CFLAGS"] = "-g -O2 "
62
+ CONFIG["LDFLAGS"] = ""
63
+ CONFIG["CPPFLAGS"] = ""
64
+ CONFIG["OBJEXT"] = "o"
65
+ CONFIG["CPP"] = "i586-mingw32msvc-gcc -E"
66
+ CONFIG["EGREP"] = "grep -E"
67
+ CONFIG["GNU_LD"] = "yes"
68
+ CONFIG["CPPOUTFILE"] = "-o conftest.i"
69
+ CONFIG["OUTFLAG"] = "-o "
70
+ CONFIG["YACC"] = "bison -y"
71
+ CONFIG["RANLIB"] = "i586-mingw32msvc-ranlib"
72
+ CONFIG["AR"] = "i586-mingw32msvc-ar"
73
+ CONFIG["NM"] = "i586-mingw32msvc-nm"
74
+ CONFIG["WINDRES"] = "i586-mingw32msvc-windres"
75
+ CONFIG["DLLWRAP"] = "i586-mingw32msvc-dllwrap"
76
+ CONFIG["OBJDUMP"] = "i586-mingw32msvc-objdump"
77
+ CONFIG["LN_S"] = "ln -s"
78
+ CONFIG["SET_MAKE"] = ""
79
+ CONFIG["INSTALL_PROGRAM"] = "$(INSTALL)"
80
+ CONFIG["INSTALL_SCRIPT"] = "$(INSTALL)"
81
+ CONFIG["INSTALL_DATA"] = "$(INSTALL) -m 644"
82
+ CONFIG["RM"] = "rm -f"
83
+ CONFIG["CP"] = "cp"
84
+ CONFIG["MAKEDIRS"] = "mkdir -p"
85
+ CONFIG["LIBOBJS"] = " fileblocks$(U).o crypt$(U).o flock$(U).o acosh$(U).o win32$(U).o"
86
+ CONFIG["ALLOCA"] = ""
87
+ CONFIG["DLDFLAGS"] = " -Wl,--enable-auto-import,--export-all"
88
+ CONFIG["ARCH_FLAG"] = ""
89
+ CONFIG["STATIC"] = ""
90
+ CONFIG["CCDLFLAGS"] = ""
91
+ CONFIG["LDSHARED"] = "i586-mingw32msvc-gcc -shared -s"
92
+ CONFIG["DLEXT"] = "so"
93
+ CONFIG["DLEXT2"] = "dll"
94
+ CONFIG["LIBEXT"] = "a"
95
+ CONFIG["LINK_SO"] = ""
96
+ CONFIG["LIBPATHFLAG"] = " -L\"%s\""
97
+ CONFIG["RPATHFLAG"] = ""
98
+ CONFIG["LIBPATHENV"] = ""
99
+ CONFIG["TRY_LINK"] = ""
100
+ CONFIG["STRIP"] = "strip"
101
+ CONFIG["EXTSTATIC"] = ""
102
+ CONFIG["setup"] = "Setup"
103
+ CONFIG["MINIRUBY"] = "ruby -I/home/batsman/mess/current/ruby -rfake"
104
+ CONFIG["PREP"] = "fake.rb"
105
+ CONFIG["RUNRUBY"] = "$(MINIRUBY) -I`cd $(srcdir)/lib; pwd`"
106
+ CONFIG["EXTOUT"] = ".ext"
107
+ CONFIG["ARCHFILE"] = ""
108
+ CONFIG["RDOCTARGET"] = ""
109
+ CONFIG["XCFLAGS"] = " -DRUBY_EXPORT"
110
+ CONFIG["XLDFLAGS"] = " -Wl,--stack,0x02000000 -L."
111
+ CONFIG["LIBRUBY_LDSHARED"] = "i586-mingw32msvc-gcc -shared -s"
112
+ CONFIG["LIBRUBY_DLDFLAGS"] = " -Wl,--enable-auto-import,--export-all -Wl,--out-implib=$(LIBRUBY)"
113
+ CONFIG["rubyw_install_name"] = "rubyw"
114
+ CONFIG["RUBYW_INSTALL_NAME"] = "rubyw"
115
+ CONFIG["LIBRUBY_A"] = "lib$(RUBY_SO_NAME)-static.a"
116
+ CONFIG["LIBRUBY_SO"] = "$(RUBY_SO_NAME).dll"
117
+ CONFIG["LIBRUBY_ALIASES"] = ""
118
+ CONFIG["LIBRUBY"] = "lib$(LIBRUBY_SO).a"
119
+ CONFIG["LIBRUBYARG"] = "$(LIBRUBYARG_SHARED)"
120
+ CONFIG["LIBRUBYARG_STATIC"] = "-l$(RUBY_SO_NAME)-static"
121
+ CONFIG["LIBRUBYARG_SHARED"] = "-l$(RUBY_SO_NAME)"
122
+ CONFIG["SOLIBS"] = "$(LIBS)"
123
+ CONFIG["DLDLIBS"] = ""
124
+ CONFIG["ENABLE_SHARED"] = "yes"
125
+ CONFIG["MAINLIBS"] = ""
126
+ CONFIG["COMMON_LIBS"] = "m"
127
+ CONFIG["COMMON_MACROS"] = ""
128
+ CONFIG["COMMON_HEADERS"] = "windows.h winsock.h"
129
+ CONFIG["EXPORT_PREFIX"] = ""
130
+ CONFIG["MINIOBJS"] = "dmydln.o"
131
+ CONFIG["MAKEFILES"] = "Makefile GNUmakefile"
132
+ CONFIG["arch"] = "i386-mingw32"
133
+ CONFIG["sitearch"] = "i386-msvcrt"
134
+ CONFIG["sitedir"] = "$(prefix)/lib/ruby/site_ruby"
135
+ CONFIG["configure_args"] = "'--host=i586-mingw32msvc' '--target=i386-mingw32' '--build=i686-linux' '--prefix=/home/batsman/mess/current/ruby-mingw32' 'build_alias=i686-linux' 'host_alias=i586-mingw32msvc' 'target_alias=i386-mingw32'"
136
+ CONFIG["NROFF"] = "/usr/bin/nroff"
137
+ CONFIG["MANTYPE"] = "doc"
138
+ CONFIG["LTLIBOBJS"] = " fileblocks$(U).lo crypt$(U).lo flock$(U).lo acosh$(U).lo win32$(U).lo"
139
+ CONFIG["ruby_version"] = "$(MAJOR).$(MINOR)"
140
+ CONFIG["rubylibdir"] = "$(libdir)/ruby/$(ruby_version)"
141
+ CONFIG["archdir"] = "$(rubylibdir)/$(arch)"
142
+ CONFIG["sitelibdir"] = "$(sitedir)/$(ruby_version)"
143
+ CONFIG["sitearchdir"] = "$(sitelibdir)/$(sitearch)"
144
+ CONFIG["topdir"] = File.dirname(__FILE__)
145
+ MAKEFILE_CONFIG = {}
146
+ CONFIG.each{|k,v| MAKEFILE_CONFIG[k] = v.dup}
147
+ def Config::expand(val, config = CONFIG)
148
+ val.gsub!(/\$\$|\$\(([^()]+)\)|\$\{([^{}]+)\}/) do |var|
149
+ if !(v = $1 || $2)
150
+ '$'
151
+ elsif key = config[v = v[/\A[^:]+(?=(?::(.*?)=(.*))?\z)/]]
152
+ pat, sub = $1, $2
153
+ config[v] = false
154
+ Config::expand(key, config)
155
+ config[v] = key
156
+ key = key.gsub(/#{Regexp.quote(pat)}(?=\s|\z)/n) {sub} if pat
157
+ key
158
+ else
159
+ var
160
+ end
161
+ end
162
+ val
163
+ end
164
+ CONFIG.each_value do |val|
165
+ Config::expand(val)
166
+ end
167
+ end
168
+ RbConfig = Config # compatibility for ruby-1.9
169
+ CROSS_COMPILING = nil unless defined? CROSS_COMPILING
Binary file
@@ -0,0 +1,170 @@
1
+ require File.dirname(__FILE__) + "/test_helper"
2
+
3
+ class MixologyTest < Test::Unit::TestCase
4
+
5
+ test "mixin" do
6
+ mixin = Module.new { def foo; "foo"; end }
7
+ object = Object.new
8
+ object.mixin mixin
9
+ assert_equal "foo", object.foo
10
+ end
11
+
12
+ test "unmix" do
13
+ mixin = Module.new { def foo; "mixin"; end }
14
+ object = Class.new { def foo; "object"; end }.new
15
+ object.mixin mixin
16
+ assert_equal "mixin", object.foo
17
+ object.unmix mixin
18
+ assert_equal "object", object.foo
19
+ end
20
+
21
+ test "mixin twice" do
22
+ first_mixin = Module.new { def foo; "first"; end }
23
+ second_mixin = Module.new { def foo; "second"; end }
24
+ object = Object.new
25
+ object.mixin first_mixin
26
+ object.mixin second_mixin
27
+ assert_equal "second", object.foo
28
+ end
29
+
30
+ test "mixin to class" do
31
+ mix = Module.new { def foo; "foo"; end }
32
+ klass = Class.new { mixin mix }
33
+ assert_equal "foo", klass.foo
34
+ end
35
+
36
+ test "can mixin again" do
37
+ first_mixin = Module.new { def foo; "first"; end }
38
+ second_mixin = Module.new { def foo; "second"; end }
39
+ object = Object.new
40
+ object.mixin first_mixin
41
+ object.mixin second_mixin
42
+ object.mixin first_mixin
43
+ assert_equal "first", object.foo
44
+ end
45
+
46
+ test "unmix effects limited to instance" do
47
+ mixin = Module.new { def foo; "mixin"; end }
48
+ object = Class.new {include mixin}.new
49
+ assert_equal "mixin", object.foo
50
+ object.unmix mixin
51
+ assert_equal "mixin", object.foo
52
+ end
53
+
54
+ test "can add mod to an instance even when already included by class" do
55
+ mixin = Module.new { def foo; "mixin"; end }
56
+ klass = Class.new {include mixin; def foo; "class"; end }
57
+ object = klass.new
58
+ assert_equal "class", object.foo
59
+ object.mixin mixin
60
+ assert_equal "mixin", object.foo
61
+ end
62
+
63
+ test "included modules after mixin" do
64
+ mixin = Module.new
65
+ object = Object.new
66
+ object.mixin mixin
67
+ assert_equal [mixin, Mixology, Kernel], (class << object; self; end).included_modules
68
+ end
69
+
70
+ test "included modules after unmix" do
71
+ mixin = Module.new
72
+ object = Object.new
73
+ object.mixin mixin
74
+ object.unmix mixin
75
+ assert_equal [Mixology, Kernel], (class << object; self; end).included_modules
76
+ end
77
+
78
+ test "included modules after remix" do
79
+ mixin_one = Module.new
80
+ mixin_two = Module.new
81
+ object = Object.new
82
+ object.mixin mixin_one
83
+ object.mixin mixin_two
84
+ assert_equal [mixin_two, mixin_one, Mixology, Kernel], (class << object; self; end).included_modules
85
+ object.mixin mixin_one
86
+ assert_equal [mixin_one, mixin_two, Mixology, Kernel], (class << object; self; end).included_modules
87
+ end
88
+
89
+ test "mixin returns object" do
90
+ object = Object.new
91
+ mixin = Module.new
92
+ assert_equal object, object.mixin(mixin)
93
+ end
94
+
95
+ test "unmix returns object" do
96
+ object = Object.new
97
+ mixin = Module.new
98
+ object.mixin mixin
99
+ assert_equal object, object.unmix(mixin)
100
+ end
101
+
102
+ test "nested modules are mixedin" do
103
+ nested_module = Module.new { def foo; "foo"; end }
104
+ mixin = Module.new { include nested_module }
105
+ object = Object.new
106
+ object.mixin mixin
107
+ assert_equal [mixin, nested_module, Mixology, Kernel], (class << object; self; end).included_modules
108
+ end
109
+
110
+ test "nested modules are mixedin deeply" do
111
+ nested_module_ultimate = Module.new
112
+ nested_module_penultimate = Module.new { include nested_module_ultimate }
113
+ nested_module = Module.new { include nested_module_penultimate }
114
+ mixin = Module.new { include nested_module }
115
+ object = Object.new
116
+ object.mixin mixin
117
+ assert_equal [mixin, nested_module, nested_module_penultimate, nested_module_ultimate, Mixology, Kernel], (class << object; self; end).included_modules
118
+ end
119
+
120
+ test "nested modules are mixedin even if alrady mixed in" do
121
+ nested_module = Module.new { def foo; "foo"; end }
122
+ mixin = Module.new { include nested_module }
123
+ object = Object.new
124
+ object.mixin nested_module
125
+ object.mixin mixin
126
+ assert_equal [mixin, nested_module, nested_module, Mixology, Kernel], (class << object; self; end).included_modules
127
+ end
128
+
129
+ test "module is not unmixed if it is outside nested chain" do
130
+ nested_module = Module.new
131
+ mixin = Module.new { include nested_module }
132
+ object = Object.new
133
+ object.mixin nested_module
134
+ object.mixin mixin
135
+ object.unmix mixin
136
+ assert_equal [nested_module, Mixology, Kernel], (class << object; self; end).included_modules
137
+ end
138
+
139
+ test "nested modules are unmixed" do
140
+ nested_module = Module.new
141
+ mixin = Module.new { include nested_module }
142
+ object = Object.new
143
+ object.mixin mixin
144
+ object.unmix mixin
145
+ assert_equal [Mixology, Kernel], (class << object; self; end).included_modules
146
+ end
147
+
148
+ test "nested modules are unmixed deeply" do
149
+ nested_module_ultimate = Module.new
150
+ nested_module_penultimate = Module.new { include nested_module_ultimate }
151
+ nested_module = Module.new { include nested_module_penultimate }
152
+ mixin = Module.new { include nested_module }
153
+ object = Object.new
154
+ object.mixin mixin
155
+ object.unmix mixin
156
+ assert_equal [Mixology, Kernel], (class << object; self; end).included_modules
157
+ end
158
+
159
+ test "unrelated modules are not unmixed" do
160
+ unrelated = Module.new
161
+ nested_module = Module.new
162
+ mixin = Module.new { include nested_module }
163
+ object = Object.new
164
+ object.mixin unrelated
165
+ object.mixin mixin
166
+ object.unmix mixin
167
+ assert_equal [unrelated, Mixology, Kernel], (class << object; self; end).included_modules
168
+ end
169
+
170
+ end
@@ -0,0 +1,20 @@
1
+ require "test/unit"
2
+ require "rubygems"
3
+
4
+ if RUBY_PLATFORM =~ /java/
5
+ Test::Unit::TestCase.class_eval do
6
+ def self.test(test_name, &block)
7
+ define_method("test_#{test_name}", &block)
8
+ end
9
+ end
10
+ else
11
+ begin
12
+ gem "dust"
13
+ require "dust"
14
+ rescue LoadError
15
+ raise "To run the tests, 'gem install dust'"
16
+ end
17
+ end
18
+
19
+ $LOAD_PATH.unshift File.dirname(__FILE__) + "/../lib"
20
+ require "mixology"
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ homepage: http://mixology.rubyforge.org
3
+ extensions: []
4
+ executables: []
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.0
7
+ post_install_message:
8
+ date: 2007-08-31 04:00:00 +00:00
9
+ files:
10
+ - ext/mixology/mixology.c
11
+ - ext/mixology/extconf.rb
12
+ - ext/mixology/rbconfig.rb
13
+ - test/mixology_test.rb
14
+ - test/test_helper.rb
15
+ - Rakefile
16
+ - lib/mixology.jar
17
+ rubygems_version: 0.9.4
18
+ rdoc_options: []
19
+ signing_key:
20
+ cert_chain:
21
+ name: mixology
22
+ has_rdoc: false
23
+ platform: jruby
24
+ summary: Mixology enables objects to mixin and unmix modules.
25
+ default_executable:
26
+ bindir: bin
27
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
28
+ version:
29
+ requirements:
30
+ - - '>'
31
+ - !ruby/object:Gem::Version
32
+ version: 0.0.0
33
+ require_paths:
34
+ - lib
35
+ specification_version: 1
36
+ test_files: []
37
+ dependencies: []
38
+ description: Mixology enables objects to mixin and unmix modules.
39
+ authors:
40
+ - anonymous z, Pat Farley, Dan Manges
41
+ email:
42
+ extra_rdoc_files: []
43
+ requirements: []
44
+ rubyforge_project: mixology
45
+ autorequire: mixology