ruby-gr 0.0.18 → 0.0.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +94 -17
- data/lib/gr.rb +2 -2
- data/lib/gr/plot.rb +17 -19
- data/lib/gr_commons/version.rb +1 -1
- data/lib/grm.rb +45 -0
- data/lib/grm/ffi.rb +63 -0
- data/lib/grm/grmbase.rb +13 -0
- data/lib/grm/version.rb +5 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07da9fb7d76476cb7598eac022e5a1b5e4004af6e0bdd0e87d1acd817f36abc7
|
4
|
+
data.tar.gz: 87961c4df97b188a7c5fbd77a9e0ac993a6190ddc9e3fc2f9c30b2c7e88c19cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb5d8869e80d488a5b2076eb80125136f27f18b4e352066ba1c5260b343440b7474ace25d708464c827954c1f02f47c682e83eff0b3e0a47d0374b58bc74ad09
|
7
|
+
data.tar.gz: 677a4c8839974102a3d4ac618f41cd06b23e4c7d7d68f70110efb7f838c1689588fc00f8c462eabfe724c7fe7a639319bd83728d047901ddd9013bba3c3db029
|
data/README.md
CHANGED
@@ -6,9 +6,21 @@
|
|
6
6
|
[![Gitter Chat](https://badges.gitter.im/red-data-tools/en.svg)](https://gitter.im/red-data-tools/en)
|
7
7
|
[![Docs Latest](https://img.shields.io/badge/docs-latest-blue.svg)](https://rubydoc.info/gems/ruby-gr)
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
![rdatasets-1](https://i.imgur.com/XEQ6wKs.png)
|
10
|
+
![stem](https://i.imgur.com/3w0Ejrm.png)
|
11
|
+
![histogram](https://i.imgur.com/xUdoA2s.png)
|
12
|
+
![barplot](https://i.imgur.com/52bOFKE.png)
|
13
|
+
![scatter3](https://i.imgur.com/yTTVetQ.png)
|
14
|
+
![volume](https://i.imgur.com/CuRN6oC.png)
|
15
|
+
![griddata](https://i.imgur.com/58HdYDo.png)
|
16
|
+
![2darray](https://i.imgur.com/aKR2FJG.png)
|
17
|
+
![2dpolararray](https://i.imgur.com/cmSrxvS.png)
|
18
|
+
![hexbin](https://i.imgur.com/unWhQHr.png)
|
19
|
+
![rdatasets-2](https://i.imgur.com/ZPit2F5.png)
|
20
|
+
![rdatasets-3](https://i.imgur.com/TbNoxwy.png)
|
21
|
+
![surface](https://i.imgur.com/sWdaHme.png)
|
22
|
+
![face](https://i.imgur.com/uLCKi2r.png)
|
23
|
+
![shade](https://i.imgur.com/VJmS3EQ.png)
|
12
24
|
|
13
25
|
:bar_chart: [GR framework](https://github.com/sciapp/gr) - the graphics library for visualization - for Ruby
|
14
26
|
|
@@ -47,43 +59,101 @@ y = [0.3, 0.5, 0.4, 0.2, 0.6, 0.7]
|
|
47
59
|
GR.plot(x, y)
|
48
60
|
```
|
49
61
|
|
50
|
-
|
62
|
+
<p align="center">
|
63
|
+
<img src="https://user-images.githubusercontent.com/5798442/84570709-242ab880-adca-11ea-9099-3a6b3418bf19.png">
|
64
|
+
</p>
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
require 'gr/plot'
|
68
|
+
|
69
|
+
x = Numo::DFloat.linspace(0, 10, 101)
|
70
|
+
y1 = Numo::NMath.sin(x)
|
71
|
+
y2 = Numo::NMath.cos(x)
|
72
|
+
|
73
|
+
GR.plot(
|
74
|
+
[x, y1, 'bo'], [x, y2, 'g*'],
|
75
|
+
title: "Multiple plot example",
|
76
|
+
xlabel: "x",
|
77
|
+
ylabel: "y",
|
78
|
+
ylim: [-1.2, 1.2],
|
79
|
+
labels: ["sin(x)", "cos(x)"],
|
80
|
+
location: 11
|
81
|
+
)
|
82
|
+
```
|
83
|
+
|
84
|
+
Save to PNG file.
|
51
85
|
|
52
|
-
|
53
|
-
|
86
|
+
```ruby
|
87
|
+
GR.savefig("figure.png")
|
88
|
+
```
|
54
89
|
|
55
90
|
## Features
|
56
91
|
|
57
|
-
|
92
|
+
There are two layers to the GR.rb API.
|
58
93
|
|
59
|
-
A simple, matlab-style API.
|
94
|
+
#### GR::Plot - A simple, matlab-style API.
|
60
95
|
|
61
96
|
```ruby
|
62
97
|
require 'gr/plot'
|
98
|
+
GR.plot(x, y)
|
63
99
|
```
|
64
100
|
|
65
|
-
|
66
|
-
|
67
|
-
|
101
|
+
List of vailable functions. See [GR.rb Wiki](https://github.com/red-data-tools/GR.rb/wiki) for details.
|
102
|
+
|
103
|
+
[`plot`](../../wiki/Plotting-functions#plot)
|
104
|
+
[`step`](../../wiki/Plotting-functions#step)
|
105
|
+
[`plot3`](../../wiki/Plotting-functions#plot3)
|
106
|
+
[`polar`](../../wiki/Plotting-functions#polar)
|
107
|
+
[`scatter`](../../wiki/Plotting-functions#scatter)
|
108
|
+
[`scatter3`](../../wiki/Plotting-functions#scatter3)
|
109
|
+
[`stem`](../../wiki/Plotting-functions#stem)
|
110
|
+
[`barplot`](../../wiki/Plotting-functions#barplot)
|
111
|
+
[`histogram`](../../wiki/Plotting-functions#histogram)
|
112
|
+
[`polarhistogram`](../../wiki/Plotting-functions#polarhistogram)
|
113
|
+
[`hexbin`](../../wiki/Plotting-functions#hexbin)
|
114
|
+
[`contour`](../../wiki/Plotting-functions#contour)
|
115
|
+
[`contourf`](../../wiki/Plotting-functions#contourf)
|
116
|
+
[`tricont`](../../wiki/Plotting-functions#tricont)
|
117
|
+
[`surface`](../../wiki/Plotting-functions#surface)
|
118
|
+
[`trisurf`](../../wiki/Plotting-functions#trisurf)
|
119
|
+
[`wireframe`](../../wiki/Plotting-functions#wireframe)
|
120
|
+
[`volume`](../../wiki/Plotting-functions#volume)
|
121
|
+
[`heatmap`](../../wiki/Plotting-functions#heatmap)
|
122
|
+
[`polarheatmap`](../../wiki/Plotting-functions#polarheatmap)
|
123
|
+
[`shade`](../../wiki/Plotting-functions#shade)
|
124
|
+
[`imshow`](../../wiki/Plotting-functions#imshow)
|
125
|
+
[`isosurface`](../../wiki/Plotting-functions#isosurface)
|
126
|
+
|
127
|
+
#### GR - A module for calling native GR functions.
|
68
128
|
|
69
129
|
```ruby
|
70
130
|
require 'gr'
|
131
|
+
|
132
|
+
# For example
|
133
|
+
GR.setviewport(0.1, 0.9, 0.1, 0.9)
|
134
|
+
GR.setwindow(0.0, 20.0, 0.0, 20.0)
|
71
135
|
```
|
72
136
|
|
73
|
-
#### GR3
|
137
|
+
#### GR3 - A module for calling native GR3 functions.
|
74
138
|
|
75
139
|
```ruby
|
76
140
|
require 'gr3'
|
141
|
+
|
142
|
+
# For example
|
143
|
+
GR3.cameralookat(-3, 2, -2, 0, 0, 0, 0, 0, -1)
|
77
144
|
```
|
78
145
|
|
146
|
+
* GR.rb can be used in Jupyter Notebook.
|
147
|
+
|
79
148
|
## Documentation
|
80
149
|
|
150
|
+
- [GR.rb Wiki](https://github.com/red-data-tools/GR.rb/wiki)
|
81
151
|
- [GR Framework](https://gr-framework.org/)
|
82
152
|
- [GR.rb API Documentation](https://rubydoc.info/gems/ruby-gr)
|
83
153
|
|
84
154
|
## GR Installation
|
85
155
|
|
86
|
-
###
|
156
|
+
### Installing an official release (recommended)
|
87
157
|
|
88
158
|
Download the [latest release](https://github.com/sciapp/gr/releases).
|
89
159
|
|
@@ -95,7 +165,12 @@ export GRDIR="your/path/to/gr"
|
|
95
165
|
|
96
166
|
* macOS Catalina and macOS Mojave: See the "How to open an app that hasn’t been notarized or is from an unidentified developer" section of [Safely open apps on your Mac](https://support.apple.com/en-us/HT202491) in the Apple documentation.
|
97
167
|
|
98
|
-
###
|
168
|
+
### Using your package manager
|
169
|
+
|
170
|
+
* The third party GR packages for Mac, Linux and Windows (for advanced users) are available.
|
171
|
+
* If you find problems, please report to the [issue](https://github.com/red-data-tools/GR.rb/issues).
|
172
|
+
|
173
|
+
#### Mac: Homebrew
|
99
174
|
|
100
175
|
```sh
|
101
176
|
brew install libgr
|
@@ -107,11 +182,13 @@ Set environment variable GRDIR.
|
|
107
182
|
export GRDIR=$(brew --prefix libgr)
|
108
183
|
```
|
109
184
|
|
110
|
-
|
185
|
+
#### Linux: APT Yum
|
186
|
+
|
187
|
+
[packages.red-data-tools.org](https://github.com/red-data-tools/packages.red-data-tools.org) provides `libgr-dev` and `libgr3-dev`.
|
111
188
|
|
112
|
-
|
189
|
+
#### Windows: MSYS2
|
113
190
|
|
114
|
-
|
191
|
+
If you are using Rubyinstaller, pacman will automatically install [mingw-w64-gr](https://packages.msys2.org/base/mingw-w64-gr) when the gem is installed.
|
115
192
|
|
116
193
|
## Backend for Charty
|
117
194
|
|
data/lib/gr.rb
CHANGED
@@ -1595,10 +1595,10 @@ module GR
|
|
1595
1595
|
super(npoints, x, y, ntri, triangles.ref)
|
1596
1596
|
end
|
1597
1597
|
if n_tri > 0
|
1598
|
-
tri = triangles.to_str(
|
1598
|
+
tri = triangles.to_str(dim * n_tri * Fiddle::SIZEOF_INT).unpack('l*') # Int32
|
1599
1599
|
# Ruby : 0-based indexing
|
1600
1600
|
# Julia : 1-based indexing
|
1601
|
-
tri = tri.each_slice(
|
1601
|
+
tri = tri.each_slice(dim).to_a
|
1602
1602
|
[n_tri, tri]
|
1603
1603
|
else
|
1604
1604
|
0
|
data/lib/gr/plot.rb
CHANGED
@@ -37,11 +37,12 @@ module GR
|
|
37
37
|
volume].freeze # the name might be changed in the future.
|
38
38
|
|
39
39
|
# Keyword options conform to GR.jl.
|
40
|
-
KW_ARGS = %i[accelerate algorithm alpha backgroundcolor barwidth baseline
|
41
|
-
clabels color colormap figsize horizontal
|
42
|
-
|
43
|
-
|
44
|
-
|
40
|
+
KW_ARGS = %i[accelerate algorithm alpha ax backgroundcolor barwidth baseline
|
41
|
+
clabels clear clim color colormap crange figsize horizontal
|
42
|
+
isovalue kind label labels levels location nbins ratio rotation
|
43
|
+
scale size spec subplot tilt title update xaxis xflip xform
|
44
|
+
xlabel xlim xlog xrange yaxis yflip ylabel ylim ylog zflip
|
45
|
+
yrange viewport vp where window zaxis zlabel zlim zlog zrange].freeze
|
45
46
|
|
46
47
|
@last_plot = nil
|
47
48
|
class << self
|
@@ -181,12 +182,8 @@ module GR
|
|
181
182
|
minmax
|
182
183
|
end
|
183
184
|
|
184
|
-
major_count =
|
185
|
-
|
186
|
-
2
|
187
|
-
else
|
188
|
-
5
|
189
|
-
end
|
185
|
+
major_count = %i[wireframe surface plot3 scatter3 polar polarhist
|
186
|
+
polarheatmap trisurf volume].include?(kind) ? 2 : 5
|
190
187
|
|
191
188
|
xmin, xmax = kvs[:xrange]
|
192
189
|
if (scale & GR::OPTION_X_LOG) == 0
|
@@ -272,7 +269,7 @@ module GR
|
|
272
269
|
ratio = kvs[:ratio]
|
273
270
|
xtick, xorg, majorx = kvs[:xaxis]
|
274
271
|
ytick, yorg, majory = kvs[:yaxis]
|
275
|
-
drawgrid = kvs[:grid]
|
272
|
+
drawgrid = kvs.has_key?(:grid) ? kvs[:grid] : true
|
276
273
|
xtick = 10 if kvs[:scale] & GR::OPTION_X_LOG != 0
|
277
274
|
ytick = 10 if kvs[:scale] & GR::OPTION_Y_LOG != 0
|
278
275
|
GR.setlinecolorind(1)
|
@@ -293,8 +290,8 @@ module GR
|
|
293
290
|
else
|
294
291
|
if %i[heatmap nonuniformheatmap shade].include?(kind)
|
295
292
|
ticksize = -ticksize
|
296
|
-
|
297
|
-
|
293
|
+
elsif drawgrid
|
294
|
+
GR.grid(xtick, ytick, 0, 0, majorx, majory)
|
298
295
|
end
|
299
296
|
if kvs.has_key?(:xticklabels) || kvs.has_key?(:yticklabels)
|
300
297
|
fx = if kvs.has_key?(:xticklabels)
|
@@ -686,9 +683,10 @@ module GR
|
|
686
683
|
cmap = colormap
|
687
684
|
cmin, cmax = kvs[:zrange]
|
688
685
|
data = z.map { |i| normalize_color(i, cmin, cmax) }
|
689
|
-
|
690
|
-
|
691
|
-
|
686
|
+
data.reverse(axis: 0) if kvs[:xflip]
|
687
|
+
data.reverse(axis: 1) if kvs[:yflip]
|
688
|
+
colors = data * 255 + 1000
|
689
|
+
colors = colors.transpose # Julia is column major
|
692
690
|
GR.polarcellarray(0, 0, 0, 360, 0, 1, w, h, colors)
|
693
691
|
draw_polar_axes
|
694
692
|
kvs[:zrange] = [cmin, cmax]
|
@@ -1281,9 +1279,8 @@ module GR
|
|
1281
1279
|
def barplot(labels, heights, kv = {})
|
1282
1280
|
labels = labels.map(&:to_s)
|
1283
1281
|
wc, hc = barcoordinates(heights)
|
1284
|
-
horizontal = kv[:horizontal] || false
|
1285
1282
|
create_plot(:bar, labels, heights, kv) do |plt|
|
1286
|
-
if horizontal
|
1283
|
+
if kv[:horizontal]
|
1287
1284
|
plt.args = [[hc, wc, nil, nil, '']]
|
1288
1285
|
plt.kvs[:yticks] = [1, 1]
|
1289
1286
|
plt.kvs[:yticklabels] = labels
|
@@ -1342,6 +1339,7 @@ module GR
|
|
1342
1339
|
end
|
1343
1340
|
{
|
1344
1341
|
subplot: [xmin, xmax, ymin, ymax],
|
1342
|
+
# The policy of clearing when p[0]==1 is controversial
|
1345
1343
|
clear: p[0] == 1,
|
1346
1344
|
update: p[-1] == nr * nc
|
1347
1345
|
}
|
data/lib/gr_commons/version.rb
CHANGED
data/lib/grm.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GRM
|
4
|
+
class Error < StandardError; end
|
5
|
+
|
6
|
+
class << self
|
7
|
+
attr_accessor :ffi_lib
|
8
|
+
end
|
9
|
+
|
10
|
+
# Platforms | path
|
11
|
+
# Windows | bin/libGRM.dll
|
12
|
+
# MacOSX | lib/libGRM.so (NOT .dylib)
|
13
|
+
# Ubuntu | lib/libGRM.so
|
14
|
+
if Object.const_defined?(:RubyInstaller)
|
15
|
+
ENV['GRDIR'] ||= [
|
16
|
+
RubyInstaller::Runtime.msys2_installation.msys_path,
|
17
|
+
RubyInstaller::Runtime.msys2_installation.mingwarch
|
18
|
+
].join(File::ALT_SEPARATOR)
|
19
|
+
self.ffi_lib = File.expand_path('bin/libGRM.dll', ENV['GRDIR'])
|
20
|
+
RubyInstaller::Runtime.add_dll_directory(File.dirname(ffi_lib))
|
21
|
+
else
|
22
|
+
raise Error, 'Please set env variable GRDIR' unless ENV['GRDIR']
|
23
|
+
|
24
|
+
self.ffi_lib = File.expand_path('lib/libGRM.so', ENV['GRDIR'])
|
25
|
+
end
|
26
|
+
|
27
|
+
# change the default encoding to UTF-8.
|
28
|
+
ENV['GKS_ENCODING'] ||= 'utf8'
|
29
|
+
|
30
|
+
require_relative 'gr_commons/gr_commons'
|
31
|
+
require_relative 'grm/version'
|
32
|
+
require_relative 'grm/ffi'
|
33
|
+
require_relative 'grm/grmbase'
|
34
|
+
|
35
|
+
# `inquiry` methods etc. are defined here.
|
36
|
+
extend GRCommons::GRCommonUtils
|
37
|
+
|
38
|
+
# `XXX` is the default type in GR.
|
39
|
+
# A Ruby array or NArray passed to GR method is automatically converted to
|
40
|
+
# a Fiddley::MemoryPointer in the GRBase class.
|
41
|
+
extend GRMBase
|
42
|
+
|
43
|
+
class << self
|
44
|
+
end
|
45
|
+
end
|
data/lib/grm/ffi.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fiddle/import'
|
4
|
+
|
5
|
+
module GRM
|
6
|
+
# FFI Wrapper module for GRM.
|
7
|
+
# The functions for GRM are listed here.
|
8
|
+
# Add functions here when a new version of GR is released.
|
9
|
+
module FFI
|
10
|
+
extend Fiddle::Importer
|
11
|
+
|
12
|
+
begin
|
13
|
+
dlload GRM.ffi_lib
|
14
|
+
rescue LoadError
|
15
|
+
raise LoadError, 'Could not find GR Framework'
|
16
|
+
end
|
17
|
+
|
18
|
+
extend GRCommons::Extern
|
19
|
+
|
20
|
+
# Currently, the declarations of GRM functions are distributed in several
|
21
|
+
# header files.
|
22
|
+
|
23
|
+
# https://github.com/sciapp/gr/blob/master/lib/grm/args.h
|
24
|
+
|
25
|
+
try_extern 'grm_args_t *grm_args_new(void)'
|
26
|
+
try_extern 'void grm_args_delete(grm_args_t *args)'
|
27
|
+
# Fiddle does not currently support variable-length arguments in C.
|
28
|
+
try_extern 'int grm_args_push(grm_args_t *args, const char *key, const char *value_format, ...)'
|
29
|
+
try_extern 'int grm_args_push_buf(grm_args_t *args, const char *key, const char *value_format, const void *buffer, int apply_padding)'
|
30
|
+
try_extern 'int grm_args_contains(const grm_args_t *args, const char *keyword)'
|
31
|
+
try_extern 'void grm_args_clear(grm_args_t *args)'
|
32
|
+
try_extern 'void grm_args_remove(grm_args_t *args, const char *key)'
|
33
|
+
|
34
|
+
# https://github.com/sciapp/gr/blob/master/lib/grm/dump.h
|
35
|
+
try_extern 'void grm_dump(const grm_args_t *args, FILE *f)'
|
36
|
+
try_extern 'void grm_dump_json(const grm_args_t *args, FILE *f)'
|
37
|
+
try_extern 'char *grm_dump_json_str(void)'
|
38
|
+
|
39
|
+
# https://github.com/sciapp/gr/blob/master/lib/grm/event.h
|
40
|
+
# grm_event_type_t is an enum.
|
41
|
+
# In the original fiddley, there is code for an enum.
|
42
|
+
# But GR's fiddley doesn't have it.
|
43
|
+
# try_extern 'int grm_register(grm_event_type_t type, grm_event_callback_t callback)'
|
44
|
+
# try_extern 'int grm_unregister(grm_event_type_t type)'
|
45
|
+
|
46
|
+
# https://github.com/sciapp/gr/blob/master/lib/grm/interaction.h
|
47
|
+
try_extern 'int grm_input(const grm_args_t *input_args)'
|
48
|
+
# try_extern 'int grm_get_box(const int x1, const int y1, const int x2, const int y2, const int keep_aspect_ratio, int *x, int *y, int *w, int *h)'
|
49
|
+
# try_extern 'grm_tooltip_info_t *grm_get_tooltip(const int, const int)'
|
50
|
+
|
51
|
+
# https://github.com/sciapp/gr/blob/master/lib/grm/net.h
|
52
|
+
# try_extern 'void *grm_open(int is_receiver, const char *name, unsigned int id,
|
53
|
+
# const char *(*custom_recv)(const char *, unsigned int),
|
54
|
+
# int (*custom_send)(const char *, unsigned int, const char *))
|
55
|
+
try_extern 'grm_args_t *grm_recv(const void *p, grm_args_t *args)'
|
56
|
+
# Fiddle does not currently support variable-length arguments in C.
|
57
|
+
try_extern 'int grm_send(const void *p, const char *data_desc, ...)'
|
58
|
+
try_extern 'int grm_send_buf(const void *p, const char *data_desc, const void *buffer, int apply_padding)'
|
59
|
+
try_extern 'int grm_send_ref(const void *p, const char *key, char format, const void *ref, int len)'
|
60
|
+
try_extern 'int grm_send_args(const void *p, const grm_args_t *args)'
|
61
|
+
try_extern 'void grm_close(const void *p)'
|
62
|
+
end
|
63
|
+
end
|
data/lib/grm/grmbase.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GRM
|
4
|
+
# This module automatically converts Ruby arrays and Numo::Narray into
|
5
|
+
# Fiddley::MemoryPointer.
|
6
|
+
module GRMBase
|
7
|
+
extend GRCommons::DefineMethods
|
8
|
+
define_ffi_methods(FFI,
|
9
|
+
prefix: 'grm_',
|
10
|
+
default_type: :float) # FIXME!
|
11
|
+
end
|
12
|
+
private_constant :GRMBase
|
13
|
+
end
|
data/lib/grm/version.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-gr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kojix2
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -147,6 +147,10 @@ files:
|
|
147
147
|
- lib/gr_commons/gr_commons.rb
|
148
148
|
- lib/gr_commons/jupyter_support.rb
|
149
149
|
- lib/gr_commons/version.rb
|
150
|
+
- lib/grm.rb
|
151
|
+
- lib/grm/ffi.rb
|
152
|
+
- lib/grm/grmbase.rb
|
153
|
+
- lib/grm/version.rb
|
150
154
|
homepage: https://github.com/red-data-tools/GR.rb
|
151
155
|
licenses:
|
152
156
|
- MIT
|