jmx4r 0.0.7 → 0.0.8

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.
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require "rubygems"
6
6
 
7
7
  dir = File.dirname(__FILE__)
8
8
  lib = File.join(dir, "lib", "jmx4r.rb")
9
- version = "0.0.7"
9
+ version = "0.0.8"
10
10
 
11
11
  task :default => [:test]
12
12
 
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env jruby
2
+
3
+ # Run with:
4
+ # jruby -J-Dcom.sun.management.jmxremote -Ilib examples/ruby_mbean.rb
5
+ #
6
+ # and open jconsole to manage the MBean
7
+
8
+ require 'rubygems'
9
+ require 'jmx4r'
10
+
11
+ import java.lang.management.ManagementFactory
12
+ import javax.management.ObjectName
13
+
14
+ class ExampleMBean < DynamicMBean
15
+ rw_attribute :string_attr, :string, "a String attribute"
16
+ rw_attribute :int_attr, :int, "a Integer attribute"
17
+ rw_attribute :long_attr, :long, "a Long attribute"
18
+ rw_attribute :float_attr, :float, "a Float attribute"
19
+ rw_attribute :double_attr, :double, "a Double attribute"
20
+ rw_attribute :boolean_attr, :boolean, "a Boolean attribute"
21
+
22
+ operation "reverse the string passed in parameter"
23
+ parameter :string, "arg", "a String to reverse"
24
+ returns :string
25
+ def reverse(arg)
26
+ arg.reverse
27
+ end
28
+ end
29
+
30
+ mbean = ExampleMBean.new
31
+ object_name = ObjectName.new("jmx4r:name=ExampleMBean")
32
+
33
+ mbeanServer = ManagementFactory.platform_mbean_server
34
+ mbeanServer.register_mbean mbean, object_name
35
+ puts "Open jconsole to manage the MBean #{object_name}"
36
+ puts "When you have finished, type <ENTER> to exit"
37
+ gets
38
+
39
+ mbeanServer.unregister_mbean object_name
40
+ puts "unregistered #{object_name}"
41
+
@@ -0,0 +1,275 @@
1
+ # Copyright (c) 2008 Thomas E Enebo <enebo@acm.org>
2
+ #--
3
+ # taken from the 'jmx' gems in jruby-extras
4
+
5
+ module JMX
6
+ import javax.management.MBeanParameterInfo
7
+ import javax.management.MBeanOperationInfo
8
+ import javax.management.MBeanAttributeInfo
9
+ import javax.management.MBeanInfo
10
+
11
+ # Module that is used to bridge java to ruby and ruby to java types.
12
+ module JavaTypeAware
13
+ # Current list of types we understand If it's not in this list we are
14
+ # assuming that we are going to convert to a java.object
15
+ SIMPLE_TYPES = {
16
+ :boolean => ['java.lang.Boolean', lambda {|param| param}],
17
+ :byte => ['java.lang.Byte', lambda {|param| param.to_i}],
18
+ :int => ['java.lang.Integer', lambda {|param| param.to_i}],
19
+ :long => ['java.lang.Long', lambda {|param| param.to_i}],
20
+ :float => ['java.lang.Float', lambda {|param| param.to_f}],
21
+ :double => ['java.lang.Double', lambda {|param| param.to_f}],
22
+ :list => ['java.util.ArrayList', lambda {|param| param.to_a}],
23
+ :map => ['java.util.HashMap', lambda {|param| param}],
24
+ :set => ['java.util.HashSet', lambda {|param| param}],
25
+ :string => ['java.lang.String', lambda {|param| param.to_s}],
26
+ :void => ['java.lang.Void', lambda {|param| nil}]
27
+ }
28
+
29
+ def to_java_type(type_name)
30
+ SIMPLE_TYPES[type_name][0] || type_name
31
+ end
32
+ #TODO: I'm not sure this is strictly needed, but funky things can happen if you
33
+ # are expecting your attributes (from the ruby side) to be ruby types and they are java types.
34
+ def to_ruby(type_name)
35
+ SIMPLE_TYPES[type_name][1] || lambda {|param| param}
36
+ end
37
+ end
38
+
39
+ class Parameter
40
+ include JavaTypeAware
41
+
42
+ def initialize(type, name, description)
43
+ @type, @name, @description = type, name, description
44
+ end
45
+
46
+ def to_jmx
47
+ MBeanParameterInfo.new @name.to_s, to_java_type(@type), @description
48
+ end
49
+ end
50
+
51
+ class Operation < Struct.new(:description, :parameters, :return_type, :name, :impact)
52
+ include JavaTypeAware
53
+
54
+ def initialize(description)
55
+ super
56
+ self.parameters, self.impact, self.description = [], MBeanOperationInfo::UNKNOWN, description
57
+ end
58
+
59
+ def to_jmx
60
+ java_parameters = parameters.map { |parameter| parameter.to_jmx }
61
+ MBeanOperationInfo.new name.to_s, description, java_parameters.to_java(javax.management.MBeanParameterInfo), to_java_type(return_type), impact
62
+ end
63
+ end
64
+
65
+ class Attribute < Struct.new(:name, :type, :description, :is_reader, :is_writer, :is_iser)
66
+ include JavaTypeAware
67
+
68
+ def initialize(name, type, description, is_rdr, is_wrtr)
69
+ super
70
+ self.description, self.type, self.name = description, type, name
71
+ self.is_reader,self.is_writer, self.is_iser = is_rdr, is_wrtr, false
72
+ end
73
+
74
+ def to_jmx
75
+ MBeanAttributeInfo.new(name.to_s, to_java_type(type), description, is_reader, is_writer, is_iser)
76
+ end
77
+ end
78
+
79
+ # Creators of Ruby based MBeans must inherit this
80
+ # class (<tt>DynamicMBean</tt>) in their own bean classes and then register them with a JMX mbean server.
81
+ # Here is an example:
82
+ # class MyMBean < DynamicMBean
83
+ # rw_attribute :status, :string, "Status information for this process"
84
+ #
85
+ # operation "Shutdown this process"
86
+ # parameter :string, "user_name", "Name of user requesting shutdown"
87
+ # returns :string
88
+ # def shutdown(user_name)
89
+ # "shutdown requests more time"
90
+ # end
91
+ # end
92
+ # Once you have defined your bean class you can start declaring attributes and operations.
93
+ # Attributes come in three flavors: read, write, and read write. Simmilar to the <tt>attr*</tt>
94
+ # helpers, there are helpers that are used to create management attributes. Use +r_attribute+,
95
+ # +w_attribute+, and +rw_attribute+ to declare attributes, and the +operation+, +returns+,
96
+ # and +parameter+ helpers to define a management operation.
97
+ # Creating attributes with the *_attribute convention ALSO creates ruby accessors
98
+ # (it invokes the attr_accessor/attr_reader/attr_writer ruby helpers) to create ruby methods
99
+ # like: user_name= and username. So in your ruby code you can treat the attributes
100
+ # as "regular" ruby accessors
101
+ class DynamicMBean
102
+ import javax.management.MBeanOperationInfo
103
+ import javax.management.MBeanAttributeInfo
104
+ import javax.management.DynamicMBean
105
+ import javax.management.MBeanInfo
106
+ include JMX::JavaTypeAware
107
+
108
+ #NOTE this will not be needed when JRuby-3164 is fixed.
109
+ def self.inherited(cls)
110
+ cls.send(:include, DynamicMBean)
111
+ end
112
+
113
+ # TODO: preserve any original method_added?
114
+ # TODO: Error handling here when it all goes wrong?
115
+ def self.method_added(name) #:nodoc:
116
+ return if Thread.current[:op].nil?
117
+ Thread.current[:op].name = name
118
+ operations << Thread.current[:op].to_jmx
119
+ Thread.current[:op] = nil
120
+ end
121
+
122
+ def self.attributes #:nodoc:
123
+ Thread.current[:attrs] ||= []
124
+ end
125
+
126
+ def self.operations #:nodoc:
127
+ Thread.current[:ops] ||= []
128
+ end
129
+
130
+ # the <tt>rw_attribute</tt> method is used to declare a JMX read write attribute.
131
+ # see the +JavaSimpleTypes+ module for more information about acceptable types
132
+ # usage:
133
+ # rw_attribute :attribute_name, :string, "Description displayed in a JMX console"
134
+ #
135
+ # The name and type parameters are mandatory
136
+ # The description parameter is optional (defaults to the same value than the env: ruby: No such file or directory
137
+ # name parameter in that case)
138
+ # --
139
+ # methods used to create an attribute. They are modeled on the attrib_accessor
140
+ # patterns of creating getters and setters in ruby
141
+ #++
142
+ def self.rw_attribute(name, type, description=nil)
143
+ description ||= name.to_s
144
+ attributes << JMX::Attribute.new(name, type, description, true, true).to_jmx
145
+ attr_accessor name
146
+ #create a "java" oriented accessor method
147
+ define_method("jmx_get_#{name.to_s.downcase}") do
148
+ begin
149
+ #attempt conversion
150
+ java_type = to_java_type(type)
151
+ value = eval "#{java_type}.new(@#{name.to_s})"
152
+ rescue
153
+ #otherwise turn it into a java Object type for now.
154
+ value = eval "Java.ruby_to_java(@#{name.to_s})"
155
+ end
156
+ attribute = javax.management.Attribute.new(name.to_s, value)
157
+ end
158
+
159
+ define_method("jmx_set_#{name.to_s.downcase}") do |value|
160
+ blck = to_ruby(type)
161
+ send "#{name.to_s}=", blck.call(value)
162
+ end
163
+ end
164
+
165
+ # the <tt>r_attribute</tt> method is used to declare a JMX read only attribute.
166
+ # see the +JavaSimpleTypes+ module for more information about acceptable types
167
+ # usage:
168
+ # r_attribute :attribute_name, :string, "Description displayed in a JMX console"
169
+ def self.r_attribute(name, type, description)
170
+ attributes << JMX::Attribute.new(name, type, description, true, false).to_jmx
171
+ attr_reader name
172
+ #create a "java" oriented accessor method
173
+ define_method("jmx_get_#{name.to_s.downcase}") do
174
+ begin
175
+ #attempt conversion
176
+ java_type = to_java_type(type)
177
+ value = eval "#{java_type}.new(@#{name.to_s})"
178
+ rescue
179
+ #otherwise turn it into a java Object type for now.
180
+ value = eval "Java.ruby_to_java(@#{name.to_s})"
181
+ end
182
+ attribute = javax.management.Attribute.new(name.to_s, value)
183
+ end
184
+ end
185
+
186
+ # the <tt>w_attribute</tt> method is used to declare a JMX write only attribute.
187
+ # see the +JavaSimpleTypes+ module for more information about acceptable types
188
+ # usage:
189
+ # w_attribute :attribute_name, :string, "Description displayed in a JMX console"
190
+ def self.w_attribute(name, type, description)
191
+ attributes << JMX::Attribute.new(name, type, description, false, true).to_jmx
192
+ attr_writer name
193
+ define_method("jmx_set_#{name.to_s.downcase}") do |value|
194
+ blck = to_ruby(type)
195
+ eval "@#{name.to_s} = #{blck.call(value)}"
196
+ end
197
+ end
198
+
199
+ # Use the operation method to declare the start of an operation
200
+ # It takes as an optional argument the description for the operation
201
+ # Example:
202
+ # operation "Used to start the service"
203
+ # def start
204
+ # end
205
+ #--
206
+ # Last operation wins if more than one
207
+ #++
208
+ def self.operation(description=nil)
209
+ # Wait to error check until method_added so we can know method name
210
+ Thread.current[:op] = JMX::Operation.new description
211
+ end
212
+
213
+ # Used to declare a parameter (you can declare more than one in succession) that
214
+ # is associated with the currently declared operation.
215
+ # The type is mandatory, the name and description are optional.
216
+ # Example:
217
+ # operation "Used to update the name of a service"
218
+ # parameter :string, "name", "Set the new name of the service"
219
+ # def start(name)
220
+ # ...
221
+ # end
222
+ def self.parameter(type, name=nil, description=nil)
223
+ Thread.current[:op].parameters << JMX::Parameter.new(type, name, description)
224
+ end
225
+
226
+ # Used to declare the return type of the operation
227
+ # operation "Used to update the name of a service"
228
+ # parameter :string, "name", "Set the new name of the service"
229
+ # returns :void
230
+ # def do_stuff
231
+ # ...
232
+ # end
233
+ def self.returns(type)
234
+ Thread.current[:op].return_type = type
235
+ end
236
+
237
+ def initialize(description="")
238
+ name = self.class.to_s
239
+ operations = self.class.operations.to_java(MBeanOperationInfo)
240
+ attributes = self.class.attributes.to_java(MBeanAttributeInfo)
241
+ @info = MBeanInfo.new name, description, attributes, nil, operations, nil
242
+ end
243
+
244
+ # Retrieve the value of the requested attribute
245
+ def getAttribute(attribute)
246
+ send("jmx_get_"+attribute.downcase).value
247
+ end
248
+
249
+ def getAttributes(attributes)
250
+ attrs = javax.management.AttributeList.new
251
+ attributes.each { |attribute| send("jmx_get_"+attribute.downcase) }
252
+ attrs
253
+ end
254
+
255
+ def getMBeanInfo; @info; end
256
+
257
+ def invoke(actionName, params=nil, signature=nil)
258
+ send(actionName, *params)
259
+ end
260
+
261
+ def setAttribute(attribute)
262
+ send("jmx_set_#{attribute.name.downcase}", attribute.value)
263
+ end
264
+
265
+ def setAttributes(attributes)
266
+ attributes.each { |attribute| setAttribute attribute}
267
+ end
268
+
269
+ def to_s; toString; end
270
+ def inspect; toString; end
271
+ def toString; "#@info.class_name: #@info.description"; end
272
+ end
273
+
274
+ end
275
+
data/lib/jconsole.rb CHANGED
@@ -38,7 +38,7 @@ EOCMD
38
38
  cmd << " -J-Dcom.sun.management.jmxremote.access.file=#{access_file}"
39
39
  end
40
40
  Thread.start { system cmd }
41
- sleep 1
41
+ sleep 3
42
42
  end
43
43
 
44
44
  # Stop an instance of JConsole (by killing its process)
data/lib/jmx4r.rb CHANGED
@@ -15,6 +15,7 @@ class String
15
15
  end
16
16
 
17
17
  module JMX
18
+ require 'dynamic_mbean'
18
19
  require 'open_data_helper'
19
20
  require 'objectname_helper'
20
21
  require 'jruby'
@@ -135,23 +136,29 @@ module JMX
135
136
 
136
137
  # Create a connection to a remote MBean server.
137
138
  #
138
- # The args accepts 4 keys:
139
+ # The args accepts the following keys:
139
140
  #
140
- # [:host] the host of the MBean server (defaults to "localhost")
141
- # [:port] the port of the MBean server (defaults to 3000)
142
- # [:url] the url of the MBean server.
143
- # No default.
144
- # if the url is specified, the host & port parameters are
145
- # not taken into account
146
- # [:username] the name of the user (if the MBean server requires authentication).
147
- # No default
148
- # [:password] the password of the user (if the MBean server requires authentication).
149
- # No default
150
- # [:credentials] custom credentials (if the MBean server requires authentication).
151
- # No default. It has precedence over :username and :password (i.e. if
152
- # :credentials is specified, :username & :password are ignored)
153
- # [:provider_package] use to fill the JMXConnectorFactory::PROTOCOL_PROVIDER_PACKAGES
154
- # No default
141
+ # [:host] the host of the MBean server (defaults to "localhost")
142
+ #
143
+ # [:port] the port of the MBean server (defaults to 3000)
144
+ #
145
+ # [:url] the url of the MBean server.
146
+ # No default.
147
+ # if the url is specified, the host & port parameters are
148
+ # not taken into account
149
+ #
150
+ # [:username] the name of the user (if the MBean server requires authentication).
151
+ # No default
152
+ #
153
+ # [:password] the password of the user (if the MBean server requires authentication).
154
+ # No default
155
+ #
156
+ # [:credentials] custom credentials (if the MBean server requires authentication).
157
+ # No default. It has precedence over :username and :password (i.e. if
158
+ # :credentials is specified, :username & :password are ignored)
159
+ #
160
+ # [:provider_package] use to fill the JMXConnectorFactory::PROTOCOL_PROVIDER_PACKAGES.
161
+ # No default
155
162
  #
156
163
  def self.create_connection(args={})
157
164
  host= args[:host] || "localhost"
@@ -6,14 +6,14 @@ require "jmx4r"
6
6
  require "jconsole"
7
7
 
8
8
  class TestAttribute < Test::Unit::TestCase
9
+ import java.lang.management.ManagementFactory
10
+
9
11
  def setup
10
- JConsole::start
11
- @memory = JMX::MBean.find_by_name "java.lang:type=Memory"
12
+ @memory = JMX::MBean.find_by_name "java.lang:type=Memory", :connection => ManagementFactory.platform_mbean_server
12
13
  end
13
14
 
14
15
  def teardown
15
16
  JMX::MBean.remove_connection
16
- JConsole::stop
17
17
  end
18
18
 
19
19
  def test_unknwown_attribute
@@ -28,6 +28,7 @@ class TestAttribute < Test::Unit::TestCase
28
28
  assert_equal false, @memory.verbose
29
29
  @memory.verbose = true
30
30
  assert_equal true, @memory.verbose
31
+ @memory.verbose = false
31
32
  end
32
33
 
33
34
  def test_non_writable_attribute
@@ -6,9 +6,10 @@ require "jmx4r"
6
6
  require "jconsole"
7
7
 
8
8
  class TestCompositeData < Test::Unit::TestCase
9
+ import java.lang.management.ManagementFactory
10
+
9
11
  def setup
10
- JConsole::start
11
- memory = JMX::MBean.find_by_name "java.lang:type=Memory"
12
+ memory = JMX::MBean.find_by_name "java.lang:type=Memory", :connection => ManagementFactory.platform_mbean_server
12
13
  # heap_memory_usage is a CompositeData
13
14
  @heap = memory.heap_memory_usage
14
15
  end
@@ -16,7 +17,6 @@ class TestCompositeData < Test::Unit::TestCase
16
17
  def teardown
17
18
  @heap = nil
18
19
  JMX::MBean.remove_connection
19
- JConsole::stop
20
20
  end
21
21
 
22
22
  # use #map to check that CompositeData includes Enumerable
@@ -0,0 +1,79 @@
1
+ # Copyright 2008 Jeff Mesnil (http://jmesnil.net)
2
+
3
+ require "test/unit"
4
+ require "jmx4r"
5
+
6
+
7
+ class TestDynamicMBean < Test::Unit::TestCase
8
+
9
+ import java.lang.management.ManagementFactory
10
+ import javax.management.ObjectName
11
+
12
+ class AttributeTypesMBean < JMX::DynamicMBean
13
+ rw_attribute :string_attr, :string, "a String attribute"
14
+ rw_attribute :byte_attr, :byte, "a Byte attribute"
15
+ rw_attribute :int_attr, :int, "a Integer attribute"
16
+ rw_attribute :long_attr, :long, "a Long attribute"
17
+ rw_attribute :float_attr, :float, "a Float attribute"
18
+ rw_attribute :double_attr, :double, "a Double attribute"
19
+ rw_attribute :list_attr, :list, "a List attribute"
20
+ rw_attribute :map_attr, :map, "a Map attribute"
21
+ rw_attribute :set_attr, :set, "a Set attribute"
22
+ rw_attribute :boolean_attr, :boolean, "a Boolean attribute"
23
+ end
24
+
25
+ def test_attribute_types
26
+ mbean = AttributeTypesMBean.new
27
+ mbeanServer = ManagementFactory.platform_mbean_server
28
+ mbeanServer.register_mbean mbean, ObjectName.new("jmx4r:name=AttributeTypesMBean")
29
+
30
+ mbean = JMX::MBean.find_by_name "jmx4r:name=AttributeTypesMBean", :connection => mbeanServer
31
+ mbean.string_attr = "test"
32
+ assert_equal("test", mbean.string_attr)
33
+
34
+ mbean.byte_attr = 9
35
+ assert_equal(9, mbean.byte_attr)
36
+
37
+ mbean.int_attr = 23
38
+ assert_equal(23, mbean.int_attr)
39
+
40
+ mbean.long_attr = 33
41
+ assert_equal(33, mbean.long_attr)
42
+
43
+ mbean.float_attr = 91.0
44
+ assert_equal(91.0, mbean.float_attr)
45
+
46
+ mbean.float_attr = 7.0
47
+ assert_equal(7.0, mbean.float_attr)
48
+
49
+ mbean.list_attr = [1, 2, 3]
50
+ assert_equal([1, 2, 3], mbean.list_attr.to_a)
51
+
52
+ mbean.set_attr = [1, 2, 3]
53
+ assert_equal([1, 2, 3].sort, mbean.list_attr.to_a.sort)
54
+
55
+ mbean.map_attr = { "a" => 1, "b" => 2}
56
+ assert_equal({ "a" => 1, "b" => 2}.to_a.sort, mbean.map_attr.to_a.sort)
57
+
58
+ mbean.boolean_attr = true
59
+ assert_equal(true, mbean.boolean_attr)
60
+ end
61
+
62
+ class OperationInvocationMBean < JMX::DynamicMBean
63
+ operation "reverse the string passed in parameter"
64
+ parameter :string, "arg", "a String to reverse"
65
+ returns :string
66
+ def reverse(arg)
67
+ arg.reverse
68
+ end
69
+ end
70
+
71
+ def test_operation_invocation
72
+ mbean = OperationInvocationMBean.new
73
+ mbeanServer = ManagementFactory.platform_mbean_server
74
+ mbeanServer.register_mbean mbean, ObjectName.new("jmx4r:name=OperationInvocationMBean")
75
+
76
+ mbean = JMX::MBean.find_by_name "jmx4r:name=OperationInvocationMBean", :connection => mbeanServer
77
+ assert_equal("oof", mbean.reverse("foo"))
78
+ end
79
+ end
data/test/ts_all.rb CHANGED
@@ -7,3 +7,5 @@ require "tc_auth"
7
7
  require "tc_multiple_connections"
8
8
  require "tc_attributes"
9
9
  require "tc_composite_data"
10
+ require "tc_dynamic_mbean"
11
+
metadata CHANGED
@@ -1,13 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
- extensions: []
2
+ required_ruby_version: !ruby/object:Gem::Requirement
3
+ requirements:
4
+ - - '>='
5
+ - !ruby/object:Gem::Version
6
+ version: "0"
7
+ version:
8
+ email: jmesnil@gmail.com
9
+ cert_chain: []
3
10
 
11
+ summary: jmx4r is a JMX library for JRuby
12
+ post_install_message:
13
+ extra_rdoc_files:
14
+ - README.rdoc
15
+ - LICENSE.txt
4
16
  homepage: http://jmesnil.net/wiki/Jmx4r
17
+ signing_key:
18
+ name: jmx4r
19
+ rdoc_options:
20
+ - --title
21
+ - jmx4r Documentation
22
+ - --main
23
+ - README.rdoc
24
+ rubyforge_project: jmx4r
25
+ autorequire:
26
+ licenses: []
27
+
5
28
  executables: []
6
29
 
7
- version: !ruby/object:Gem::Version
8
- version: 0.0.7
9
- post_install_message:
10
- date: 2009-02-11 23:00:00 +00:00
30
+ description: |
31
+ jmx4r is a JMX library for JRuby
32
+ specification_version: 3
33
+ default_executable:
11
34
  files:
12
35
  - examples/class_loading.rb
13
36
  - examples/jvm_mngmt.rb
@@ -15,7 +38,9 @@ files:
15
38
  - examples/memory.rb
16
39
  - examples/memory_on_many_nodes.rb
17
40
  - examples/memory_types.rb
41
+ - examples/ruby_mbean.rb
18
42
  - examples/runtime_sysprops.rb
43
+ - lib/dynamic_mbean.rb
19
44
  - lib/jconsole.rb
20
45
  - lib/jmx4r.rb
21
46
  - lib/objectname_helper.rb
@@ -24,53 +49,34 @@ files:
24
49
  - test/tc_auth.rb
25
50
  - test/tc_composite_data.rb
26
51
  - test/tc_connection.rb
52
+ - test/tc_dynamic_mbean.rb
27
53
  - test/tc_multiple_connections.rb
28
54
  - test/ts_all.rb
29
55
  - Rakefile
30
56
  - README.rdoc
31
57
  - LICENSE.txt
32
- rubygems_version: 1.3.1
33
- rdoc_options:
34
- - --title
35
- - jmx4r Documentation
36
- - --main
37
- - README.rdoc
38
- signing_key:
39
- cert_chain: []
40
-
41
- name: jmx4r
42
- has_rdoc: true
43
- platform: ruby
44
- summary: jmx4r is a JMX library for JRuby
45
- default_executable:
46
- bindir: bin
47
58
  required_rubygems_version: !ruby/object:Gem::Requirement
48
- version:
49
59
  requirements:
50
60
  - - '>='
51
61
  - !ruby/object:Gem::Version
52
62
  version: "0"
53
- required_ruby_version: !ruby/object:Gem::Requirement
54
63
  version:
55
- requirements:
56
- - - '>='
57
- - !ruby/object:Gem::Version
58
- version: "0"
59
- require_paths:
60
- - lib
61
- specification_version: 2
62
- test_files:
63
- - test/ts_all.rb
64
- dependencies: []
64
+ extensions: []
65
+
66
+ rubygems_version: 1.3.3
67
+ requirements: []
65
68
 
66
- description: jmx4r is a JMX library for JRuby
67
- email: jmesnil@gmail.com
68
69
  authors:
69
70
  - Jeff Mesnil
70
- extra_rdoc_files:
71
- - README.rdoc
72
- - LICENSE.txt
73
- requirements: []
71
+ date: 2009-06-14 22:00:00 +00:00
72
+ platform: ruby
73
+ test_files:
74
+ - test/ts_all.rb
75
+ version: !ruby/object:Gem::Version
76
+ version: 0.0.8
77
+ require_paths:
78
+ - lib
79
+ dependencies: []
74
80
 
75
- rubyforge_project: jmx4r
76
- autorequire:
81
+ bindir: bin
82
+ has_rdoc: true