mouse 0.0.1 → 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.
- data/History.markdown +20 -6
- data/README.markdown +3 -3
- data/ext/mouse/mouse.c +187 -11
- data/ext/mouse/mouser.c +7 -7
- data/ext/mouse/mouser.h +5 -3
- data/lib/mouse.rb +12 -4
- data/lib/mouse/version.rb +1 -1
- metadata +17 -10
data/History.markdown
CHANGED
@@ -1,10 +1,24 @@
|
|
1
|
+
# 0.1.0 - The basic API
|
2
|
+
|
3
|
+
* Fixed animation timing (sleep(3) type coercion issue)
|
4
|
+
|
5
|
+
* Added `Mouse#click_down`
|
6
|
+
* Added `Mouse#click_up`
|
7
|
+
* Added `Mouse#click`
|
8
|
+
* Added `Mouse#secondary_click`
|
9
|
+
* Added `Mouse#arbitrary_click`
|
10
|
+
* Added `Mouse#middle_click`
|
11
|
+
* Added `Mouse#multi_click`
|
12
|
+
* Added `Mouse#double_click`
|
13
|
+
* Added `Mouse#triple_click`
|
14
|
+
|
1
15
|
# 0.0.1 - Initial Release
|
2
16
|
|
3
17
|
* CRuby and MacRuby compatible
|
4
18
|
|
5
|
-
* Added Mouse.current_position
|
6
|
-
* Added Mouse.move_to
|
7
|
-
* Added Mouse.drag_to
|
8
|
-
* Added Mouse.scroll
|
9
|
-
* Added CGPoint on CRuby to mimic CGPoint in MacRuby
|
10
|
-
* Added Array#to_point to mimic MacRuby allowing Arrays for structs
|
19
|
+
* Added `Mouse.current_position`
|
20
|
+
* Added `Mouse.move_to`
|
21
|
+
* Added `Mouse.drag_to`
|
22
|
+
* Added `Mouse.scroll`
|
23
|
+
* Added `CGPoint` on CRuby to mimic `CGPoint` in MacRuby
|
24
|
+
* Added `Array#to_point` to mimic MacRuby allowing Arrays for structs
|
data/README.markdown
CHANGED
@@ -4,7 +4,9 @@ A port of mouse.rb from [AXElements](http://github.com/Marketcircle/AXElements),
|
|
4
4
|
but cleaned up and rewritten in C to be more portable across languages and
|
5
5
|
runtimes.
|
6
6
|
|
7
|
-
|
7
|
+
## Examples
|
8
|
+
|
9
|
+
TODO :P
|
8
10
|
|
9
11
|
## Copyright
|
10
12
|
|
@@ -34,5 +36,3 @@ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
|
34
36
|
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
35
37
|
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
36
38
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
37
|
-
|
38
|
-
|
data/ext/mouse/mouse.c
CHANGED
@@ -41,8 +41,8 @@ rb_mouse_unwrap_point(VALUE point)
|
|
41
41
|
#endif
|
42
42
|
}
|
43
43
|
|
44
|
-
|
45
|
-
* Returns the current co-ordinates of the
|
44
|
+
/*
|
45
|
+
* Returns the current co-ordinates of the mouse cursor
|
46
46
|
*
|
47
47
|
* @return [CGPoint]
|
48
48
|
*/
|
@@ -53,8 +53,8 @@ rb_mouse_current_position(VALUE self)
|
|
53
53
|
return CURRENT_POSITION;
|
54
54
|
}
|
55
55
|
|
56
|
-
|
57
|
-
* Move the cursor to the given co-ordinates
|
56
|
+
/*
|
57
|
+
* Move the mouse cursor to the given co-ordinates
|
58
58
|
*
|
59
59
|
* @param point [CGPoint,Array(Number,Number),#to_point]
|
60
60
|
* @return [CGPoint]
|
@@ -67,8 +67,8 @@ rb_mouse_move_to(VALUE self, VALUE point)
|
|
67
67
|
return CURRENT_POSITION;
|
68
68
|
}
|
69
69
|
|
70
|
-
|
71
|
-
* Drag the cursor to the given co-ordinates
|
70
|
+
/*
|
71
|
+
* Drag the mouse cursor to the given co-ordinates
|
72
72
|
*
|
73
73
|
* @param point [CGPoint,Array(Number,Number),#to_point]
|
74
74
|
* @return [CGPoint]
|
@@ -81,11 +81,13 @@ rb_mouse_drag_to(VALUE self, VALUE point)
|
|
81
81
|
return CURRENT_POSITION;
|
82
82
|
}
|
83
83
|
|
84
|
-
|
84
|
+
/*
|
85
85
|
* Generate `amount` scroll events at the current cursor position
|
86
86
|
*
|
87
|
+
* Returns number of lines scrolled.
|
88
|
+
*
|
87
89
|
* @param amount [Number]
|
88
|
-
* @return [
|
90
|
+
* @return [Number]
|
89
91
|
*/
|
90
92
|
static
|
91
93
|
VALUE
|
@@ -93,24 +95,198 @@ rb_mouse_scroll(VALUE self, VALUE amount)
|
|
93
95
|
{
|
94
96
|
amount = rb_funcall(amount, sel_to_i, 0);
|
95
97
|
mouse_scroll(NUM2SIZET(amount));
|
98
|
+
return amount;
|
99
|
+
}
|
100
|
+
|
101
|
+
/*
|
102
|
+
* Generate the down click part of a click event at the current position
|
103
|
+
*
|
104
|
+
* This might be useful in concert with {Mouse.click_up} if you want
|
105
|
+
* to inject some behaviour between the down and up click events.
|
106
|
+
*
|
107
|
+
* @return [CGPoint]
|
108
|
+
*/
|
109
|
+
static
|
110
|
+
VALUE
|
111
|
+
rb_mouse_click_down(VALUE self)
|
112
|
+
{
|
113
|
+
mouse_click_down();
|
114
|
+
return CURRENT_POSITION;
|
115
|
+
}
|
116
|
+
|
117
|
+
/*
|
118
|
+
* Generate the up click part of a click event at the current position
|
119
|
+
*
|
120
|
+
* This might be useful in concert with {Mouse.click_down} if you want
|
121
|
+
* to inject some behaviour between the down and up click events.
|
122
|
+
*
|
123
|
+
* @return [CGPoint]
|
124
|
+
*/
|
125
|
+
static
|
126
|
+
VALUE
|
127
|
+
rb_mouse_click_up(VALUE self)
|
128
|
+
{
|
129
|
+
mouse_click_up();
|
130
|
+
return CURRENT_POSITION;
|
131
|
+
}
|
132
|
+
|
133
|
+
/*
|
134
|
+
* Generate a regular click event at the current mouse position
|
135
|
+
*
|
136
|
+
* @return [CGPoint]
|
137
|
+
*/
|
138
|
+
static
|
139
|
+
VALUE
|
140
|
+
rb_mouse_click(VALUE self)
|
141
|
+
{
|
142
|
+
mouse_click();
|
143
|
+
return CURRENT_POSITION;
|
144
|
+
}
|
145
|
+
|
146
|
+
/*
|
147
|
+
* Generate a secondary click at the current mouse position
|
148
|
+
*
|
149
|
+
* Secondary click is often referred to as "right click".
|
150
|
+
*
|
151
|
+
* @return [CGPoint]
|
152
|
+
*/
|
153
|
+
static
|
154
|
+
VALUE
|
155
|
+
rb_mouse_secondary_click(VALUE self)
|
156
|
+
{
|
157
|
+
mouse_secondary_click();
|
158
|
+
return CURRENT_POSITION;
|
159
|
+
}
|
160
|
+
|
161
|
+
/*
|
162
|
+
* Generate a click using an arbitrary mouse button at the current position
|
163
|
+
*
|
164
|
+
* Numbers are used to map the mouse buttons. At the time of writing,
|
165
|
+
* the documented values are:
|
166
|
+
*
|
167
|
+
* - `kCGMouseButtonLeft = 0`
|
168
|
+
* - `kCGMouseButtonRight = 1`
|
169
|
+
* - `kCGMouseButtonCenter = 2`
|
170
|
+
*
|
171
|
+
* And the rest are not documented! Though they should be easy enough
|
172
|
+
* to figure out. See the `CGMouseButton` enum in the reference
|
173
|
+
* documentation for the most up to date list.
|
174
|
+
*
|
175
|
+
* @param button [Number,#to_i]
|
176
|
+
* @return [CGPoint]
|
177
|
+
*/
|
178
|
+
static
|
179
|
+
VALUE
|
180
|
+
rb_mouse_arbitrary_click(VALUE self, VALUE button)
|
181
|
+
{
|
182
|
+
button = rb_funcall(button, sel_to_i, 0);
|
183
|
+
mouse_arbitrary_click(NUM2UINT(button));
|
184
|
+
return CURRENT_POSITION;
|
185
|
+
}
|
186
|
+
|
187
|
+
/*
|
188
|
+
* Generate a click event for the middle mouse button at the current position
|
189
|
+
*
|
190
|
+
* It doesn't matter if you don't have a middle mouse button.
|
191
|
+
*
|
192
|
+
* @return [CGPoint]
|
193
|
+
*/
|
194
|
+
static
|
195
|
+
VALUE
|
196
|
+
rb_mouse_middle_click(VALUE self)
|
197
|
+
{
|
198
|
+
mouse_middle_click();
|
199
|
+
return CURRENT_POSITION;
|
200
|
+
}
|
201
|
+
|
202
|
+
/*
|
203
|
+
* Generate a multi-click event at the current mouse position
|
204
|
+
*
|
205
|
+
* Unlike {Mouse.double_click} and {Mouse.triple_click} this will generate
|
206
|
+
* a single event with the given number of clicks.
|
207
|
+
*
|
208
|
+
* @param num_clicks [Number,#to_i]
|
209
|
+
* @return [CGPoint]
|
210
|
+
*/
|
211
|
+
static
|
212
|
+
VALUE
|
213
|
+
rb_mouse_multi_click(VALUE self, VALUE num_clicks)
|
214
|
+
{
|
215
|
+
// TODO: there has got to be a more idiomatic way to do this coercion
|
216
|
+
num_clicks = rb_funcall(num_clicks, sel_to_i, 0);
|
217
|
+
mouse_multi_click(NUM2SIZET(num_clicks));
|
218
|
+
return CURRENT_POSITION;
|
219
|
+
}
|
220
|
+
|
221
|
+
/*
|
222
|
+
* Perform a double click at the given mouse position
|
223
|
+
*
|
224
|
+
* Implemented by first generating a single click, and then a double click.,
|
225
|
+
* Apps seem to respond more consistently to this behaviour since that is
|
226
|
+
* how a human would have to generate a double click event.
|
227
|
+
*
|
228
|
+
* @return [CGPoint]
|
229
|
+
*/
|
230
|
+
static
|
231
|
+
VALUE
|
232
|
+
rb_mouse_double_click(VALUE self)
|
233
|
+
{
|
234
|
+
mouse_double_click();
|
235
|
+
return CURRENT_POSITION;
|
236
|
+
}
|
237
|
+
|
238
|
+
/*
|
239
|
+
* Perform a triple click at the given mouse position
|
240
|
+
*
|
241
|
+
* Implemented by first generating a single click, then a double click,
|
242
|
+
* and finally a triple click. Apps seem to respond more consistently to
|
243
|
+
* this behaviour since that is how a human would have to generate a
|
244
|
+
* triple click event.
|
245
|
+
*
|
246
|
+
* @return [CGPoint]
|
247
|
+
*/
|
248
|
+
static
|
249
|
+
VALUE
|
250
|
+
rb_mouse_triple_click(VALUE self)
|
251
|
+
{
|
252
|
+
mouse_triple_click();
|
96
253
|
return CURRENT_POSITION;
|
97
254
|
}
|
98
255
|
|
99
256
|
void
|
100
257
|
Init_mouse()
|
101
258
|
{
|
259
|
+
// on either supported Ruby, this should be defined by now
|
102
260
|
rb_cCGPoint = rb_const_get(rb_cObject, rb_intern("CGPoint"));
|
103
|
-
|
104
|
-
|
261
|
+
|
262
|
+
sel_x = rb_intern("x");
|
263
|
+
sel_y = rb_intern("y");
|
105
264
|
sel_to_point = rb_intern("to_point");
|
106
265
|
sel_to_i = rb_intern("to_i");
|
107
|
-
sel_new
|
266
|
+
sel_new = rb_intern("new");
|
108
267
|
|
268
|
+
/*
|
269
|
+
* Document-module: Mouse
|
270
|
+
*
|
271
|
+
* Herp Derp TODO
|
272
|
+
*
|
273
|
+
* [Reference](http://developer.apple.com/library/mac/#documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html)
|
274
|
+
*/
|
109
275
|
rb_mMouse = rb_define_module("Mouse");
|
276
|
+
|
110
277
|
rb_funcall(rb_mMouse, rb_intern("extend"), 1, rb_mMouse);
|
111
278
|
|
112
279
|
rb_define_method(rb_mMouse, "current_position", rb_mouse_current_position, 0);
|
113
280
|
rb_define_method(rb_mMouse, "move_to", rb_mouse_move_to, 1);
|
114
281
|
rb_define_method(rb_mMouse, "drag_to", rb_mouse_drag_to, 1);
|
115
282
|
rb_define_method(rb_mMouse, "scroll", rb_mouse_scroll, 1);
|
283
|
+
rb_define_method(rb_mMouse, "click_down", rb_mouse_click_down, 0);
|
284
|
+
rb_define_method(rb_mMouse, "click_up", rb_mouse_click_up, 0);
|
285
|
+
rb_define_method(rb_mMouse, "click", rb_mouse_click, 0);
|
286
|
+
rb_define_method(rb_mMouse, "secondary_click", rb_mouse_secondary_click, 0);
|
287
|
+
rb_define_method(rb_mMouse, "arbitrary_click", rb_mouse_arbitrary_click, 1);
|
288
|
+
rb_define_method(rb_mMouse, "middle_click", rb_mouse_middle_click, 0);
|
289
|
+
rb_define_method(rb_mMouse, "multi_click", rb_mouse_multi_click, 1);
|
290
|
+
rb_define_method(rb_mMouse, "double_click", rb_mouse_double_click, 0);
|
291
|
+
rb_define_method(rb_mMouse, "triple_click", rb_mouse_triple_click, 0);
|
116
292
|
}
|
data/ext/mouse/mouser.c
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
#include <ApplicationServices/ApplicationServices.h>
|
10
10
|
#include "mouser.h"
|
11
11
|
|
12
|
-
static const
|
13
|
-
static const
|
12
|
+
static const uint_t FPS = 120;
|
13
|
+
static const uint_t QUANTUM = 1000000 / 120; // should be FPS, but GCC sucks
|
14
14
|
static const double DEFAULT_DURATION = 0.2; // seconds
|
15
15
|
|
16
16
|
#define NEW_EVENT(type,point,button) CGEventCreateMouseEvent(nil,type,point,button)
|
@@ -35,9 +35,9 @@ static const double DEFAULT_DURATION = 0.2; // seconds
|
|
35
35
|
|
36
36
|
static
|
37
37
|
void
|
38
|
-
mouse_sleep(
|
38
|
+
mouse_sleep(uint_t quanta)
|
39
39
|
{
|
40
|
-
|
40
|
+
usleep(quanta * QUANTUM);
|
41
41
|
}
|
42
42
|
|
43
43
|
CGPoint
|
@@ -175,7 +175,7 @@ mouse_scroll(size_t amount)
|
|
175
175
|
|
176
176
|
|
177
177
|
void
|
178
|
-
mouse_click_down3(CGPoint point,
|
178
|
+
mouse_click_down3(CGPoint point, uint_t sleep_quanta)
|
179
179
|
{
|
180
180
|
POSTRELEASE(NEW_EVENT(kCGEventLeftMouseDown, point, kCGMouseButtonLeft));
|
181
181
|
mouse_sleep(sleep_quanta);
|
@@ -223,7 +223,7 @@ mouse_click()
|
|
223
223
|
|
224
224
|
|
225
225
|
void
|
226
|
-
mouse_secondary_click3(CGPoint point,
|
226
|
+
mouse_secondary_click3(CGPoint point, uint_t sleep_quanta)
|
227
227
|
{
|
228
228
|
CGEventRef base_event = NEW_EVENT(
|
229
229
|
kCGEventRightMouseDown,
|
@@ -252,7 +252,7 @@ mouse_secondary_click()
|
|
252
252
|
|
253
253
|
|
254
254
|
void
|
255
|
-
mouse_arbitrary_click3(CGEventMouseSubtype button, CGPoint point,
|
255
|
+
mouse_arbitrary_click3(CGEventMouseSubtype button, CGPoint point, uint_t sleep_quanta)
|
256
256
|
{
|
257
257
|
CGEventRef base_event = NEW_EVENT(
|
258
258
|
kCGEventOtherMouseDown,
|
data/ext/mouse/mouser.h
CHANGED
@@ -8,6 +8,8 @@
|
|
8
8
|
|
9
9
|
#include <ApplicationServices/ApplicationServices.h>
|
10
10
|
|
11
|
+
typedef unsigned int uint_t;
|
12
|
+
|
11
13
|
enum MouseMovementUnit {
|
12
14
|
kMouseScrollByLine = kCGScrollEventUnitLine,
|
13
15
|
// TODO: might not be real pixels, might be Cocoa co-ords, need to investigate
|
@@ -29,7 +31,7 @@ void mouse_scroll3(size_t amount, enum MouseMovementUnit units, double duration)
|
|
29
31
|
|
30
32
|
void mouse_click_down();
|
31
33
|
void mouse_click_down2(CGPoint point);
|
32
|
-
void mouse_click_down3(CGPoint point,
|
34
|
+
void mouse_click_down3(CGPoint point, uint_t sleep_quanta);
|
33
35
|
|
34
36
|
void mouse_click_up();
|
35
37
|
void mouse_click_up2(CGPoint point);
|
@@ -39,11 +41,11 @@ void mouse_click2(CGPoint point);
|
|
39
41
|
|
40
42
|
void mouse_secondary_click();
|
41
43
|
void mouse_secondary_click2(CGPoint point);
|
42
|
-
void mouse_secondary_click3(CGPoint point,
|
44
|
+
void mouse_secondary_click3(CGPoint point, uint_t sleep_quanta);
|
43
45
|
|
44
46
|
void mouse_arbitrary_click(CGEventMouseSubtype button);
|
45
47
|
void mouse_arbitrary_click2(CGEventMouseSubtype button, CGPoint point);
|
46
|
-
void mouse_arbitrary_click3(CGEventMouseSubtype button, CGPoint point,
|
48
|
+
void mouse_arbitrary_click3(CGEventMouseSubtype button, CGPoint point, uint_t sleep_quanta);
|
47
49
|
|
48
50
|
void mouse_middle_click();
|
49
51
|
void mouse_middle_click2(CGPoint point);
|
data/lib/mouse.rb
CHANGED
@@ -1,12 +1,22 @@
|
|
1
1
|
if RUBY_ENGINE == 'macruby'
|
2
2
|
|
3
|
+
# A workaround that guarantees that `CGPoint` is defined
|
3
4
|
framework '/System/Library/Frameworks/CoreGraphics.framework'
|
4
5
|
|
5
6
|
else
|
6
7
|
|
7
8
|
##
|
8
|
-
#
|
9
|
+
# A structure that contains a point in a two-dimensional coordinate system
|
9
10
|
class CGPoint < Struct.new(:x, :y)
|
11
|
+
|
12
|
+
# @!attribute [rw] x
|
13
|
+
# The `x` co-ordinate of the screen point
|
14
|
+
# @return [Number]
|
15
|
+
|
16
|
+
# @!attribute [rw] y
|
17
|
+
# The `y` co-ordinate of the screen point
|
18
|
+
# @return [Number]
|
19
|
+
|
10
20
|
##
|
11
21
|
# Return a nice string representation of the point
|
12
22
|
#
|
@@ -16,13 +26,11 @@ else
|
|
16
26
|
def inspect
|
17
27
|
"#<CGPoint x=#{self[:x]} y=#{self[:y]}>"
|
18
28
|
end
|
29
|
+
|
19
30
|
end
|
20
31
|
|
21
32
|
end
|
22
33
|
|
23
|
-
|
24
|
-
##
|
25
|
-
# Mouse extensions to `CGPoint`
|
26
34
|
class CGPoint
|
27
35
|
##
|
28
36
|
# Returns the receiver, since the receiver is already a {CGPoint}
|
data/lib/mouse/version.rb
CHANGED
metadata
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mouse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.0.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Mark Rada
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: yard
|
16
|
-
prerelease: false
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
18
|
requirements:
|
@@ -21,6 +20,7 @@ dependencies:
|
|
21
20
|
- !ruby/object:Gem::Version
|
22
21
|
version: 0.8.3
|
23
22
|
type: :development
|
23
|
+
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
@@ -29,7 +29,6 @@ dependencies:
|
|
29
29
|
version: 0.8.3
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: kramdown
|
32
|
-
prerelease: false
|
33
32
|
requirement: !ruby/object:Gem::Requirement
|
34
33
|
none: false
|
35
34
|
requirements:
|
@@ -37,6 +36,7 @@ dependencies:
|
|
37
36
|
- !ruby/object:Gem::Version
|
38
37
|
version: 0.14.1
|
39
38
|
type: :development
|
39
|
+
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
@@ -45,7 +45,6 @@ dependencies:
|
|
45
45
|
version: 0.14.1
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: rake-compiler
|
48
|
-
prerelease: false
|
49
48
|
requirement: !ruby/object:Gem::Requirement
|
50
49
|
none: false
|
51
50
|
requirements:
|
@@ -53,13 +52,15 @@ dependencies:
|
|
53
52
|
- !ruby/object:Gem::Version
|
54
53
|
version: 0.8.1
|
55
54
|
type: :development
|
55
|
+
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 0.8.1
|
62
|
-
description: 'mouse is a rich, high level wrapper around OS X CGEvent APIs that
|
62
|
+
description: ! 'mouse is a rich, high level wrapper around OS X CGEvent APIs that
|
63
|
+
allow
|
63
64
|
|
64
65
|
programmatic manipulation of the mouse cursor.
|
65
66
|
|
@@ -94,15 +95,21 @@ require_paths:
|
|
94
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
95
96
|
none: false
|
96
97
|
requirements:
|
97
|
-
- - '>='
|
98
|
+
- - ! '>='
|
98
99
|
- !ruby/object:Gem::Version
|
99
|
-
version:
|
100
|
+
version: '0'
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
hash: 1024147063034037924
|
100
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
105
|
none: false
|
102
106
|
requirements:
|
103
|
-
- - '>='
|
107
|
+
- - ! '>='
|
104
108
|
- !ruby/object:Gem::Version
|
105
|
-
version:
|
109
|
+
version: '0'
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
hash: 1024147063034037924
|
106
113
|
requirements: []
|
107
114
|
rubyforge_project:
|
108
115
|
rubygems_version: 1.8.24
|