vega 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/LICENSE.txt +1 -1
- data/README.md +114 -31
- data/config/importmap.rb +1 -0
- data/lib/vega/base_chart.rb +5 -2
- data/lib/vega/chart.rb +2 -0
- data/lib/vega/engine.rb +11 -0
- data/lib/vega/lite_chart.rb +13 -4
- data/lib/vega/method_helpers.rb +2 -1
- data/lib/vega/spec.rb +13 -5
- data/lib/vega/version.rb +1 -1
- data/licenses/LICENSE-vega-interpreter.txt +27 -0
- data/licenses/LICENSE-vega.txt +1 -1
- data/vendor/assets/javascripts/vega-embed.js +4583 -2912
- data/vendor/assets/javascripts/vega-interpreter.js +311 -0
- data/vendor/assets/javascripts/vega-lite.js +5582 -5574
- data/vendor/assets/javascripts/vega.js +3571 -3216
- metadata +13 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81ef88e1766446a7d367331b58abcc2113a05cc3a914891dc81f5f82a026070f
|
4
|
+
data.tar.gz: 31f67095fcebf1cafa5bf8e50b81bf8a6830082d43bb383a7b6c299034907d24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbd22ed80b972dbbc1ab134755a4903b255b328963a8533e7e7cae29403cd1ac81aca3f84f8a0b0f42e93515a18d85a5ec582193a3a1d020f79527a66b8fd1aa
|
7
|
+
data.tar.gz: 19fad72d73ceddfaf669e3a0c0a970bdaeac5996018522e3acffca488533723e4e79a9609741399aefc1480a74891ac8f2b4db1a62540f107694fcc3e25e0a8d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
## 0.2.0 (2021-10-23)
|
2
|
+
|
3
|
+
- Added experimental support for `importmap-rails`
|
4
|
+
- Updated Vega to 5.21.0, Vega-Lite to 5.1.1, and Vega-Embed to 6.19.1
|
5
|
+
|
6
|
+
## 0.1.3 (2021-03-14)
|
7
|
+
|
8
|
+
- Added Vega-Interpreter
|
9
|
+
|
10
|
+
## 0.1.2 (2021-02-09)
|
11
|
+
|
12
|
+
- Updated Vega to 5.19.1, Vega-Lite to 4.17.0, and Vega-Embed to 6.15.1
|
13
|
+
|
14
|
+
## 0.1.1 (2020-09-27)
|
15
|
+
|
16
|
+
- Added `repeat`, `resolve`, `spec` and `selection` methods
|
17
|
+
- Added `hconcat` and `vconcat` methods
|
18
|
+
- Added support for Daru data frames
|
19
|
+
|
1
20
|
## 0.1.0 (2020-09-26)
|
2
21
|
|
3
22
|
- First release
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -2,8 +2,12 @@
|
|
2
2
|
|
3
3
|
Interactive charts for Ruby, powered by [Vega](https://vega.github.io/vega/) and [Vega-Lite](https://vega.github.io/vega-lite/)
|
4
4
|
|
5
|
+
[See it in action](https://vega.dokkuapp.com)
|
6
|
+
|
5
7
|
Works with Rails, iRuby, and other frameworks
|
6
8
|
|
9
|
+
[![Build Status](https://github.com/ankane/vega-ruby/workflows/build/badge.svg?branch=master)](https://github.com/ankane/vega-ruby/actions)
|
10
|
+
|
7
11
|
## Installation
|
8
12
|
|
9
13
|
Add this line to your application’s Gemfile:
|
@@ -14,11 +18,24 @@ gem 'vega'
|
|
14
18
|
|
15
19
|
The follow the instructions for how you plan to use it:
|
16
20
|
|
17
|
-
- [Rails
|
18
|
-
- [Rails
|
21
|
+
- [Rails 7 / Importmap](#rails-7--importmap) (experimental)
|
22
|
+
- [Rails 6 / Webpacker](#rails-6--webpacker)
|
23
|
+
- [Rails 5 / Sprockets](#rails-5--sprockets)
|
19
24
|
- [iRuby](#iruby)
|
20
25
|
- [Other](#other)
|
21
26
|
|
27
|
+
### Rails 7 / Importmap
|
28
|
+
|
29
|
+
Add to `app/javascript/application.js`:
|
30
|
+
|
31
|
+
```js
|
32
|
+
import "vega"
|
33
|
+
import "vega-lite"
|
34
|
+
import "vega-embed"
|
35
|
+
|
36
|
+
window.dispatchEvent(new Event("vega:load"));
|
37
|
+
```
|
38
|
+
|
22
39
|
### Rails 6 / Webpacker
|
23
40
|
|
24
41
|
Run:
|
@@ -52,9 +69,9 @@ No additional set up is needed.
|
|
52
69
|
For Sinatra and other web frameworks, include the Vega JavaScript files on pages with charts:
|
53
70
|
|
54
71
|
```html
|
55
|
-
<script src="https://cdn.jsdelivr.net/npm/vega@5.
|
56
|
-
<script src="https://cdn.jsdelivr.net/npm/vega-lite@
|
57
|
-
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6.
|
72
|
+
<script src="https://cdn.jsdelivr.net/npm/vega@5.21.0"></script>
|
73
|
+
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5.1.1"></script>
|
74
|
+
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6.19.1"></script>
|
58
75
|
```
|
59
76
|
|
60
77
|
## Getting Started
|
@@ -78,23 +95,11 @@ Create a bar chart
|
|
78
95
|
|
79
96
|
```ruby
|
80
97
|
Vega.lite
|
81
|
-
.data(
|
82
|
-
values: [
|
83
|
-
{a: "A", b: 28},
|
84
|
-
{a: "B", b: 55},
|
85
|
-
{a: "C", b: 43},
|
86
|
-
{a: "D", b: 91},
|
87
|
-
{a: "E", b: 81},
|
88
|
-
{a: "F", b: 53},
|
89
|
-
{a: "G", b: 19},
|
90
|
-
{a: "H", b: 87},
|
91
|
-
{a: "I", b: 52}
|
92
|
-
]
|
93
|
-
)
|
98
|
+
.data([{city: "A", sales: 28}, {city: "B", sales: 55}, {city: "C", sales: 43}])
|
94
99
|
.mark(type: "bar", tooltip: true)
|
95
100
|
.encoding(
|
96
|
-
x: {field: "
|
97
|
-
y: {field: "
|
101
|
+
x: {field: "city", type: "nominal"},
|
102
|
+
y: {field: "sales", type: "quantitative"}
|
98
103
|
)
|
99
104
|
```
|
100
105
|
|
@@ -116,22 +121,28 @@ Vega.lite
|
|
116
121
|
|
117
122
|
[Docs](https://vega.github.io/vega-lite/docs/data.html)
|
118
123
|
|
119
|
-
|
124
|
+
Data can be an array
|
120
125
|
|
121
126
|
```ruby
|
122
|
-
data(
|
127
|
+
data([{x: "A", y: 1}, {x: "B", y: 2}])
|
123
128
|
```
|
124
129
|
|
125
130
|
Or a URL
|
126
131
|
|
127
132
|
```ruby
|
128
|
-
data(
|
133
|
+
data("https://www.example.com/data.json")
|
129
134
|
```
|
130
135
|
|
131
|
-
|
136
|
+
Or a Rover data frame
|
132
137
|
|
133
138
|
```ruby
|
134
|
-
data(
|
139
|
+
data(df)
|
140
|
+
```
|
141
|
+
|
142
|
+
Or a data generator
|
143
|
+
|
144
|
+
```ruby
|
145
|
+
data(sequence: {start: 0, stop: 10, step: 1, as: "x"})
|
135
146
|
```
|
136
147
|
|
137
148
|
### Transforms
|
@@ -192,7 +203,51 @@ encoding(x: {field: "a", type: "ordinal"})
|
|
192
203
|
projection(type: "albersUsa")
|
193
204
|
```
|
194
205
|
|
195
|
-
###
|
206
|
+
### View Composition
|
207
|
+
|
208
|
+
[Docs](https://vega.github.io/vega-lite/docs/composition.html)
|
209
|
+
|
210
|
+
Faceting
|
211
|
+
|
212
|
+
```ruby
|
213
|
+
facet(row: {field: "x"})
|
214
|
+
```
|
215
|
+
|
216
|
+
Layering
|
217
|
+
|
218
|
+
```ruby
|
219
|
+
layer(view)
|
220
|
+
```
|
221
|
+
|
222
|
+
Concatenation
|
223
|
+
|
224
|
+
```ruby
|
225
|
+
hconcat(view)
|
226
|
+
vconcat(view)
|
227
|
+
concat(view)
|
228
|
+
```
|
229
|
+
|
230
|
+
Repeating
|
231
|
+
|
232
|
+
```ruby
|
233
|
+
repeat(row: ["a", "b", "c"])
|
234
|
+
```
|
235
|
+
|
236
|
+
Resolving
|
237
|
+
|
238
|
+
```ruby
|
239
|
+
resolve(scale: {color: "independent"})
|
240
|
+
```
|
241
|
+
|
242
|
+
### Selections
|
243
|
+
|
244
|
+
[Docs](https://vega.github.io/vega-lite/docs/selection.html)
|
245
|
+
|
246
|
+
```ruby
|
247
|
+
selection(x: {type: "single"})
|
248
|
+
```
|
249
|
+
|
250
|
+
### Config
|
196
251
|
|
197
252
|
[Docs](https://vega.github.io/vega-lite/docs/config.html)
|
198
253
|
|
@@ -276,24 +331,52 @@ Get the spec for a chart
|
|
276
331
|
chart.spec
|
277
332
|
```
|
278
333
|
|
334
|
+
## Content Security Policy (CSP)
|
335
|
+
|
336
|
+
By default, the Vega parser uses the Function constructor, which [can cause issues with CSP](https://vega.github.io/vega/usage/interpreter/).
|
337
|
+
|
338
|
+
For Rails 7 / Importmap, add to `app/javascript/application.js`:
|
339
|
+
|
340
|
+
```js
|
341
|
+
import "vega-interpreter"
|
342
|
+
```
|
343
|
+
|
344
|
+
For Rails 6 / Webpacker, run:
|
345
|
+
|
346
|
+
```sh
|
347
|
+
yarn add vega-interpreter
|
348
|
+
```
|
349
|
+
|
350
|
+
For Rails 5 / Sprockets, add to `app/assets/javascripts/application.js`:
|
351
|
+
|
352
|
+
```js
|
353
|
+
//= require vega-interpreter
|
354
|
+
```
|
355
|
+
|
356
|
+
And set embed options for your charts
|
357
|
+
|
358
|
+
```ruby
|
359
|
+
embed_options(ast: true)
|
360
|
+
```
|
361
|
+
|
279
362
|
## History
|
280
363
|
|
281
|
-
View the [changelog](https://github.com/ankane/vega/blob/master/CHANGELOG.md)
|
364
|
+
View the [changelog](https://github.com/ankane/vega-ruby/blob/master/CHANGELOG.md)
|
282
365
|
|
283
366
|
## Contributing
|
284
367
|
|
285
368
|
Everyone is encouraged to help improve this project. Here are a few ways you can help:
|
286
369
|
|
287
|
-
- [Report bugs](https://github.com/ankane/vega/issues)
|
288
|
-
- Fix bugs and [submit pull requests](https://github.com/ankane/vega/pulls)
|
370
|
+
- [Report bugs](https://github.com/ankane/vega-ruby/issues)
|
371
|
+
- Fix bugs and [submit pull requests](https://github.com/ankane/vega-ruby/pulls)
|
289
372
|
- Write, clarify, or fix documentation
|
290
373
|
- Suggest or add new features
|
291
374
|
|
292
375
|
To get started with development:
|
293
376
|
|
294
377
|
```sh
|
295
|
-
git clone https://github.com/ankane/vega.git
|
296
|
-
cd vega
|
378
|
+
git clone https://github.com/ankane/vega-ruby.git
|
379
|
+
cd vega-ruby
|
297
380
|
bundle install
|
298
381
|
bundle exec rake test
|
299
382
|
```
|
data/config/importmap.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
pin_all_from File.expand_path("../vendor/assets/javascripts", __dir__)
|
data/lib/vega/base_chart.rb
CHANGED
@@ -2,8 +2,6 @@ module Vega
|
|
2
2
|
class BaseChart
|
3
3
|
extend MethodHelpers
|
4
4
|
|
5
|
-
attr_reader :spec
|
6
|
-
|
7
5
|
def initialize
|
8
6
|
@spec = {
|
9
7
|
"$schema": @schema,
|
@@ -28,6 +26,10 @@ module Vega
|
|
28
26
|
Spec.new(spec).to_iruby
|
29
27
|
end
|
30
28
|
|
29
|
+
def to_json
|
30
|
+
spec.to_json
|
31
|
+
end
|
32
|
+
|
31
33
|
private
|
32
34
|
|
33
35
|
def initialize_dup(*)
|
@@ -38,6 +40,7 @@ module Vega
|
|
38
40
|
|
39
41
|
def data_value(value)
|
40
42
|
value = value.to_a if defined?(Rover::DataFrame) && value.is_a?(Rover::DataFrame)
|
43
|
+
value = value.to_a[0] if defined?(Daru::DataFrame) && value.is_a?(Daru::DataFrame)
|
41
44
|
case value
|
42
45
|
when Array
|
43
46
|
{values: value}
|
data/lib/vega/chart.rb
CHANGED
data/lib/vega/engine.rb
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
module Vega
|
2
2
|
class Engine < ::Rails::Engine
|
3
3
|
# for assets
|
4
|
+
|
5
|
+
# for importmap
|
6
|
+
if defined?(Importmap)
|
7
|
+
initializer "vega.importmap", after: "importmap" do |app|
|
8
|
+
app.importmap.draw(Engine.root.join("config/importmap.rb"))
|
9
|
+
app.config.assets.precompile << "vega-embed.js"
|
10
|
+
app.config.assets.precompile << "vega-interpreter.js"
|
11
|
+
app.config.assets.precompile << "vega-lite.js"
|
12
|
+
app.config.assets.precompile << "vega.js"
|
13
|
+
end
|
14
|
+
end
|
4
15
|
end
|
5
16
|
end
|
data/lib/vega/lite_chart.rb
CHANGED
@@ -2,16 +2,16 @@ module Vega
|
|
2
2
|
class LiteChart < BaseChart
|
3
3
|
# https://vega.github.io/vega-lite/docs/spec.html
|
4
4
|
scalar_methods \
|
5
|
-
:background, :padding, :autosize, :title, :name, :description, :width, :height, :mark
|
5
|
+
:background, :padding, :autosize, :title, :name, :description, :width, :height, :mark, :spec, :repeat
|
6
6
|
|
7
7
|
hash_methods \
|
8
|
-
:config, :usermeta, :projection, :datasets, :encoding
|
8
|
+
:config, :usermeta, :projection, :datasets, :encoding, :facet, :resolve, :selection, :view
|
9
9
|
|
10
10
|
array_methods \
|
11
|
-
:transform, :layer
|
11
|
+
:transform, :layer, :hconcat, :vconcat, :concat
|
12
12
|
|
13
13
|
def initialize
|
14
|
-
@schema = "https://vega.github.io/schema/vega-lite/
|
14
|
+
@schema = "https://vega.github.io/schema/vega-lite/v5.json"
|
15
15
|
super()
|
16
16
|
end
|
17
17
|
|
@@ -20,5 +20,14 @@ module Vega
|
|
20
20
|
self
|
21
21
|
end
|
22
22
|
immutable_method :data
|
23
|
+
|
24
|
+
undef spec
|
25
|
+
def spec(*args)
|
26
|
+
if args.empty?
|
27
|
+
@spec
|
28
|
+
else
|
29
|
+
dup.spec!(*args)
|
30
|
+
end
|
31
|
+
end
|
23
32
|
end
|
24
33
|
end
|
data/lib/vega/method_helpers.rb
CHANGED
@@ -25,7 +25,8 @@ module Vega
|
|
25
25
|
def array_methods(*methods)
|
26
26
|
methods.each do |method|
|
27
27
|
define_method("#{method}!") do |value|
|
28
|
-
|
28
|
+
value = [value] unless value.is_a?(Array)
|
29
|
+
(@spec[method] ||= []).push(*value)
|
29
30
|
self
|
30
31
|
end
|
31
32
|
immutable_method(method)
|
data/lib/vega/spec.rb
CHANGED
@@ -11,7 +11,14 @@ module Vega
|
|
11
11
|
output = <<~EOS
|
12
12
|
#{html}
|
13
13
|
<script>
|
14
|
-
|
14
|
+
(function() {
|
15
|
+
var createChart = function() { #{js} };
|
16
|
+
if ("vegaEmbed" in window) {
|
17
|
+
createChart();
|
18
|
+
} else {
|
19
|
+
window.addEventListener("vega:load", createChart, true);
|
20
|
+
}
|
21
|
+
})();
|
15
22
|
</script>
|
16
23
|
EOS
|
17
24
|
output.respond_to?(:html_safe) ? output.html_safe : output
|
@@ -25,12 +32,13 @@ module Vega
|
|
25
32
|
<script>
|
26
33
|
require.config({
|
27
34
|
paths: {
|
28
|
-
'vega': 'https://cdn.jsdelivr.net/npm/vega@5.
|
29
|
-
'vega-
|
30
|
-
'vega-
|
35
|
+
'vega': 'https://cdn.jsdelivr.net/npm/vega@5.21.0?noext',
|
36
|
+
'vega-util': 'https://cdn.jsdelivr.net/npm/vega-util@1.17.0?noext',
|
37
|
+
'vega-lite': 'https://cdn.jsdelivr.net/npm/vega-lite@5.1.1?noext',
|
38
|
+
'vega-embed': 'https://cdn.jsdelivr.net/npm/vega-embed@6.19.1?noext'
|
31
39
|
}
|
32
40
|
});
|
33
|
-
require(['vega', 'vega-lite', 'vega-embed'], function(vega, vegaLite, vegaEmbed) {
|
41
|
+
require(['vega', 'vega-util', 'vega-lite', 'vega-embed'], function(vega, vegaUtil, vegaLite, vegaEmbed) {
|
34
42
|
#{js}
|
35
43
|
});
|
36
44
|
</script>
|
data/lib/vega/version.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
Copyright (c) 2015-2018, University of Washington Interactive Data Lab
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
3. Neither the name of the copyright holder nor the names of its contributors
|
15
|
+
may be used to endorse or promote products derived from this software
|
16
|
+
without specific prior written permission.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/licenses/LICENSE-vega.txt
CHANGED