iruby-dependencies 2.1.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4b76ab22b037f610fc159aac6166d675e654f9fc
4
- data.tar.gz: f3a1bb3b000f5e7dc8ed7f9cbbf2de3fe4243e2f
2
+ SHA256:
3
+ metadata.gz: 93eac5474a61ffd224821a9423743f211683c362693002c0ae970fbab4e0df0a
4
+ data.tar.gz: 0375f511e0d79f2e52fa5e678d22a9e85b8c1e695ffa4a5d8db730ccdb43804a
5
5
  SHA512:
6
- metadata.gz: 20a85f396522977a3f7889a62a531839f11ff052fa7d699054d8a1eca67b4c47f8f7ef84adb638afd5f01175f92c0dd80a4e166ddda818acfecccb5c5db704e4
7
- data.tar.gz: 63063d28dd6f671dd9fd1d144b738e0cb480ddda8d64fcb1ad25e4d5fb59904e7dd4365326f6c8217987151aaca611c394109c40c1fa5dc7baaac714e18a0fe1
6
+ metadata.gz: 5a26e060f1a74f083fcfa074e8872f918ae254a152c32c30c815f84b0886c4f83d0af36a2fed25de7128fcd948fdfd9bd4600cfbd152ab4c8412fb7694b55cc3
7
+ data.tar.gz: aeb5d7547d3168b0ebbc9debb36438e04b8cd2212ad6c290ee8fcb45dc29c989ad597c4f4aebae573f57e643123b22cd8de9dc8a020ff97e67a04a281cec8b24
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # IRuby::Dependencies
2
2
 
3
- `IRuby::Dependencies` is a module for injecting Ruby dependencies into Jupyter Notebooks. For example,
3
+ `IRuby::Dependencies` is a thin wrapper around [bundler/inline](https://bundler.io/guides/bundler_in_a_single_file_ruby_script.html) for injecting Ruby dependencies into Jupyter Notebooks along with their system dependencies. For example,
4
4
 
5
5
  ```ruby
6
6
  require 'iruby/dependencies'
@@ -11,10 +11,6 @@ dependencies do
11
11
  end
12
12
  ```
13
13
 
14
- ## RubyGems Compatability
15
-
16
- There are issues with **rerunning** dependency blocks on machine with RubyGem versions greater than 2.4.5.1.
17
-
18
14
  ## Installation
19
15
 
20
16
  ```bash
@@ -25,15 +21,13 @@ You'll have to restart any IRuby kernels already running.
25
21
 
26
22
  ## Configuration
27
23
 
28
- `IRuby::Dependencies` reads in configuration from Bundler (see `bundle config`). The following configuration parameters are available:
24
+ Most Jupyter notebooks run in highly reproducible environments (e.g. Docker containers). An `IRuby::Dependencies` can be created that maps gems to the commands that must be executed before that gem can be installed. The config location should be saved as a [Bundler config](https://bundler.io/v2.1/bundle_config.html) with the key `dependencies.config`. The config location can be a local file path or URL. For example:
29
25
 
30
- | Key | Description |
31
- | ------ | ----------- |
32
- | `dependencies.require` | A colon-separated list of gems to require before running a dependency block. This can be used to load plugins automatically |
33
- | `dependencies.mypki` | Use MyPKI to pull from a PKI-enabled gem server |
34
- | `dependencies.config` | The URL to pull a remote iruby-dependencies config as JSON.|
26
+ ```bash
27
+ $ bundle config dependencies.config /home/jovyan/dependencies.config
28
+ ```
35
29
 
36
- Remote configurations are generally used to install gem dependencies. For example:
30
+ RemThe config file itself is a JSON file that maps gem names to commands that should be executed before the gem is installed. For instance, in a CentOS/RHEL environment, the config entry would install the `gsl` YUM package before installing the `gsl` RubyGem:
37
31
 
38
32
  ```json
39
33
  {
@@ -43,19 +37,8 @@ Remote configurations are generally used to install gem dependencies. For exampl
43
37
  }
44
38
  ```
45
39
 
46
- This configuration will install the `gsl` yum package if the user uses `IRuby::Dependencies` to install the `gsl` gem.
47
-
48
40
  ## Usage
49
41
 
50
- `IRuby::Dependencies` uses the [Bundler Gemfile syntax](http://bundler.io/v1.5/gemfile.html) with some additional methods:
51
-
52
- | Method | Description |
53
- | ------ | ----------- |
54
- | `script <url>` | Loads the javascript at the given url into the notebook as a `script` tag |
55
- | `define <hash>` | Defines alternate paths for requirejs modules. Keys are modules, values are paths |
56
- | `exec <string>` | Executes the system command, for example `yum install gsl` |
57
- | `css <string>` | Loads the stylesheet at the given url into the notebook as a `link` tag
58
-
59
42
  To see the normal bundler output, pass `verbose: true` to the dependencies method:
60
43
 
61
44
  ```
@@ -63,8 +46,4 @@ dependencies verbose: true do
63
46
  gem 'http'
64
47
  gem 'addressable'
65
48
  end
66
- ```
67
-
68
- ## Active Gems
69
-
70
- When `IRuby::Dependencies` is first loaded, it saves a list of all active gems, which are added to the dependency bundle. For example, since IRuby uses multi_json, the multi_json gem is always included in the bundle. Active gems cannot be removed and their versions are fixed. If you need a different version of an active gem, install it on the command line and restart the kernel. To reduce the number of active gems, `require 'iruby/dependencies'` as early in your notebook as possible.
49
+ ```
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "iruby", "~> 0.3"
22
- spec.add_dependency "multi_json", "~> 1.13"
23
- spec.add_dependency "bundler", "~> 1.16"
21
+ spec.add_dependency "iruby", "~> 0.4"
22
+ spec.add_dependency "bundler", "~> 2"
24
23
 
25
- spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "pry"
25
+ spec.add_development_dependency "rake"
26
26
  end
@@ -1,82 +1,78 @@
1
- require 'bundler'
2
-
3
- # require 'mypki' if requested so it is an active gem
4
- if Bundler.settings['dependencies.mypki']
5
- require 'mypki'
6
- require 'erector'
7
- end
8
-
9
- if gems = Bundler.settings['dependencies.require']
10
- gems.split(':').each {|gem| require gem}
11
- end
12
-
13
- require 'iruby/dependencies/dsl'
14
- require 'iruby/dependencies/config'
15
- require 'iruby/dependencies/shared_helpers'
16
- require 'iruby/dependencies/version'
1
+ require 'net/https'
2
+ require 'bundler/inline'
17
3
 
18
4
  module IRuby
19
- module Dependencies
20
- ACTIVE_GEMS = {}
5
+ class Dependencies
6
+ def initialize config, verbose: false, &block
7
+ @config = config
8
+ @verbose = verbose
21
9
 
22
- # this code is taken from bundler/inline with small changes
23
- def self.dependencies verbose: false, &gemfile
24
- if ACTIVE_GEMS.empty?
25
- ACTIVE_GEMS.merge! Gem.loaded_specs.map{|n,s| [n,s.version.to_s]}.to_h
26
- end
10
+ instance_eval &block
27
11
 
28
- Bundler.ui = verbose ? Bundler::UI::Shell.new : nil
29
- MyPKI.init if Bundler.settings['dependencies.mypki']
30
-
31
- warn 'Dependencies installing. This could take a minute ...'
32
- old_root = Bundler.method(:root)
33
-
34
- def Bundler.root
35
- Bundler::SharedHelpers.pwd.expand_path
12
+ gemfile do
13
+ # tell bundler to use our gem sources
14
+ Gem.sources.each {|source| source source.to_s}
15
+ instance_eval &block
36
16
  end
37
-
38
- ENV['BUNDLE_GEMFILE'] ||= 'Gemfile'
39
-
40
- builder = Dsl.new
41
- builder.instance_eval(&gemfile)
17
+ end
42
18
 
43
- Gem::ConfigFile.new ['sources']
44
- Gem.sources.each {|s| builder.source s}
19
+ def gem name, *args
20
+ send *@config[name] if @config[name]
21
+ end
45
22
 
46
- ACTIVE_GEMS.each do |name,version|
47
- builder.gem name, version, require: false
23
+ def exec string
24
+ stdout, stderr, exit_status = Open3.capture3(string)
25
+
26
+ if exit_status.success?
27
+ if @verbose
28
+ Bundler.ui.info stdout unless stdout.empty?
29
+ Bundler.ui.warn stderr unless stderr.empty?
30
+ end
31
+ else
32
+ puts stdout unless stdout.empty?
33
+ warn stderr unless stderr.empty?
34
+ raise "\"exec '#{string}'\" failed on dependency installation"
48
35
  end
36
+ end
49
37
 
50
- Config.process builder
51
- definition = builder.to_definition(nil, true)
52
-
53
- def definition.lock(*); end
54
- definition.validate_ruby!
55
-
56
- Bundler::Installer.install(Bundler.root, definition, :system => true)
57
-
58
- runtime = Bundler::Runtime.new(nil, definition)
59
- runtime.setup.require
60
-
61
- bundler_module = class << Bundler; self; end
62
- bundler_module.send(:define_method, :root, old_root)
38
+ # gemfiles allow specifying alternate sources for gems
39
+ # make sure we check the block for gems in those sources
40
+ def source &block
41
+ instance_eval &block if block_given?
42
+ end
63
43
 
64
- html = IRuby.html <<-HTML
65
- <div style='
66
- margin: -0.4em;
67
- padding: 0.4em;
68
- background: rgba(0, 255, 0, .3);
69
- font-family: monospace;
70
- '>
71
- Dependencies successfully installed.
44
+ def to_html
45
+ <<-HTML
46
+ <div style='background: rgba(0,255,0,0.3);
47
+ font-family: monospace;
48
+ padding: 5px;'>
49
+ <b>Dependencies successfully installed!</b>
72
50
  </div>
73
51
  HTML
74
-
75
- IRuby.display html; nil
76
52
  end
77
53
  end
78
54
  end
79
55
 
80
- def dependencies *args, &block
81
- IRuby::Dependencies.dependencies *args, &block
56
+ def dependencies **params, &block
57
+ config={}
58
+
59
+ begin
60
+ if config_path = Bundler.settings['dependencies.config']
61
+ uri = URI config_path
62
+
63
+ json = case uri.scheme
64
+ when /http/
65
+ Net::HTTP.get(uri)
66
+ else
67
+ File.read(uri.path)
68
+ end
69
+
70
+ config = JSON.parse(json)
71
+ end
72
+
73
+ rescue => ex
74
+ warn "iruby-dependencies could not load #{config_path}: #{ex.message}"
75
+ end
76
+
77
+ IRuby::Dependencies.new config, **params, &block
82
78
  end
@@ -1,5 +1,5 @@
1
1
  module IRuby
2
- module Dependencies
3
- VERSION = "2.1.0"
2
+ class Dependencies
3
+ VERSION = "3.0.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iruby-dependencies
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle King
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-30 00:00:00.000000000 Z
11
+ date: 2021-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: iruby
@@ -16,57 +16,57 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.3'
19
+ version: '0.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.3'
26
+ version: '0.4'
27
27
  - !ruby/object:Gem::Dependency
28
- name: multi_json
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.13'
33
+ version: '2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.13'
40
+ version: '2'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.16'
48
- type: :runtime
47
+ version: '0'
48
+ type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '1.16'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
69
- description:
68
+ version: '0'
69
+ description:
70
70
  email:
71
71
  - kylejking@gmail.com
72
72
  executables: []
@@ -82,15 +82,12 @@ files:
82
82
  - bin/setup
83
83
  - iruby-dependencies.gemspec
84
84
  - lib/iruby/dependencies.rb
85
- - lib/iruby/dependencies/config.rb
86
- - lib/iruby/dependencies/dsl.rb
87
- - lib/iruby/dependencies/shared_helpers.rb
88
85
  - lib/iruby/dependencies/version.rb
89
86
  homepage: https://github.com/jupyter-gallery/iruby-dependencies
90
87
  licenses:
91
88
  - MIT
92
89
  metadata: {}
93
- post_install_message:
90
+ post_install_message:
94
91
  rdoc_options: []
95
92
  require_paths:
96
93
  - lib
@@ -105,9 +102,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
102
  - !ruby/object:Gem::Version
106
103
  version: '0'
107
104
  requirements: []
108
- rubyforge_project:
109
- rubygems_version: 2.6.14
110
- signing_key:
105
+ rubygems_version: 3.1.4
106
+ signing_key:
111
107
  specification_version: 4
112
108
  summary: IRuby::Dependencies is a module for injecting Ruby dependencies into Jupyter
113
109
  Notebooks
@@ -1,46 +0,0 @@
1
- require 'net/https'
2
- require 'multi_json'
3
-
4
- module IRuby
5
- module Dependencies
6
- class Config
7
- def self.process builder
8
- if url = Bundler.settings['dependencies.config']
9
- begin
10
- uri = URI Bundler.settings['dependencies.config']
11
- config = MultiJson.load(Net::HTTP.get(uri))
12
- rescue => ex
13
- warn "Could not fetch remote IRuby::Dependencies config from #{url}: #{ex.message}"
14
- else
15
- loop do
16
- gem_added = false
17
-
18
- if commands = config.delete('*')
19
- commands.each do |command|
20
- method, *args = command
21
- builder.send method, *args
22
- gem_added ||= method == 'gem'
23
- end
24
- end
25
-
26
- definition = builder.to_definition nil, true
27
- definition.resolve_remotely!
28
-
29
- definition.specs.each do |spec|
30
- if commands = config.delete(spec.name)
31
- commands.each do |command|
32
- method, *args = command
33
- builder.send method, *args
34
- gem_added ||= method == 'gem'
35
- end
36
- end
37
- end
38
-
39
- break unless gem_added
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,96 +0,0 @@
1
- require 'open3'
2
-
3
- module IRuby
4
- module Dependencies
5
- class Dsl < ::Bundler::Dsl
6
- def config hash
7
- hash.each do |key,value|
8
- Bundler.settings[key] = value
9
- end
10
- end
11
-
12
- def exec string
13
- stdout, stderr, exit_status = Open3.capture3(string)
14
-
15
- if exit_status.success?
16
- Bundler.ui.info stdout unless stdout.empty?
17
- Bundler.ui.warn stderr unless stderr.empty?
18
- else
19
- puts stdout unless stdout.empty?
20
- warn stderr unless stderr.empty?
21
- raise "\"exec '#{string}'\" failed on dependency installation"
22
- end
23
- end
24
-
25
- def eval string
26
- super string
27
- end
28
-
29
- def css *paths
30
- paths.each do |path|
31
- url = full_url path
32
- html = "<link rel='stylesheet' href='#{url}'>"
33
- IRuby.display IRuby.html(html)
34
- end
35
- end
36
-
37
- def define hash
38
- mapped = hash.map do |mod,path|
39
- [mod, full_url(path)]
40
- end.to_h
41
-
42
- js = <<-JS
43
- requirejs.config({
44
- map: {
45
- '*': #{MultiJson.dump(mapped)}
46
- }
47
- });
48
- JS
49
-
50
- IRuby.display IRuby.javascript(js)
51
- end
52
-
53
- def script *paths
54
- paths.each do |path|
55
- url = full_url path
56
- html = "<script src='#{url}'></script>"
57
- IRuby.display IRuby.html(html)
58
- end
59
- end
60
-
61
- def url url
62
- @url = url
63
- end
64
-
65
- def gem name, *args
66
- if version = ACTIVE_GEMS[name]
67
- options = args.last.is_a?(Hash) ? args.pop.dup : {}
68
-
69
- unless args.empty? or args == [version]
70
- raise GemfileError, "The IRuby runtime has already loaded #{name}-#{version}. If you need a different version, you'll need to install it manually and restart IRuby."
71
- else
72
- super name, [version], options
73
- end
74
- else
75
- super name, *args
76
- end
77
- end
78
-
79
- private
80
-
81
- def full_url path
82
- if path[/^https?:/]
83
- path
84
- else
85
- if @url
86
- File.join @url, path
87
- elsif url = Bundler.settings['dependencies.url']
88
- File.join url, path
89
- else
90
- raise "Cannot inject #{path} without a base url"
91
- end
92
- end
93
- end
94
- end
95
- end
96
- end
@@ -1,7 +0,0 @@
1
- module Bundler
2
- # https://github.com/bundler/bundler/issues/4837
3
- module SharedHelpers
4
- def clean_load_path
5
- end
6
- end
7
- end