Skip to content

Instantly share code, notes, and snippets.

@rscottm
Created March 1, 2014 22:50
Show Gist options
  • Select an option

  • Save rscottm/9298760 to your computer and use it in GitHub Desktop.

Select an option

Save rscottm/9298760 to your computer and use it in GitHub Desktop.
Code for finding and storing dependencies in stdlib.
class StdlibDependencies
attr_reader :dependencies, :version
PATTERN = %r{^\s*require ['"]([a-zA-Z0-9/-_]+)["']\s*$}
def self.[](key)
versions[key]
end
def self.versions
@@versions ||= {}
end
def self.generate(dir=".")
@@versions = {}
Dir.chdir(dir) do
raise("Can't find shared directory") unless File.directory?("shared")
Dir["*"].select{|d| File.directory?(d) && d != "shared"}.each do |d|
new(d).generate
end
end
versions
end
def self.dump(file)
require 'yaml'
all_dependencies = {}
versions.each{|k, v| all_dependencies[k] = v.dependencies}
File.open( file, 'w' ) do |out|
YAML.dump( all_dependencies, out )
end
versions
end
def self.load(file)
require 'yaml'
raise("Can't find #{file}") unless File.exists?(file)
File.open( 'stdlib.yml' ) do |versions|
YAML.load(versions).each{|k,v| new(k, v)}
end
versions
end
def initialize(version, dependencies={})
@version = version
@dependencies = dependencies
@@versions ||= {}
@@versions[@version] = self
end
def [](key)
@dependencies[key]
end
def generate
raise("Can't find shared directory") unless File.directory?("shared")
raise("Can't find #{@version} directory") unless File.directory?(@version)
Dir.chdir("shared"){check_dir}
Dir.chdir(@version){check_dir}
# Clean up dependencies
@dependencies.keys.sort.each do |i|
# remove duplicates
@dependencies[i] = @dependencies[i].uniq
# remove references to self
@dependencies[i] = @dependencies[i] - [i]
end
self
end
private
def depends_on(name, on=nil)
base = name[0..-4].split("/")[0]
@dependencies[base] = (@dependencies[base] || [])
(@dependencies[base] << on.split("/")[0]) if on
end
def gather_dependencies(file)
depends_on(file)
IO.read(file).scan(PATTERN) do |j|
depends_on(file, j[0])
end
end
def check_dir(dir=nil)
Dir[dir ? "#{dir}/*" : "*"].each do |i|
gather_dependencies(i) if i[-3..-1] == ".rb"
check_dir(i) if File.directory?(i)
end
end
end
# To generate
StdlibDependencies.generate(<dir with versions>)
StdlibDependencies.dump('stdlib.yml')
# To load
StdlibDependencies.load('stdlib.yml')
#Access
StdlibDependencies["1.9"]["webrick"]
---
"1.9":
csv:
- forwardable
- English
- date
- stringio
monitor:
- thread
ripper: []
pstore:
- fileutils
- digest
- thread
getoptlong: []
optparse:
- shellwords
- time
- date
- uri
cgi:
- tmpdir
- securerandom
- digest
- tempfile
- stringio
- shellwords
- pstore
debug:
- tracer
- pp
- readline
e2mmap: []
readline: []
syslog:
- ffi
krypt-provider-jdk: []
bouncy-castle-java: []
uri: []
ostruct: []
irb:
- e2mmap
- readline
- tempfile
- thread
- mathn
- tracer
- rdoc
webrick:
- time
- uri
- tempfile
- digest
- socket
- net
- stringio
- fcntl
- etc
- thread
- timeout
- singleton
- openssl
- erb
- rbconfig
securerandom:
- java
krypt_missing: []
ipaddr:
- socket
- test
- set
expect: []
krypt-core: []
psych:
- bigdecimal
- date
- strscan
- stringio
set:
- tsort
- rbtree
- test
tracer:
- thread
erb:
- strscan
bigdecimal: []
socket: []
open-uri:
- uri
- stringio
- time
- net
- tempfile
- socket
gserver:
- socket
- thread
prettyprint: []
tempfile:
- tmpdir
drb:
- socket
- tmpdir
- etc
- thread
- monitor
- fcntl
- weakref
- observer
- foo
- openssl
- singleton
- ipaddr
cmath: []
complex:
- cmath
English: []
un:
- fileutils
- optparse
- mkmf
- webrick
gauntlet_rdoc:
- rubygems
- rdoc
- gauntlet
- fileutils
delegate: []
rubygems:
- rbconfig
- zlib
- fileutils
- stringio
- psych
- yaml
- rdoc
- jruby
- net
- thread
- time
- tsort
- rake
- openssl
- find
- uri
- cgi
- etc
- Win32API
- timeout
- tmpdir
- English
- tempfile
- digest
- builder
- pathname
- minitest
- pp
- shellwords
- socket
- optparse
- monitor
- io
- resolv
- webrick
- erb
rdoc:
- cgi
- strscan
- json
- find
- fileutils
- pathname
- time
- rubygems
- e2mmap
- irb
- stringio
- minitest
- abbrev
- optparse
- readline
- win32console
- pp
- java
- shellwords
- webrick
- rbconfig
- erb
- tempfile
- tmpdir
- tsort
- rake
- psych
- yaml
find: []
resolv:
- socket
- fcntl
- timeout
- thread
- securerandom
- win32
syck: []
ant:
- java
- rbconfig
- rubygems
- rake
- rexml
jruby:
- rubygems
- optparse
- fileutils
- digest
- java
net:
- socket
- timeout
- English
- digest
- openssl
- monitor
- strscan
- getoptlong
- io
- uri
- zlib
- win32
- tempfile
yaml:
- psych
- syck
- dbm
- pstore
benchmark: []
jopenssl19:
- stringio
- openssl
- fcntl
- krypt
jopenssl21:
- stringio
- openssl
- fcntl
- krypt
fiber: []
openssl:
- java
- jopenssl
pty:
- ffi
test:
- minitest
- optparse
- rbconfig
- io
- thread
- timeout
- rubygems
- pp
rss:
- iconv
- uconv
- nkf
- forwardable
- xmlscan
- stringio
- xml
- xmlparser
- time
- English
- rexml
rake:
- rbconfig
- thread
- set
- date
- net
- fileutils
- test
- shellwords
- optparse
- singleton
- monitor
- ostruct
dl:
- thread
- ffi
- fiddle
fileutils:
- etc
kconv:
- nkf
profile:
- profiler
open3: []
logger:
- monitor
time:
- date
abbrev: []
scanf: []
mutex_m:
- thread
sync: []
rbconfig: []
win32:
- Win32API
- dl
pp:
- prettyprint
rinda:
- drb
- thread
- monitor
- enumerator
- forwardable
racc: []
io:
- java
- ffi
shellwords: []
rational: []
xmlrpc:
- date
- xmltreebuilder
- xmlparser
- nqxml
- rexml
- xmlscan
- gserver
- webrick
- net
base64: []
profiler: []
minitest:
- rubygems
- optparse
- rbconfig
- pathname
- tempfile
- stringio
shell:
- e2mmap
- forwardable
- thread
- sync
krypt: []
mkmf:
- rbconfig
- fileutils
- shellwords
java:
- jruby
pathname:
- pathname_ext
- find
- fileutils
jopenssl:
- jruby
- openssl
ubygems:
- rubygems
tsort: []
rexml:
- set
- forwardable
- stringio
matrix: []
resolv-replace:
- socket
- resolv
ffi:
- rbconfig
- tmpdir
- tempfile
- open3
- lib
- rake
jopenssl18:
- stringio
- openssl
- fcntl
- digest
mathn: []
thwait: []
json:
- simplecov
- ostruct
- strscan
- date
- iconv
gauntlet_rubygems:
- rubygems
- gauntlet
Win32API:
- rbconfig
digest:
- test
prime:
- singleton
- forwardable
fiddle:
- ffi
- dl
singleton:
- thread
tmpdir:
- fileutils
forwardable: []
date:
- racc
observer: []
"1.8":
tmpdir:
- fileutils
jopenssl18:
- stringio
- openssl
- fcntl
- digest
java:
- jruby
delegate:
- delegate_internal
- thread
pp:
- prettyprint
- test
jopenssl21:
- stringio
- openssl
- fcntl
- krypt
rubygems:
- rbconfig
- zlib
- fileutils
- stringio
- psych
- yaml
- rdoc
- jruby
- net
- thread
- time
- tsort
- rake
- openssl
- find
- uri
- cgi
- etc
- Win32API
- timeout
- tmpdir
- English
- tempfile
- digest
- builder
- pathname
- minitest
- pp
- shellwords
- socket
- optparse
- monitor
- io
- resolv
- webrick
- erb
erb:
- strscan
jopenssl:
- jruby
- openssl
optparse:
- shellwords
- time
- date
- uri
mailread: []
pathname:
- find
- fileutils
yaml:
- stringio
- dbm
- pstore
- date
mkmf:
- rbconfig
- fileutils
- shellwords
scanf: []
pstore:
- fileutils
- digest
profile:
- profiler
dl:
- ffi
prettyprint:
- test
krypt-provider-jdk: []
wsdl:
- xsd
- logger
- soap
parsearg:
- getopts
openssl:
- java
- jopenssl
thwait: []
md5:
- digest
fiber: []
expect: []
mathn: []
rss:
- iconv
- uconv
- nkf
- forwardable
- xmlscan
- stringio
- xml
- xmlparser
- time
- English
- rexml
- base64
tracer: []
cgi:
- English
- nkf
- delegate
- tempfile
- stringio
- shellwords
- tmpdir
- securerandom
- digest
- pstore
gauntlet_rubygems:
- rubygems
- gauntlet
tsort:
- test
ubygems:
- rubygems
shell:
- e2mmap
- thread
- ftools
- mutex_m
- monitor
- sync
rinda:
- drb
- thread
- monitor
- enumerator
- forwardable
abbrev: []
logger:
- monitor
jopenssl19:
- stringio
- openssl
- fcntl
- krypt
irb:
- e2mmap
- readline
- tempfile
- thread
- mathn
- tracer
- rdoc
date:
- rational
Win32API:
- rbconfig
Env:
- importenv
benchmark: []
krypt-core: []
rubyunit:
- runit
- test
rexml:
- set
- forwardable
- uconv
- nkf
- iconv
psych:
- bigdecimal
- date
- strscan
- stringio
ostruct: []
parsedate:
- date
mutex_m: []
pty:
- ffi
e2mmap: []
monitor:
- thread
time:
- parsedate
- test
set:
- tsort
- rbtree
- test
rake:
- rbconfig
- thread
- set
- date
- net
- fileutils
- test
- shellwords
- optparse
- singleton
- monitor
- ostruct
find: []
drb:
- socket
- tmpdir
- etc
- thread
- monitor
- fcntl
- weakref
- observer
- foo
- openssl
- singleton
- ipaddr
cgi-lib:
- delegate
sha1:
- digest
getopts: []
jruby:
- rubygems
- optparse
- fileutils
- digest
- java
finalize: []
English: []
generator: []
uri: []
ipaddr:
- socket
- test
bouncy-castle-java: []
base64:
- kconv
fileutils:
- etc
importenv: []
net:
- socket
- delegate
- timeout
- English
- digest
- openssl
- uri
- monitor
- getoptlong
complex: []
ftools: []
win32:
- Win32API
io:
- fcntl
kconv:
- nkf
tempfile:
- tmpdir
ping:
- timeout
- socket
date2:
- date
csv: []
un:
- fileutils
- optparse
getoptlong: []
ffi:
- rbconfig
- tmpdir
- tempfile
- open3
- lib
- rake
resolv-replace:
- socket
- resolv
eregex: []
krypt: []
runit:
- test
rdoc:
- e2mmap
- irb
- find
- ftools
- time
- test
- cgi
- rbconfig
- rubygems
- fileutils
- yaml
- singleton
- getoptlong
webrick:
- time
- timeout
- uri
- tempfile
- digest
- socket
- net
- stringio
- fcntl
- etc
- openssl
- erb
- thread
- rbconfig
observer: []
shellwords: []
jcode: []
debug:
- tracer
- pp
- readline
singleton:
- thread
profiler: []
xmlrpc:
- date
- xmltreebuilder
- xmlparser
- nqxml
- rexml
- xmlscan
- gserver
- webrick
- net
test:
- gtk
- fox
- gtk2
- tk
- pp
- optparse
ant:
- java
- rbconfig
- rubygems
- rake
- rexml
bigdecimal: []
syslog:
- ffi
sync:
- thread
resolv:
- socket
- fcntl
- timeout
- thread
- rbconfig
- securerandom
- win32
krypt_missing: []
racc: []
rbconfig: []
forwardable: []
digest: []
readbytes: []
securerandom:
- java
xsd:
- nkf
- uconv
- iconv
- uri
- rational
- date
- xmlscan
- xml
- rexml
- soap
matrix: []
soap:
- xsd
- wsdl
- net
- logger
- webrick
- stringio
- zlib
fiddle:
- ffi
- dl
open-uri:
- uri
- stringio
- time
- net
- tempfile
- socket
rational: []
open3: []
gserver:
- socket
- thread
readline: []
"2.0":
csv:
- forwardable
- English
- date
- stringio
monitor:
- thread
readline: []
syslog:
- ffi
cgi:
- tmpdir
- securerandom
- digest
- tempfile
- stringio
- shellwords
- pstore
krypt-provider-jdk: []
optparse:
- shellwords
- time
- date
- uri
pstore:
- digest
bouncy-castle-java: []
uri:
- socket
ostruct: []
ssl:
- socket
- openssl
- drb
- singleton
irb:
- e2mmap
- readline
- tempfile
- thread
- mathn
- tracer
- rdoc
webrick:
- time
- uri
- tempfile
- digest
- socket
- net
- stringio
- fcntl
- etc
- thread
- timeout
- singleton
- openssl
- erb
- rbconfig
securerandom:
- java
krypt_missing: []
ipaddr:
- socket
- test
- set
krypt-core: []
psych:
- bigdecimal
- date
- strscan
- stringio
set:
- tsort
- rbtree
tracer:
- thread
erb:
- cgi
- strscan
bigdecimal: []
socket: []
open-uri:
- uri
- stringio
- time
- net
- tempfile
gserver:
- socket
- thread
tempfile:
- tmpdir
drb:
- socket
- openssl
- singleton
un:
- fileutils
- optparse
- mkmf
- webrick
delegate: []
rubygems:
- rbconfig
- zlib
- fileutils
- stringio
- psych
- yaml
- rdoc
- jruby
- net
- thread
- time
- tsort
- rake
- openssl
- find
- uri
- cgi
- etc
- Win32API
- timeout
- tmpdir
- English
- tempfile
- digest
- builder
- pathname
- minitest
- pp
- shellwords
- socket
- optparse
- monitor
- io
- resolv
- webrick
- erb
rdoc:
- cgi
- strscan
- json
- find
- fileutils
- pathname
- time
- rubygems
- e2mmap
- irb
- stringio
- minitest
- abbrev
- optparse
- readline
- win32console
- pp
- java
- shellwords
- webrick
- rbconfig
- erb
- tempfile
- tmpdir
- tsort
- rake
- psych
- yaml
ant:
- java
- rbconfig
- rubygems
- rake
- rexml
resolv:
- socket
- fcntl
- timeout
- thread
- securerandom
- win32
jruby:
- rubygems
- optparse
- fileutils
- digest
- java
net:
- English
- digest
- timeout
- openssl
- socket
- tempfile
- monitor
- strscan
- getoptlong
- io
- uri
- zlib
- win32
yaml:
- psych
- dbm
- pstore
jopenssl19:
- stringio
- openssl
- fcntl
- krypt
benchmark: []
jopenssl21:
- stringio
- openssl
- fcntl
- krypt
fiber: []
openssl:
- java
- jopenssl
- stringio
- fcntl
pty:
- ffi
test:
- minitest
- optparse
- rbconfig
- io
- thread
- timeout
- rubygems
- pp
rss:
- iconv
- uconv
- nkf
- forwardable
- xmlscan
- stringio
- xml
- xmlparser
- time
- English
- rexml
rake:
- rbconfig
- thread
- set
- date
- net
- fileutils
- test
- shellwords
- optparse
- singleton
- monitor
- ostruct
- rubygems
- ftools
- rdoc
fileutils:
- etc
abbrev: []
time:
- date
sync: []
rbconfig: []
rinda:
- drb
- thread
- monitor
- enumerator
- forwardable
racc: []
pp:
- prettyprint
xmlrpc:
- date
- xmltreebuilder
- xmlparser
- nqxml
- rexml
- xmlscan
- gserver
- webrick
- net
- uri
minitest:
- rubygems
- optparse
- rbconfig
- tempfile
- stringio
- pp
- thread
krypt: []
mkmf:
- rbconfig
- fileutils
- shellwords
profiler: []
java:
- jruby
shell:
- e2mmap
- forwardable
jopenssl:
- jruby
- openssl
ubygems:
- rubygems
ffi:
- rbconfig
- tmpdir
- tempfile
- open3
- lib
- rake
matrix: []
jopenssl18:
- stringio
- openssl
- fcntl
- digest
rexml:
- set
- forwardable
- stringio
gauntlet_rubygems:
- rubygems
- gauntlet
Win32API:
- rbconfig
fiddle:
- ffi
- dl
tmpdir:
- fileutils
thread: []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment