unmixer 0.1.0

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,2 @@
1
+ require 'mkmf'
2
+ create_makefile('unmixer/unmixer')
@@ -0,0 +1,54 @@
1
+ #include <ruby.h>
2
+ #include <ruby/version.h>
3
+
4
+ #ifdef WARN_UNUSED_RESULT
5
+ #undef WARN_UNUSED_RESULT
6
+ #endif
7
+
8
+ #if RUBY_API_VERSION_CODE >= 20400
9
+ # include "2.4.0/internal.h"
10
+ #elif RUBY_API_VERSION_CODE >= 20300
11
+ # include "2.3.0/internal.h"
12
+ #elif RUBY_API_VERSION_CODE >= 20200
13
+ # include "2.2.0/internal.h"
14
+ #elif RUBY_API_VERSION_CODE >= 20100
15
+ # include "2.1.0/internal.h"
16
+ #else
17
+ # include <ruby/backward/classext.h>
18
+ #endif
19
+ #define RCLASS_SUPER(c) (RCLASS(c)->super)
20
+ #define RB_CLEAR_CACHE_BY_CLASS(c) rb_clear_method_cache_by_class(c)
21
+
22
+
23
+ static void unmixin(VALUE self, VALUE mod) {
24
+ };
25
+
26
+ static VALUE rb_m_unmixin(VALUE self, VALUE mod) {
27
+ Check_Type(mod, T_MODULE);
28
+
29
+ // printf("self:%x\n", self);
30
+ // printf("mod:%x\n", mod);
31
+ VALUE superklass = RCLASS_SUPER(self);
32
+ VALUE lastklass = self;
33
+
34
+ do {
35
+ // printf("------------------------------\n");
36
+ // printf("class:%s\n", rb_obj_classname(superklass));
37
+ // printf("class:%s\n", rb_class2name(superklass));
38
+ if(RB_TYPE_P(superklass, RUBY_T_CLASS) && superklass != self) break;
39
+ if(superklass == mod || RCLASS_M_TBL(superklass) == RCLASS_M_TBL(mod)) {
40
+ RCLASS_SUPER(lastklass) = RCLASS_SUPER(superklass);
41
+ RB_CLEAR_CACHE_BY_CLASS(lastklass);
42
+ break;
43
+ }
44
+ lastklass = superklass;
45
+ superklass = RCLASS_SUPER(superklass);
46
+ } while (superklass);
47
+
48
+ return self;
49
+ }
50
+
51
+
52
+ void Init_unmixer(void) {
53
+ rb_define_private_method(rb_cModule, "unmixer_unmixin", RUBY_METHOD_FUNC(rb_m_unmixin), 1);
54
+ }
data/lib/unmixer.rb ADDED
@@ -0,0 +1,2 @@
1
+ require "unmixer/version"
2
+ require "unmixer/core_refine"
@@ -0,0 +1,45 @@
1
+ require "unmixer/unmixer"
2
+
3
+ module Unmixer
4
+ refine Module do
5
+ private
6
+ alias_method :unmixin, :unmixer_unmixin
7
+
8
+ def unmixer_uninclude mod, &block
9
+ return unless ancestors.tap { |it| break it[it.find_index(self)+1..it.find_index(superclass)-1] }.include? mod
10
+ unmixer_unmixin mod
11
+ end
12
+ alias_method :uninclude, :unmixer_uninclude
13
+
14
+ def unmixer_unprepend mod
15
+ return unless ancestors.tap { |it| break it[0, it.find_index(self)] }.include? mod
16
+ unmixer_unmixin mod
17
+ end
18
+ alias_method :unprepend, :unmixer_unprepend
19
+ end
20
+
21
+ refine Object do
22
+ alias_method :unmixer_original_extend, :extend
23
+ def unmixer_extend mod
24
+ unmixer_original_extend mod
25
+
26
+ if block_given?
27
+ yield(self)
28
+ unmixer_unextend mod
29
+ end
30
+ end
31
+ alias_method :extend, :unmixer_extend
32
+
33
+ def unmixer_unextend mod
34
+ return unless singleton_class.ancestors.include? mod
35
+
36
+ singleton_class.__send__ :unmixer_unmixin, mod
37
+
38
+ if block_given?
39
+ yield(self)
40
+ unmixer_original_extend mod
41
+ end
42
+ end
43
+ alias_method :unextend, :unmixer_unextend
44
+ end
45
+ end
@@ -0,0 +1,3 @@
1
+ module Unmixer
2
+ VERSION = "0.1.0"
3
+ end
data/unmixer.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'unmixer/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "unmixer"
8
+ spec.version = Unmixer::VERSION
9
+ spec.authors = ["manga_osyo"]
10
+ spec.email = ["manga.osyo@gmail.com"]
11
+
12
+ spec.summary = %q{Remove mixin modules.}
13
+ spec.description = %q{Remove mixin modules.}
14
+ spec.homepage = "https://github.com/osyo-manga/gem-unmixer"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.extensions = %w[ext/unmixer/extconf.rb]
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.14"
26
+ spec.add_development_dependency "rake", "~> 12.0"
27
+ spec.add_development_dependency "rspec", "~> 3.0"
28
+ spec.add_development_dependency "rake-compiler"
29
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: unmixer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - manga_osyo
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-02-06 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.14'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '12.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '12.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake-compiler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Remove mixin modules.
70
+ email:
71
+ - manga.osyo@gmail.com
72
+ executables: []
73
+ extensions:
74
+ - ext/unmixer/extconf.rb
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - ".rspec"
79
+ - ".travis.yml"
80
+ - Gemfile
81
+ - README.md
82
+ - Rakefile
83
+ - bin/console
84
+ - bin/setup
85
+ - ext/unmixer/2.1.0/internal.h
86
+ - ext/unmixer/2.2.0/internal.h
87
+ - ext/unmixer/2.3.0/internal.h
88
+ - ext/unmixer/2.4.0/internal.h
89
+ - ext/unmixer/extconf.rb
90
+ - ext/unmixer/unmixer.c
91
+ - lib/unmixer.rb
92
+ - lib/unmixer/core_refine.rb
93
+ - lib/unmixer/version.rb
94
+ - unmixer.gemspec
95
+ homepage: https://github.com/osyo-manga/gem-unmixer
96
+ licenses: []
97
+ metadata: {}
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubyforge_project:
114
+ rubygems_version: 2.6.8
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: Remove mixin modules.
118
+ test_files: []