luruju 0.1.0 → 0.2.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.
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'