vega 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.
- 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
|
+
[](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