cabbage 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.
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem "shoulda", ">= 0"
10
+ gem "bundler", "~> 1.0.0"
11
+ gem "jeweler", "~> 1.6.4"
12
+ gem "rcov", ">= 0"
13
+ end
@@ -0,0 +1,20 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ git (1.2.5)
5
+ jeweler (1.6.4)
6
+ bundler (~> 1.0)
7
+ git (>= 1.2.5)
8
+ rake
9
+ rake (0.9.2)
10
+ rcov (0.9.10)
11
+ shoulda (2.11.3)
12
+
13
+ PLATFORMS
14
+ ruby
15
+
16
+ DEPENDENCIES
17
+ bundler (~> 1.0.0)
18
+ jeweler (~> 1.6.4)
19
+ rcov
20
+ shoulda
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Your Name
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,15 @@
1
+ = cabbage
2
+
3
+ Cabbage is a simple gem that perses Graphviz DOT files.
4
+
5
+ use:
6
+ install the gem named 'cabbage', and parse a dotfile by invoking 'Cabbage.dotfile(arg)' in your script.
7
+ (where 'arg' is either a string containing either a path to a a dotfile or a dotfile itself in the form of a string)
8
+
9
+ == Contributing to cabbage
10
+ Send me a message if you feel the urge to contribute.
11
+ Fork at will.
12
+
13
+ == Copyright
14
+ Do whatever you want with it.
15
+
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "cabbage"
18
+ gem.homepage = "http://github.com/josh-lauer/cabbage"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{A simple graphviz DOT parser.}
21
+ gem.description = %Q{More to come.}
22
+ gem.email = "josh.lauer75@gmail.com"
23
+ gem.authors = ["Josh Lauer"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ require 'rcov/rcovtask'
36
+ Rcov::RcovTask.new do |test|
37
+ test.libs << 'test'
38
+ test.pattern = 'test/**/test_*.rb'
39
+ test.verbose = true
40
+ test.rcov_opts << '--exclude "gems/*"'
41
+ end
42
+
43
+ task :default => :test
44
+
45
+ require 'rake/rdoctask'
46
+ Rake::RDocTask.new do |rdoc|
47
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+
49
+ rdoc.rdoc_dir = 'rdoc'
50
+ rdoc.title = "cabbage #{version}"
51
+ rdoc.rdoc_files.include('README*')
52
+ rdoc.rdoc_files.include('lib/**/*.rb')
53
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
@@ -0,0 +1,60 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "cabbage"
8
+ s.version = "0.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Josh Lauer"]
12
+ s.date = "2011-09-24"
13
+ s.description = "More to come."
14
+ s.email = "josh.lauer75@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE.txt",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "cabbage.gemspec",
28
+ "lib/cabbage.rb",
29
+ "test/helper.rb",
30
+ "test/test_cabbage.rb",
31
+ "testbed.rb"
32
+ ]
33
+ s.homepage = "http://github.com/josh-lauer/cabbage"
34
+ s.licenses = ["MIT"]
35
+ s.require_paths = ["lib"]
36
+ s.rubygems_version = "1.8.10"
37
+ s.summary = "A simple graphviz DOT parser."
38
+
39
+ if s.respond_to? :specification_version then
40
+ s.specification_version = 3
41
+
42
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
44
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
45
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
46
+ s.add_development_dependency(%q<rcov>, [">= 0"])
47
+ else
48
+ s.add_dependency(%q<shoulda>, [">= 0"])
49
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
50
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
51
+ s.add_dependency(%q<rcov>, [">= 0"])
52
+ end
53
+ else
54
+ s.add_dependency(%q<shoulda>, [">= 0"])
55
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
56
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
57
+ s.add_dependency(%q<rcov>, [">= 0"])
58
+ end
59
+ end
60
+
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ module Cabbage
4
+
5
+ # just pass calls to new on to DotFile class for now
6
+ def self.new(*args, &block)
7
+ DotFile.new(args[0], &block) # passes the the first argument on
8
+ end
9
+
10
+ def self.dotfile(*args, &block)
11
+ DotFile.new(args[0], &block) # passes the the first argument on
12
+ end
13
+
14
+ class DotFile
15
+
16
+ # pass it a string containing either the DotFile itself, or the path to
17
+ # a DOTfile.
18
+ def initialize(source = nil)
19
+ @raw_dotfile = "" # unparsed DOTfile
20
+ @type = "" #
21
+ @title = ""
22
+ @header = {}
23
+ @tables = {}
24
+ @connections = []
25
+ source != nil if parse(source)
26
+ end
27
+
28
+ attr_accessor :raw_dotfile, :type, :title, :header, :tables, :connections
29
+
30
+ def parse(source = nil)
31
+ begin
32
+ if source.class == String
33
+ if source.include?("\n")
34
+ load_from_string(source)
35
+ else
36
+ load_from_file(source)
37
+ end
38
+ parse_dotfile()
39
+ elsif source
40
+ raise
41
+ end
42
+ rescue
43
+ puts 'Unhandled parser exception! Parse failed.'
44
+ end
45
+ end
46
+
47
+ def load_from_file(dotfile_path)
48
+ @raw_dotfile = IO.read(dotfile_path)
49
+ end
50
+
51
+ def load_from_string(dotfile)
52
+ @raw_dotfile = dotfile
53
+ end
54
+
55
+ def parse_header(raw_header, delimiter)
56
+ temp = {}
57
+ raw_header.scan(/(\w+)(?:\s*=?\s*)(?:["|\[](.+?)["|\]]#{delimiter})/m).each do |n|
58
+ if n[1].include?("=")
59
+ temp[n[0]] = parse_header(n[1], ",")
60
+ else
61
+ temp[n[0]] = n[1]
62
+ end
63
+ end
64
+ return temp
65
+ end
66
+
67
+ def parse_tables(raw_tables)
68
+ {}.tap do |output|
69
+ raw_tables.scan(/\s*\"*([\w:]+)\"*\s*\[\w+\s*=\s*<(.+?)>\];/m).each do |n|
70
+ output[ n[0].gsub('\"', '').strip ] = n[1].strip
71
+ end
72
+ end
73
+ end
74
+
75
+ def parse_connections(node_chunk)
76
+ output = []
77
+ node_chunk.split("\n").each do |this_line|
78
+ this_connection = {}
79
+ temp = this_line.split("->")
80
+ this_connection["node_from"] = temp[0].gsub('"', '').gsub('\\', '').strip
81
+ this_connection["node_to"] = temp[1].split("[")[0].gsub('"', '').gsub('\\', '').strip
82
+ tokens = temp[1].split("[")[1].split("]")[0].split(",")
83
+ tokens.each do |token_string|
84
+ token_pair = token_string.split("=")
85
+ this_connection[token_pair[0].strip.gsub('"', '').gsub('\\', '')] = token_pair[1].strip.gsub('"', '').gsub('\\', '')
86
+ end
87
+ output << this_connection
88
+ end
89
+ return output
90
+ end
91
+
92
+ # structure:
93
+ # title, header, tables, footer
94
+ def parse_dotfile
95
+ # the chunk is everything inside '{}'
96
+ raw_chunk = @raw_dotfile.split("{")[1].split("}")[0].strip
97
+ # pull out the header
98
+ raw_header = raw_chunk.match(/([\w\s*=".,\s\[\]_\\]+;)*/m)[0]
99
+ # find body by chopping header off chunk
100
+ raw_body = raw_chunk.sub(raw_header, "")
101
+ # split the body on '>];', which delimits the tables section
102
+ raw_connections = raw_body.split(">];")[-1].strip
103
+ # split out the tables section from the body
104
+ raw_tables = raw_body.split(">];")[0 .. -2].join(">];").strip + " \n>];"
105
+
106
+ # assemble the output hash
107
+ @type = @raw_dotfile.match(/\A\s*((?:di)?graph)/)[1]
108
+ @title = @raw_dotfile.match(/\A\s*(?:di)?graph\s*(\w+)/)[1]
109
+ @header = parse_header(raw_header, ";")
110
+ @tables = parse_tables(raw_tables)
111
+ @connections = parse_connections(raw_connections)
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'cabbage'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestCabbage < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ require 'irb'
4
+ require 'ruby-debug'
5
+ require 'cabbage'
6
+
7
+ class Object
8
+ # Return only the methods not present on basic objects
9
+ def interesting_methods
10
+ (self.methods - Object.instance_methods).sort
11
+ end
12
+ end
13
+
14
+ def reload
15
+ @output = Cabbage.dotfile("ERD.dot")
16
+ end
17
+
18
+ @output = reload
19
+ # put stuff here you only want to run once
20
+ # ARGV.clear
21
+ IRB.setup nil
22
+ IRB.conf[:MAIN_CONTEXT] = IRB::Irb.new.context
23
+ require 'irb/ext/multi-irb'
24
+ IRB.irb nil, self
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cabbage
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Josh Lauer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-24 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: shoulda
16
+ requirement: &21941980 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *21941980
25
+ - !ruby/object:Gem::Dependency
26
+ name: bundler
27
+ requirement: &21938740 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.0
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *21938740
36
+ - !ruby/object:Gem::Dependency
37
+ name: jeweler
38
+ requirement: &21935440 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 1.6.4
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *21935440
47
+ - !ruby/object:Gem::Dependency
48
+ name: rcov
49
+ requirement: &21918060 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *21918060
58
+ description: More to come.
59
+ email: josh.lauer75@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files:
63
+ - LICENSE.txt
64
+ - README.rdoc
65
+ files:
66
+ - .document
67
+ - Gemfile
68
+ - Gemfile.lock
69
+ - LICENSE.txt
70
+ - README.rdoc
71
+ - Rakefile
72
+ - VERSION
73
+ - cabbage.gemspec
74
+ - lib/cabbage.rb
75
+ - test/helper.rb
76
+ - test/test_cabbage.rb
77
+ - testbed.rb
78
+ homepage: http://github.com/josh-lauer/cabbage
79
+ licenses:
80
+ - MIT
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ segments:
92
+ - 0
93
+ hash: -2133775647240857058
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 1.8.10
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: A simple graphviz DOT parser.
106
+ test_files: []