luruju 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/Rakefile +21 -8
  2. data/bin/access_jruby_with_command.rb +5 -0
  3. data/lib/luruju.rb +12 -16
  4. data/lib/luruju/configuration.rb +11 -0
  5. data/lib/luruju/dto.rb +8 -0
  6. data/lib/luruju/enjoy_ruby.rb +186 -0
  7. data/lib/luruju/jude_api/add_dynamic_method.rb +9 -3
  8. data/lib/luruju/jude_api/jude_base.rb +89 -1
  9. data/lib/luruju/jude_api_loader.rb +7 -158
  10. data/lib/luruju/jude_api_loader_for_cache.rb +22 -0
  11. data/lib/luruju/jude_api_loader_for_locked_project.rb +37 -0
  12. data/lib/luruju/jude_api_loader_in_cruby.rb +38 -0
  13. data/lib/luruju/jude_api_loader_in_jruby.rb +113 -0
  14. data/lib/luruju/jude_meta.rb +75 -0
  15. data/lib/luruju/luruju_client.rb +20 -0
  16. data/lib/luruju/prepare.rb +16 -0
  17. data/lib/luruju/server/luruju_server.rb +33 -0
  18. data/lib/luruju/version.rb +2 -4
  19. data/lib/tasks/luruju.rb +5 -0
  20. data/lib/tasks/server.rake +21 -0
  21. data/test/abstract_unit.rb +26 -12
  22. data/test/{jude_api_test.rb → class_diagram_test.rb} +6 -1
  23. data/test/configuration_test.rb +108 -0
  24. data/test/er_diagram_test.rb +1 -1
  25. data/test/jude/base.jude +0 -0
  26. data/test/jude/community-5.0.2/class_diagram/dummy.jude +1 -0
  27. data/test/jude/community-5.0.2/class_diagram/locked.jude +0 -0
  28. data/test/jude/community-5.0.2/class_diagram/locked.jude.test +0 -0
  29. data/test/jude/community-5.0.2/locked.jude +0 -0
  30. data/test/jude/professional-5.1/class_diagram/dummy.jude +1 -0
  31. data/test/jude/professional-5.1/class_diagram/locked.jude +0 -0
  32. data/test/jude/professional-5.1/class_diagram/locked.jude.test +0 -0
  33. data/test/jude_api_loader_for_locked_project_test.rb +97 -0
  34. data/test/jude_base_test.rb +71 -0
  35. data/test/luruju_server_test.rb +77 -0
  36. metadata +78 -47
  37. data/lib/luruju/customize_inflector.rb +0 -3
  38. data/lib/luruju/dynamic_method.rb +0 -16
  39. data/lib/luruju/easy_breakpoint.rb +0 -22
  40. data/lib/luruju/jude_api/add_method.rb +0 -52
data/Rakefile CHANGED
@@ -7,6 +7,12 @@ require 'rake/gempackagetask'
7
7
  # TODO require 'rake/contrib/rubyforgepublisher'
8
8
  require File.join(File.dirname(__FILE__), 'lib', 'luruju', 'version')
9
9
 
10
+ #require 'tasks/luruju' rescue nil
11
+
12
+ #config = Luruju::Configuration.install do |config|
13
+ # config.drb_port = 9999
14
+ #end
15
+
10
16
  PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
11
17
  PKG_NAME = 'luruju'
12
18
  PKG_VERSION = Luruju::VERSION::STRING + PKG_BUILD
@@ -16,34 +22,34 @@ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
16
22
  Rake::TestTask.new('test') do |t|
17
23
  t.libs << "test"
18
24
  t.pattern = "test/**/*_test.rb"
19
- # t.warning = true
25
+ # t.warning = true
20
26
  end
21
27
 
22
28
  # Create compressed packages
23
- dist_dirs = [ "lib", "test" ]
29
+ dist_dirs = [ "lib", "test", "bin" ]
24
30
 
25
31
  spec = Gem::Specification.new do |s|
26
32
  s.platform = Gem::Platform::RUBY
27
33
  s.name = PKG_NAME
28
34
  s.version = PKG_VERSION
29
35
  s.summary = "A library for coordinating with Ruby And JUDE."
30
- # TODO s.description = %q{}
36
+ # TODO s.description = %q{}
31
37
 
32
38
  s.author = "Shuhei Nomura"
33
- # TODO s.email = "david@loudthinking.com"
39
+ # TODO s.email = "david@loudthinking.com"
34
40
  s.rubyforge_project = PKG_NAME
35
41
  s.homepage = "http://luruju.com"
36
42
 
37
43
  s.has_rdoc = false # TODO
38
- # TODO s.extra_rdoc_files = ["README"]
44
+ # TODO s.extra_rdoc_files = ["README"]
39
45
  s.requirements << 'JUDE Community'
40
46
  s.add_dependency('activesupport', '>= 1.4.2' + PKG_BUILD)
41
47
  s.require_path = 'lib'
42
48
  s.autorequire = 'luruju'
43
49
 
44
50
  s.files = [ "LICENSE", "Rakefile"]
45
- # TODO s.files << "CHANGELOG"
46
- # TODO s.files << "README"
51
+ # TODO s.files << "CHANGELOG"
52
+ # TODO s.files << "README"
47
53
  dist_dirs.each do |dir|
48
54
  s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |i| (/^\.svn/ =~ i) or (/\~\z/) =~ i }
49
55
  end
@@ -53,7 +59,7 @@ end
53
59
  Rake::GemPackageTask.new(spec) do |p|
54
60
  p.gem_spec = spec
55
61
  p.need_tar = true
56
- p.need_zip = true
62
+ p.need_zip = false
57
63
  end
58
64
 
59
65
  task :lines do
@@ -78,4 +84,11 @@ task :lines do
78
84
  end
79
85
 
80
86
  puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
87
+ end
88
+
89
+ task :install_localhost => [:repackage] do
90
+ %x{gem uninstall luruju}
91
+ %x{gem install pkg/#{PKG_FILE_NAME}.gem -l}
92
+ %x{jruby -S gem uninstall luruju}
93
+ %x{jruby -S gem install pkg/#{PKG_FILE_NAME}.gem -l}
81
94
  end
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'luruju'
3
+ require 'cgi'
4
+ jude_file, options = ARGV[0], Marshal.load(Base64.decode64(ARGV[1..-1].join("\n")+"\n"))
5
+ print Luruju::JudeApiLoader.marshal(jude_file, options)
data/lib/luruju.rb CHANGED
@@ -1,19 +1,15 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
- $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
- unless defined?(ActiveSupport)
5
- begin
6
- $:.unshift(File.dirname(__FILE__) + "/../../activesupport/lib")
7
- require 'active_support'
8
- rescue LoadError
9
- require 'rubygems'
10
- require 'active_support'
11
- end
12
- end
13
-
14
- require 'luruju/easy_breakpoint'
15
- require 'luruju/customize_inflector'
16
- require 'luruju/jude_api_loader'
17
- require 'luruju/dynamic_method'
18
- require 'luruju/jude_api/jude_base'
4
+ require 'rubygems'
5
+ require 'active_support'
19
6
 
7
+ require 'luruju/prepare'
8
+ require 'luruju/enjoy_ruby'
9
+ require 'luruju/configuration'
10
+ require 'luruju/jude_meta'
11
+ require 'luruju/luruju_client'
12
+ require 'luruju/jude_api_loader'
13
+ require "luruju/jude_api_loader_in_#{ruby_vm_name}"
14
+ require 'luruju/dto'
15
+ require 'luruju/jude_api/jude_base'
@@ -0,0 +1,11 @@
1
+ module Luruju
2
+
3
+ class Configuration
4
+
5
+ include Configuratable
6
+ define_config :access_jruby_with, :default => :drb, :validate => lambda{|val|[:drb,:command].include?(val)}
7
+ define_config :drb_port, :default => 3937, :validate => lambda{|val|val.to_i > 0}
8
+ define_config :use_jude_cache, :default => true, :validate => lambda{|val|[true,false].include?(val)}
9
+ end
10
+
11
+ end
data/lib/luruju/dto.rb ADDED
@@ -0,0 +1,8 @@
1
+ module Luruju
2
+ class DtoBetweenCrubyAndJruby
3
+ attr_accessor :meta, :model, :exception
4
+ def initialize(model, exception=nil)
5
+ @meta, @model, @exception = JudeMeta.instance, model, exception
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,186 @@
1
+
2
+ module Luruju
3
+
4
+ module DynamicMethod
5
+
6
+ class IsNotMyRole < StandardError ; end
7
+
8
+ def method_missing method, *args, &b
9
+ methods.select{|m|/^dyna_.*/ =~ m.to_s}.sort.each do |dyna_method|
10
+ return send(dyna_method, method, *args, &b) rescue IsNotMyRole
11
+ end
12
+ super method, *args, &b
13
+ end
14
+
15
+ end
16
+
17
+ module MethodWrappable
18
+
19
+ def self.included(base) base.extend ClassMethods end
20
+
21
+ module ClassMethods
22
+
23
+ @@wrapped_class_methods = []
24
+
25
+ def wrap_class_method *names
26
+ @@wrapped_class_methods += names
27
+ names.each { |name| do_wrap_class_method name rescue NameError }
28
+ end
29
+
30
+ def singleton_method_added(name)
31
+ return if /^original_/ =~ name.to_s
32
+ file, line, method = caller[1].match(/^(.+?):(\d+)(?::in `(.*?)')?/).captures
33
+ return if file == __FILE__ and ["do_wrap_class_method","singleton_method_added"].include?(method)
34
+ do_wrap_class_method(name) if @@wrapped_class_methods.include? name.to_sym
35
+ ensure
36
+ super
37
+ end
38
+
39
+ def do_wrap_class_method name
40
+ self.module_eval <<-EOD
41
+ class << self
42
+ alias :original_#{name.to_s} :#{name.to_s}
43
+ def #{name.to_s} *args
44
+ bucket_brigade methods.select{|x|/^wrap_#{name}/=~x}.sort!.push("original_#{name.to_s}"), *args
45
+ end
46
+ end
47
+ EOD
48
+ end
49
+
50
+ def bucket_brigade wraps, *args
51
+ current = wraps.shift
52
+ send(current, *args) do |*args|
53
+ wraps.empty? ? send(current, *args) : bucket_brigade(wraps, *args)
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ module Configuratable
62
+
63
+ def self.included base
64
+ base.parent.class_eval <<-EOD
65
+ @@config = nil
66
+ def self.config() @@config || #{base.name}.default end
67
+ def self.config=(config) @@config = config end
68
+ EOD
69
+ base.class_eval <<-EOD
70
+ @@default_configurations = {}
71
+ def self.default() new end
72
+ def self.uninstall() parent.config = nil end
73
+ def self.install(config=default, &block)
74
+ return parent.config = config unless block_given?
75
+ parent.config = new {|config|yield config}
76
+ end
77
+ def self.define_config key, options={}
78
+ @@default_configurations[key] = Config.new(key, options[:default], options[:validate])
79
+ end
80
+ def initialize
81
+ @configrations = {}
82
+ @@default_configurations.each{|key, value| @configrations[key] = value.dup}
83
+ yield self if block_given?
84
+ end
85
+ def self.singleton_method_added name
86
+ return unless name.to_s.match(/default_(.+)$/)
87
+ key = $1.to_sym
88
+ return unless @@default_configurations[key]
89
+ @@default_configurations[key].default = method(name).call
90
+ end
91
+ EOD
92
+ end
93
+
94
+ class Config
95
+ attr_accessor :key, :default, :value
96
+ def initialize(key, default=nil, validate=nil)
97
+ @key, @default, @validate = key, default, validate
98
+ end
99
+ def value() @value.nil? ? @default : @value end
100
+ def value=(value)
101
+ if @validate
102
+ raise ArgumentError.new("invarid value[#{value}]. key[#{key}]") unless @validate.call(value)
103
+ end
104
+ @value = value
105
+ end
106
+ end
107
+
108
+ def method_missing method, *args
109
+ return @configrations[method].value if @configrations.key? method.to_sym
110
+ if args.size == 1
111
+ sym = method.to_s.match(/^(.+?)=$/).captures[0].to_sym
112
+ return @configrations[sym].value = args[0] if @configrations.key? sym
113
+ end
114
+ super
115
+ end
116
+
117
+ end
118
+
119
+ end
120
+
121
+ require 'pp'
122
+
123
+ #eval(easy_breakpoint)
124
+ module Kernel
125
+
126
+ def easy_breakpoint
127
+ <<-EOS
128
+ puts 'easy-breakpoint>'
129
+ input = STDIN.readline.chop!
130
+ unless input == "stop"
131
+ begin
132
+ eval(input)
133
+ rescue => e
134
+ p e
135
+ pp e.backtrace
136
+ end
137
+ eval easy_breakpoint
138
+ end
139
+ EOS
140
+ end
141
+
142
+ end
143
+
144
+ __END__
145
+
146
+ class Hoge
147
+
148
+ include Luruju::MethodWrappable
149
+
150
+ wrap_class_method :hoge
151
+
152
+ def self.hoge arg1, arg2
153
+ p "hoge call #{arg1} #{arg2}"
154
+ "A"
155
+ end
156
+
157
+ def aaa
158
+ end
159
+
160
+ def self.wrap_hoge_aaa arg1, arg2
161
+ p "wrap enter aaa #{arg1} #{arg2}"
162
+ rtn = yield arg1, arg2
163
+ p "wrap leave aaa #{arg1} #{arg2}"
164
+ rtn + "B"
165
+ end
166
+
167
+ def self.wrap_hoge_bbb arg1, arg2
168
+ p "wrap enter bbb #{arg1} #{arg2}"
169
+ rtn = yield arg1, arg2
170
+ p "wrap leave bbb #{arg1} #{arg2}"
171
+ rtn + "C"
172
+ end
173
+
174
+ end
175
+
176
+ begin
177
+ result = Hoge.hoge "x", "y"
178
+ rescue LocalJumpError
179
+ p $!
180
+ p $!.reason
181
+ p $!.exit_value
182
+ require "pp"
183
+ pp $!.backtrace
184
+ end
185
+
186
+ p result
@@ -25,9 +25,10 @@ module Luruju
25
25
  end
26
26
 
27
27
  def dyna_is_kind_of? method, *args
28
- raise IsNotMyRole unless /^kind_of_(.+?)\?$/ =~ method.to_s
29
- return self.kind_of?(eval("JudeApi::#{$1.classify.jude_module}")) rescue
30
- false
28
+ raise IsNotMyRole unless /^kind_of_([^?]+?)\?$/ =~ method.to_s
29
+ c = "JudeApi::Jude#{$1.classify}Methods"
30
+ c = 'JudeApi::JudeClassMethods' if c == 'JudeApi::JudeClasMethods'
31
+ return self.kind_of?(eval(c)) rescue false
31
32
  end
32
33
 
33
34
  def dyna_owned_elements method, *args
@@ -44,6 +45,11 @@ module Luruju
44
45
  send(method.to_s.pluralize.to_sym, *args)[0]
45
46
  end
46
47
 
48
+ def dyna_search method, *args, &block
49
+ raise IsNotMyRole unless /^search_(.+?)$/ =~ method.to_s
50
+ JudeBase.search search{|x|x.send("kind_of_#{$1.singularize}?")}, *args, &block
51
+ end
52
+
47
53
  end
48
54
  end
49
55
  end
@@ -1,2 +1,90 @@
1
1
  require 'luruju/jude_api/add_dynamic_method'
2
- require 'luruju/jude_api/add_method'
2
+
3
+ module Luruju
4
+
5
+ module JudeApi
6
+
7
+ class JudeBase
8
+
9
+ attr_writer :tagged
10
+ attr_reader :members
11
+
12
+ def initialize(members) @members = members end
13
+
14
+ def search options={}, &block
15
+ JudeBase.search members, options, &block
16
+ end
17
+
18
+ def tagged
19
+ return @tagged if @tagged
20
+ @tagged = HashWithIndifferentAccess.new
21
+ tagged_values.each {|x| @tagged[x.key.to_sym] = x.value}
22
+ @tagged
23
+ end
24
+
25
+ def self.search members, options={}
26
+ members.collect do |member|
27
+ if options.key?(:name)
28
+ next unless member.is_a?(JudeNamedElementMethods)
29
+ next unless member.name == options[:name]
30
+ end
31
+ next if options.key?(:id) and member.id != options[:id]
32
+ if block_given?
33
+ next unless yield(member)
34
+ end
35
+ member
36
+ end.compact
37
+ end
38
+
39
+ def inspect() "<#{self.class}: id=#{self.instance_eval('@id')}>" end
40
+
41
+ end
42
+
43
+ module JudeNamedElementAddMethod
44
+ def inspect() "<#{self.class}: name=#{self.name} id=#{self.instance_eval('@id')}>" end
45
+ end
46
+
47
+ module JudeErAttributeAddMethod
48
+ def constraint(constraint_name) constraints.find{|x|constraint_name == x.name} end
49
+ end
50
+
51
+ module JudeModelAddMethod
52
+ attr_accessor :mtime
53
+ end
54
+
55
+ module JudeClassAddMethod
56
+ def default?
57
+ return unless owner
58
+ return unless owner.kind_of_element?
59
+ return unless owner.owner
60
+ ['lang', 'util'].include?(owner.name) and owner.owner.name == 'java'
61
+ end
62
+
63
+ def super_classes() generalizations.collect{|g|g.super_type} end
64
+ def sub_classes() specializations.collect{|s|s.sub_type} end
65
+
66
+ end
67
+
68
+ module JudeAttributeAddMethod
69
+ def broad_aggregate?() is_aggregate? or is_composite? end
70
+ def not_broad_aggregate?() !broad_aggregate? end
71
+ def contra() association.attributes.find{|b|b != self} end
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+
78
+ class Class
79
+
80
+ alias :include_except_luruju :include
81
+
82
+ def include *included
83
+ return include_except_luruju(*included) unless self.ancestors.include?(Luruju::JudeApi::JudeBase)
84
+ if Luruju::JudeApi.constants.include? "#{self.name}AddMethod".split("::").last
85
+ included[0].send :include, eval("#{self.name}AddMethod")
86
+ end
87
+ include_except_luruju(*included)
88
+ end
89
+
90
+ end
@@ -1,164 +1,13 @@
1
- require 'java'
2
-
3
1
  module Luruju
4
-
5
- JUDEAPI_PHEAD = 'com.change_vision.jude.api.inf'
6
- include_class "#{JUDEAPI_PHEAD}.project.ProjectAccessorFactory"
7
-
8
- class JudeApiLoader
9
-
10
- def self.load jude_file
11
- project_accessor = ProjectAccessorFactory.getProjectAccessor
12
- project_accessor.open jude_file
13
- getter = project_accessor.getClass.getDeclaredMethod "getProject", nil
14
- new.build project_accessor, getter
15
- ensure
16
- project_accessor.close rescue Exception
17
- end
18
-
19
- def initialize
20
- @already_builded = {}
21
- end
22
-
23
- def build java_parent, java_getter
24
-
25
- return nil if java_getter.getGenericParameterTypes.length > 0
26
-
27
- begin
28
- java_obj = java_parent.send java_getter.getName
29
- rescue NativeException
30
- # p "Warning(#{__FILE__},#{__LINE__}) " + java_getter.getName
31
- end
32
- return nil if java_obj == nil
33
-
34
- java_return_class = java_getter.getReturnType
35
- if is_jude_class? java_return_class
36
- return build_judeapi(java_obj)
37
- elsif java_return_class.isArray
38
- return build_array(java_obj, java_getter)
39
- else
40
- return java_obj
41
- end
42
- end
43
-
44
- def build_array java_obj, java_getter
45
-
46
- comp_type = java_getter.getReturnType.getComponentType
47
-
48
- if is_jude_class? comp_type
49
- jude_objects = Array.new
50
- java_obj.each {|i| jude_objects << build_judeapi(i) }
51
- return jude_objects
52
- else
53
- return java_obj.to_a
54
- end
55
- end
56
-
57
- def build_judeapi java_obj
58
-
59
- if is_jude_named_element?(java_obj) and @already_builded.key?(java_obj.getId)
60
- return @already_builded[java_obj.getId]
61
- end
62
-
63
- java_if = java_obj.getClass.getInterfaces[0]
64
- jude_class = JudeApi.module_eval java_if.getSimpleName.jude_class
65
- jude_object = jude_class.new
66
-
67
- @already_builded[java_obj.getId] = jude_object if jude_object.kind_of_named_element?
68
-
69
- java_if.getMethods.each do |java_method|
70
- next if java_method.getGenericParameterTypes.length > 0
71
- setter_name = java_method.getName.sub(/^(get)/,'').underscore << "="
72
- jude_object.send setter_name, build(java_obj, java_method)
73
- end
74
- return jude_object
75
- end
76
-
77
- def is_jude_class? java_class
78
- java_class.getName.index(JUDEAPI_PHEAD) == 0
79
- end
80
-
81
- def self.define_jude_class class_id
82
- judeapi_class_name = class_id.to_s.jude_class
83
- JudeApi.module_eval "class #{judeapi_class_name} < JudeBase ; end"
84
- judeapi_class = JudeApi.module_eval judeapi_class_name
85
- judeapi_module_name = class_id.to_s.jude_module
86
- judeapi_module = JudeApi.module_eval judeapi_module_name
87
- judeapi_class.send :include, judeapi_module
88
- judeapi_class
89
- end
90
-
91
- def self.define_jude_module module_id
92
-
93
- java_if = java.lang.Class.forName "#{JUDEAPI_PHEAD}.model.#{module_id.to_s.java_if}"
94
- judeapi_module_name = java_if.getSimpleName.jude_module
95
- JudeApi.module_eval "module #{judeapi_module_name} ; end"
96
- judeapi_module = JudeApi.module_eval judeapi_module_name
97
- java_if.getGenericInterfaces().each do |generic_if|
98
- JudeApi.module_eval generic_if.getSimpleName.jude_class
99
- judeapi_module.send :include, JudeApi.module_eval(generic_if.getSimpleName.jude_module)
100
- end
101
-
102
- java_if.getDeclaredMethods.each do |method|
103
- next if method.getGenericParameterTypes.length > 0
104
- java_method_name = method.getName
105
- attr_name = java_method_name.sub(/^(get)/,'').underscore
106
- judeapi_module.module_eval "attr_accessor :#{attr_name}"
107
- if /^is_/ =~ attr_name
108
- judeapi_module.send :alias_method,
109
- "#{attr_name}?".to_sym, attr_name.to_sym
110
- end
111
- end
112
-
113
- java_if.getDeclaredFields.each do |f|
114
- judeapi_module.module_eval "#{f.getName} = #{f.get(nil)}"
115
- end
116
- judeapi_module
117
- end
118
-
119
- def is_jude_named_element? jude_obj
120
- jude_obj.getClass.getMethod "getId", nil
121
- return true
122
- rescue java.lang.NoSuchMethodException
123
- return false
124
- end
125
- end
126
-
127
- end
128
-
129
- class String
130
-
131
- def is_jude_class?
132
- /^Jude/ =~ self and not /Methods$/ =~ self
2
+ class ProjectNotFoundException < Exception #:nodoc:
133
3
  end
134
-
135
- def is_jude_module?
136
- /^Jude/ =~ self and /Methods$/ =~ self
4
+ class ProjectLockedException < Exception #:nodoc:
137
5
  end
138
-
139
- def jude_class
140
- 'Jude' + sub(/^(I|Jude)/,'').sub(/ER/, "Er").sub(/Methods$/, '')
6
+ class UnexpectedNativeException < Exception #:nodoc:
141
7
  end
142
-
143
- def jude_module
144
- 'Jude' + sub(/^(I|Jude)/,'').sub(/ER/, "Er") + "Methods"
145
- end
146
-
147
- def java_if
148
- sub(/^(I|Jude)/,'I').sub(/Er/, "ER").sub(/Methods$/, '')
8
+ class JudeApiLoader
9
+ include MethodWrappable
10
+ wrap_class_method :load
149
11
  end
150
-
151
12
  end
152
-
153
- class Module
154
-
155
- alias :const_missing_except_luruju :const_missing
156
-
157
- def const_missing class_id
158
- return const_missing_except_luruju(class_id) unless self == Luruju::JudeApi
159
- return Luruju::JudeApiLoader::define_jude_class(class_id) if class_id.to_s.is_jude_class?
160
- return Luruju::JudeApiLoader::define_jude_module(class_id) if class_id.to_s.is_jude_module?
161
- raise NameError
162
- end
163
-
164
- end
13
+ require 'luruju/jude_api_loader_for_cache'