jupyternb 0.1.1
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 +7 -0
- data/.gitignore +6 -0
- data/LICENSE +20 -0
- data/README.md +50 -0
- data/jupyternb.gemspec +24 -0
- data/lib/cell.rb +96 -0
- data/lib/generator.rb +87 -0
- data/lib/helpers.rb +123 -0
- data/lib/jupyternb.rb +6 -0
- data/lib/metadata.rb +86 -0
- data/lib/version.rb +10 -0
- metadata +55 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ebfbba6b7604c84fa2c6ae94f613cfff2858668a
|
4
|
+
data.tar.gz: 9e7b56500cce2959b712c5773e95e89f145d9687
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fa0e4011c768c38be623ebd3f2d9415761fcd724b056f3c213c124d623f841e2ea6a8bf3102e21139c55ac975dd7a4f6438b5732ac5aa16b834fb37585f0a1f0
|
7
|
+
data.tar.gz: 6886f076a095aa598e29fe9e73de2f15cf415e494db5a5af8f5f56ab8c16f7a13d8a25e91052bba527f71f8a9b93c58a4a9d3ee8e4b9406254b5ac6c473f2e90
|
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2018 Hermann Detz
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
<Copyright (C) 2018 Hermann Detz>
|
2
|
+
|
3
|
+
<This software may be modified and distributed under the terms>
|
4
|
+
<of the MIT license. See the LICENSE file for details.>
|
5
|
+
|
6
|
+
# jupyternb
|
7
|
+
|
8
|
+
This gem provides useful functions to generate Jupyter Notebooks,
|
9
|
+
(formerly IPython Notebooks), from Ruby scripts.
|
10
|
+
|
11
|
+
## Setup
|
12
|
+
|
13
|
+
Add the gem to your Gemfile:
|
14
|
+
|
15
|
+
gem 'jupyternb', :path => "path-to/jupyternb"
|
16
|
+
|
17
|
+
Update your gem list:
|
18
|
+
|
19
|
+
$ bundle install
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
Currently, the only functionality is to generate .ipynb files.
|
24
|
+
A simple example is given in the following:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
module JupyterNB
|
28
|
+
|
29
|
+
# Create a Jupyter Notebook Generator
|
30
|
+
# The parameter defines the kernel used. Present options are :ruby or :python3.
|
31
|
+
gen = Generator.new(:ruby)
|
32
|
+
|
33
|
+
# Add some content cells (either multi-line strings or arrays of strings)
|
34
|
+
gen.add_cell("markdown", "", "", "# Test header\nsome text\n## Second Header\nmore text")
|
35
|
+
gen.add_cell("code", "", "", ["puts \"Hello World!\"","# Do something useful here"])
|
36
|
+
|
37
|
+
# Simply print the output to the terminal
|
38
|
+
puts gen.generate
|
39
|
+
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
## Feedback & Contributions
|
44
|
+
|
45
|
+
1. Fork it ( http://github.com/hermanndetz/middleman-gnuplot/fork )
|
46
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
47
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
48
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
49
|
+
5. Create new Pull Request
|
50
|
+
|
data/jupyternb.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require_relative 'lib/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "jupyternb"
|
8
|
+
spec.version = JupyterNB::VERSION
|
9
|
+
spec.authors = ["Hermann Detz"]
|
10
|
+
spec.email = ["hermann.detz@gmail.com"]
|
11
|
+
spec.description = <<-EOF
|
12
|
+
This gem provides useful functions to work with
|
13
|
+
Jupyter Notebook files.
|
14
|
+
EOF
|
15
|
+
spec.summary = %q{Jupyter Notebook Tools}
|
16
|
+
spec.homepage = "https://github.com/hermanndetz/jupyternb"
|
17
|
+
spec.license = "MIT"
|
18
|
+
|
19
|
+
spec.files = `git ls-files`.split($/)
|
20
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
21
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
end
|
24
|
+
|
data/lib/cell.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
# Copyright (C) 2018 Hermann Detz
|
2
|
+
#
|
3
|
+
# This software may be modified and distributed under the terms
|
4
|
+
# of the MIT license. See the LICENSE file for details.
|
5
|
+
|
6
|
+
require "helpers"
|
7
|
+
|
8
|
+
module JupyterNB
|
9
|
+
class Cell
|
10
|
+
# Cell type e.g. "code" or "markdown"
|
11
|
+
@type = ""
|
12
|
+
|
13
|
+
# Array of strings (lines) for metadata
|
14
|
+
@metadata = []
|
15
|
+
|
16
|
+
# Array of strings (lines) for source
|
17
|
+
@source = []
|
18
|
+
|
19
|
+
# Used in generate function, defined here because
|
20
|
+
# needed by Helpers mixin
|
21
|
+
@indent = 1
|
22
|
+
|
23
|
+
# Execution count of code cell (hardcoded to 0 because it's just generated)
|
24
|
+
@count = 0
|
25
|
+
|
26
|
+
# Constructor
|
27
|
+
# @param [String] type defines the type of the cell (markdown, code, ...)
|
28
|
+
# @param metadata can be given as a string with linebreaks or as an array of strings
|
29
|
+
# @param outputs can be given as a string with linebreaks or as an array of strings def add_cell(type,metadata,outputs,source)
|
30
|
+
# @param source can be given as a string with linebreaks or as an array of strings
|
31
|
+
def initialize(type, metadata, outputs, source)
|
32
|
+
@type = type
|
33
|
+
@metadata = read_parameter(metadata)
|
34
|
+
@source = read_parameter(source)
|
35
|
+
@count = 0
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns a string that contains an IPython Notebook cell
|
39
|
+
#
|
40
|
+
# The outputs field is not implemented yet. Should actually not be
|
41
|
+
# necessary for a pure generator.
|
42
|
+
# Generation of metadata within the cell is also not yet implemented.
|
43
|
+
#
|
44
|
+
# @param [Integer] indent defines the indentation of the cell content
|
45
|
+
# @param [Boolean] last if set to true, the trailing ',' is omitted
|
46
|
+
def generate(indent=1,last=false)
|
47
|
+
@indent = indent
|
48
|
+
|
49
|
+
result = ""
|
50
|
+
result << open_group
|
51
|
+
result << add_field("cell_type", @type)
|
52
|
+
result << add_field("execution_count", @count) if (@type == "code")
|
53
|
+
result << open_group("metadata")
|
54
|
+
# not implemented yet
|
55
|
+
result << close_group
|
56
|
+
|
57
|
+
result << open_array("source")
|
58
|
+
@source.each do |l|
|
59
|
+
result << add_string(l)
|
60
|
+
|
61
|
+
(l == @source.last) ? result << "\n" : result << ",\n"
|
62
|
+
end
|
63
|
+
result << close_array(true)
|
64
|
+
result << close_group(last)
|
65
|
+
|
66
|
+
return result
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
# Returns an array of strings for multi-line parameters like metadata or source
|
72
|
+
# @param param can be given as a string with linebreaks or as an array of strings
|
73
|
+
def read_parameter (param)
|
74
|
+
result = []
|
75
|
+
|
76
|
+
unless (param.nil? == true)
|
77
|
+
if param.is_a?(String)
|
78
|
+
param.each_line do |l|
|
79
|
+
result << l.chomp
|
80
|
+
end
|
81
|
+
elsif param.is_a?(Array)
|
82
|
+
param.each do |l|
|
83
|
+
next unless l.is_a?(String)
|
84
|
+
|
85
|
+
result << l
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
return result
|
91
|
+
end
|
92
|
+
|
93
|
+
include JupyterNB::Helpers
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
data/lib/generator.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# Copyright (C) 2018 Hermann Detz
|
2
|
+
#
|
3
|
+
# This software may be modified and distributed under the terms
|
4
|
+
# of the MIT license. See the LICENSE file for details.
|
5
|
+
|
6
|
+
require "cell"
|
7
|
+
require "metadata"
|
8
|
+
|
9
|
+
module JupyterNB
|
10
|
+
class Generator
|
11
|
+
# Array of cells (markdown, code, ...) that should be generated within the notebook
|
12
|
+
@cells = []
|
13
|
+
|
14
|
+
# Defines the indent for output lines (used by Helpers module)
|
15
|
+
@indent = 0
|
16
|
+
|
17
|
+
# Stores a metadata object
|
18
|
+
@metadata = nil
|
19
|
+
|
20
|
+
# Default constructor
|
21
|
+
# @param lang can be either :ruby or :python3
|
22
|
+
def initialize(lang)
|
23
|
+
@cells = Array.new
|
24
|
+
|
25
|
+
if ((lang == :ruby) or (lang == :python3))
|
26
|
+
@metadata = Metadata.new(lang)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns a string that contains an IPython Notebook
|
31
|
+
def generate
|
32
|
+
# start with 1 because everything is encapsulated within {}
|
33
|
+
# at indent 0
|
34
|
+
@indent = 1
|
35
|
+
result = ""
|
36
|
+
result << "{\n"
|
37
|
+
|
38
|
+
if (@cells.nil? == false) and (@cells.size > 0)
|
39
|
+
result << open_array("cells")
|
40
|
+
|
41
|
+
@cells.each do |c|
|
42
|
+
last = false
|
43
|
+
(c == @cells.last) ? last = true : last = false
|
44
|
+
|
45
|
+
result << c.generate(@indent, last)
|
46
|
+
end
|
47
|
+
|
48
|
+
result << close_array
|
49
|
+
end
|
50
|
+
|
51
|
+
result << generate_metadata
|
52
|
+
result << generate_versioninfo
|
53
|
+
result << "}"
|
54
|
+
|
55
|
+
return result
|
56
|
+
end
|
57
|
+
|
58
|
+
# Adds a content cell to the notebook to be generated
|
59
|
+
# @param [String] type defines the type of the cell (markdown, code, ...)
|
60
|
+
# @param metadata can be given as a string with linebreaks or as an array of strings
|
61
|
+
# @param outputs can be given as a string with linebreaks or as an array of strings def add_cell(type,metadata,outputs,source)
|
62
|
+
# @param source can be given as a string with linebreaks or as an array of strings
|
63
|
+
def add_cell(type,metadata,outputs,source)
|
64
|
+
@cells << Cell.new(type,metadata,outputs,source)
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
include JupyterNB::Helpers
|
70
|
+
|
71
|
+
# Returns a string containing the metadata of the IPython Notebook
|
72
|
+
def generate_metadata
|
73
|
+
return @metadata.generate(@indent)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Returns a string that contains the version information of the
|
77
|
+
# IPython Notebook
|
78
|
+
# The values are reverse engineered from a jupyterhub project.
|
79
|
+
def generate_versioninfo
|
80
|
+
result = ""
|
81
|
+
result << add_field("nbformat", 4)
|
82
|
+
result << add_field("nbformat_minor", 2, true)
|
83
|
+
return result
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
data/lib/helpers.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
# Copyright (C) 2018 Hermann Detz
|
2
|
+
#
|
3
|
+
# This software may be modified and distributed under the terms
|
4
|
+
# of the MIT license. See the LICENSE file for details.
|
5
|
+
|
6
|
+
module JupyterNB
|
7
|
+
module Helpers
|
8
|
+
# Returns a string that contains a single automatically indented string
|
9
|
+
#
|
10
|
+
# This is used to output source code within cells.
|
11
|
+
# @param [String] str contains the string to be indented and contained in ""
|
12
|
+
def add_string(str)
|
13
|
+
line = ""
|
14
|
+
@indent.times do line << " " end
|
15
|
+
line << "\"#{str}\\n\""
|
16
|
+
return line
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns a string that contains a single field for a notebook
|
20
|
+
#
|
21
|
+
# This is e.g. used to output the cell type:
|
22
|
+
# "cell_type": "code",
|
23
|
+
#
|
24
|
+
# @param [String] name Name of the field (e.g. cell_type)
|
25
|
+
# @param value can be a String or Integer
|
26
|
+
# @param [Boolean] last if set to true, the trailing ',' is omitted
|
27
|
+
def add_field(name, value, last=false)
|
28
|
+
line = ""
|
29
|
+
@indent.times do line << " " end
|
30
|
+
|
31
|
+
line << "\"#{name}\": "
|
32
|
+
|
33
|
+
line << "\"#{value}\"" if value.is_a?(String)
|
34
|
+
line << "#{value}" if value.is_a?(Integer)
|
35
|
+
|
36
|
+
last ? line << "\n" : line << ",\n"
|
37
|
+
|
38
|
+
return line
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns a string that opens a group within a notebook
|
42
|
+
# The indentation is automatically increased by one.
|
43
|
+
#
|
44
|
+
# This is e.g. used to output the metadata:
|
45
|
+
# "metadata": {
|
46
|
+
#
|
47
|
+
# @param [String] name Name of the group (e.g. metadata)
|
48
|
+
def open_group(name="")
|
49
|
+
line = ""
|
50
|
+
@indent.times do line << " " end
|
51
|
+
|
52
|
+
if name != ""
|
53
|
+
line << "\"#{name}\": {\n"
|
54
|
+
else
|
55
|
+
line << "{\n"
|
56
|
+
end
|
57
|
+
|
58
|
+
@indent += 1
|
59
|
+
|
60
|
+
return line
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns a string that closes a group within a notebook
|
64
|
+
# The indentation is automatically decreased by one.
|
65
|
+
#
|
66
|
+
# This is e.g. used to close the metadata:
|
67
|
+
# },
|
68
|
+
#
|
69
|
+
# @param [Boolean] last if set to true, the trailing ',' is omitted
|
70
|
+
def close_group(last=false)
|
71
|
+
# decrease indent first to bring closing bracked to the
|
72
|
+
# same indent as opening bracket
|
73
|
+
@indent -= 1
|
74
|
+
|
75
|
+
line = ""
|
76
|
+
@indent.times do line << " " end
|
77
|
+
|
78
|
+
line << "}"
|
79
|
+
last ? line << "\n" : line << ",\n"
|
80
|
+
|
81
|
+
return line
|
82
|
+
end
|
83
|
+
|
84
|
+
# Returns a string that opens a group within a notebook
|
85
|
+
# The indentation is automatically increased by one.
|
86
|
+
#
|
87
|
+
# This is e.g. used to output the cells:
|
88
|
+
# "cells": [
|
89
|
+
#
|
90
|
+
# @param [String] name Name of the array (e.g. cells)
|
91
|
+
def open_array(name)
|
92
|
+
line = ""
|
93
|
+
@indent.times do line << " " end
|
94
|
+
|
95
|
+
line << "\"#{name}\": [\n"
|
96
|
+
|
97
|
+
@indent += 1
|
98
|
+
|
99
|
+
return line
|
100
|
+
end
|
101
|
+
|
102
|
+
# Returns a string that closes a group within a notebook
|
103
|
+
# The indentation is automatically decreased by one.
|
104
|
+
#
|
105
|
+
# This is e.g. used to close the metadata:
|
106
|
+
# ],
|
107
|
+
#
|
108
|
+
# @param [Boolean] last if set to true, the trailing ',' is omitted
|
109
|
+
def close_array(last=false)
|
110
|
+
# decrease indent first to bring closing bracked to the
|
111
|
+
# same indent as opening bracket
|
112
|
+
@indent -= 1
|
113
|
+
|
114
|
+
line = ""
|
115
|
+
@indent.times do line << " " end
|
116
|
+
|
117
|
+
line << "]"
|
118
|
+
last ? line << "\n" : line << ",\n"
|
119
|
+
|
120
|
+
return line
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
data/lib/jupyternb.rb
ADDED
data/lib/metadata.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
# Copyright (C) 2018 Hermann Detz
|
2
|
+
#
|
3
|
+
# This software may be modified and distributed under the terms
|
4
|
+
# of the MIT license. See the LICENSE file for details.
|
5
|
+
|
6
|
+
module JupyterNB
|
7
|
+
class Metadata
|
8
|
+
# Defines the indent for output lines (used by Helpers module)
|
9
|
+
@indent = 0
|
10
|
+
@kernel = {}
|
11
|
+
@langinfo = {}
|
12
|
+
|
13
|
+
# Constructor
|
14
|
+
# @param lang can be either :ruby or :python3
|
15
|
+
def initialize(lang)
|
16
|
+
@kernel = {}
|
17
|
+
@langinfo = {}
|
18
|
+
|
19
|
+
case lang
|
20
|
+
when :ruby then initialize_ruby
|
21
|
+
when :python3 then initialize_python3
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns a string containing the metadata of the IPython Notebook
|
26
|
+
# @param [Integer] indent defines the indentation of the generated output.
|
27
|
+
def generate(indent=0)
|
28
|
+
@indent = indent
|
29
|
+
|
30
|
+
result = ""
|
31
|
+
result << open_group("metadata")
|
32
|
+
result << open_group("kernelspec")
|
33
|
+
result << add_field("display_name", @kernel[:displayname])
|
34
|
+
result << add_field("language", @kernel[:language])
|
35
|
+
result << add_field("name", @kernel[:name], true)
|
36
|
+
result << close_group
|
37
|
+
result << open_group("language_info")
|
38
|
+
result << add_field("file_extension", @langinfo[:fileext])
|
39
|
+
result << add_field("mimetype", @langinfo[:mime])
|
40
|
+
result << add_field("name", @langinfo[:name])
|
41
|
+
result << add_field("version", @langinfo[:version], true)
|
42
|
+
result << close_group(true)
|
43
|
+
result << close_group
|
44
|
+
return result
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
include JupyterNB::Helpers
|
51
|
+
|
52
|
+
# Initialize metadata for Ruby kernel
|
53
|
+
def initialize_ruby
|
54
|
+
@kernel[:language] = "ruby"
|
55
|
+
@kernel[:name] = "ruby"
|
56
|
+
@kernel[:displayname] = "Ruby #{RUBY_VERSION}"
|
57
|
+
|
58
|
+
@langinfo[:name] = "ruby"
|
59
|
+
@langinfo[:fileext] = ".rb"
|
60
|
+
@langinfo[:mime] = "application/x-ruby"
|
61
|
+
@langinfo[:version] = RUBY_VErSION
|
62
|
+
end
|
63
|
+
|
64
|
+
# Initialize metadata for Python 3 kernel
|
65
|
+
def initialize_python3
|
66
|
+
@kernel[:language] = "python"
|
67
|
+
@kernel[:name] = "python3"
|
68
|
+
@kernel[:displayname] = "Python 3"
|
69
|
+
|
70
|
+
@langinfo[:name] = "python"
|
71
|
+
@langinfo[:fileext] = ".py"
|
72
|
+
@langinfo[:mime] = "text/x-python"
|
73
|
+
|
74
|
+
# Check for python3
|
75
|
+
`which python3`
|
76
|
+
if $?.success?
|
77
|
+
@langinfo[:version] = `python3 -V`.split(' ').last
|
78
|
+
else
|
79
|
+
# Fall back to initial 3.0 release, if no python3 executable is found
|
80
|
+
@langinfo[:version] = '3.0'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
data/lib/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jupyternb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Hermann Detz
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-03-29 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: " This gem provides useful functions to work with\n\t\t\t\t\t\t\t\t\t\t\t
|
14
|
+
Jupyter Notebook files.\n"
|
15
|
+
email:
|
16
|
+
- hermann.detz@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- ".gitignore"
|
22
|
+
- LICENSE
|
23
|
+
- README.md
|
24
|
+
- jupyternb.gemspec
|
25
|
+
- lib/cell.rb
|
26
|
+
- lib/generator.rb
|
27
|
+
- lib/helpers.rb
|
28
|
+
- lib/jupyternb.rb
|
29
|
+
- lib/metadata.rb
|
30
|
+
- lib/version.rb
|
31
|
+
homepage: https://github.com/hermanndetz/jupyternb
|
32
|
+
licenses:
|
33
|
+
- MIT
|
34
|
+
metadata: {}
|
35
|
+
post_install_message:
|
36
|
+
rdoc_options: []
|
37
|
+
require_paths:
|
38
|
+
- lib
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
requirements: []
|
50
|
+
rubyforge_project:
|
51
|
+
rubygems_version: 2.5.2.1
|
52
|
+
signing_key:
|
53
|
+
specification_version: 4
|
54
|
+
summary: Jupyter Notebook Tools
|
55
|
+
test_files: []
|