data_doc 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,14 @@
1
+ === 0.0.3 2012-10-22
2
+
3
+ * 4 minor enhancements:
4
+ * RDoc coverage established
5
+ * Layouts
6
+ * Headers
7
+ * ERB processing under $SAFE = 4
8
+
1
9
  === 0.0.2 2012-10-18
2
10
 
3
- * 1 minor enhancement:
11
+ * 2 minor enhancements:
4
12
  * Documentation fix
5
13
  * Test release
6
14
 
@@ -1,14 +1,19 @@
1
1
  History.txt
2
2
  Manifest.txt
3
- PostInstall.txt
4
3
  README.rdoc
5
4
  Rakefile
6
5
  bin/data_doc
7
6
  lib/data_doc.rb
8
7
  lib/data_doc/cli.rb
8
+ lib/data_doc/document.rb
9
+ lib/data_doc/store.rb
10
+ lib/data_doc/present.rb
9
11
  script/console
10
12
  script/destroy
11
13
  script/generate
12
14
  test/test_data_doc.rb
15
+ test/test_data_doc_document.rb
16
+ test/test_data_doc_store.rb
17
+ test/test_data_doc_present.rb
13
18
  test/test_data_doc_cli.rb
14
19
  test/test_helper.rb
@@ -4,6 +4,8 @@
4
4
 
5
5
  {<img src="https://secure.travis-ci.org/alilee/data_doc.png" alt="Build Status" />}[http://travis-ci.org/alilee/data_doc]
6
6
 
7
+ NOTE: THIS GEM DOES NOTHING YET.
8
+
7
9
  == DESCRIPTION:
8
10
 
9
11
  Complex documents can be challenging to author, and time-consuming to achieve
@@ -11,6 +13,8 @@ high levels of internal consistency. This gem offers a Domain Specific Language
11
13
  to embed structured data in a markdown document and then render it into
12
14
  configurable tables.
13
15
 
16
+ Note: See security implications below.
17
+
14
18
  == FEATURES/PROBLEMS:
15
19
 
16
20
  * Main document is Markdown for convenient content authoring.
@@ -19,25 +23,71 @@ configurable tables.
19
23
  * Generates HTML from Markdown.
20
24
  * Provides fine-grained control over the HTML headers, including
21
25
  CSS, for the output.
22
- * Simple DSL for capturing structured data
26
+ * Simple DSL for capturing structured data.
23
27
  * Simple DSL for querying data stores and laying out in tables.
28
+ * Command line interface
29
+ * Simple web-page interface using sinatra
30
+
31
+ == SECURITY IMPLICATIONS:
32
+
33
+ This gem uses ERB to process arbitrary ruby code provided by a user.
34
+ Some sandboxing ($SAFE) is used, but you should assess and manage
35
+ your level of risk.
24
36
 
25
37
  == SYNOPSIS:
26
38
 
27
- data_doc your_file.md.erb > result.html
39
+ $ bin/data_doc --help
40
+ Processes structured data embedded in a markdown document and then renders it into configurable tables.
41
+
42
+ Usage: data_doc [options] filename
43
+
44
+ Options are:
45
+
46
+ Specific options:
47
+ -c, --connection FILENAME Override document connection settings with FILENAME
48
+ -r, --read-only Use data already in database rather than document data
49
+ -d, --data-only Use document data but do not change database schema
50
+ -o, --output FILENAME Put generated output in FILENAME
51
+ -f, --format TYPE Select type of output from html (default: html)
52
+ -v, --[no-]verbose Run verbosely
53
+
54
+ Common options:
55
+ -h, --help Show this message
56
+ --version Show version
57
+ $
28
58
 
29
59
  The data definition language looks like this:
30
60
 
61
+ connection adapter: sqlite3 database: '/tmp/example.db'
62
+
63
+ store 'priority' do
64
+ string 'name'
65
+ alternate_key 'name'
66
+ end
67
+
68
+ priority name: 'high'
69
+ priority name: 'medium'
70
+ priority name: 'low'
71
+
31
72
  store 'requirement' do
32
73
  string 'name'
33
74
  text 'description'
34
- string 'priority'
75
+ ref 'priority', in: 'priority'
35
76
  alternate_key 'name'
36
77
  end
37
78
 
38
- requirement name: "It MUST "
79
+ requirement name: "It MUST be fast", description: "It must return within 5s.", priority: 'high'
80
+ requirement name: "It MUST look good", description: "It must be blue in colour.", priority: 'medium'
81
+
82
+ The table presentation language looks like this:
83
+
84
+ present 'select * from priority' #=> '<table>...</table>'
39
85
 
40
- The
86
+ present requirement.project('priority', 'name') do
87
+ caption 'Table of requirements by priority'
88
+ column_order 'name', 'priority'
89
+ label 'priority, 'Importance'
90
+ end #=> '<table>...</table>'
41
91
 
42
92
  == REQUIREMENTS:
43
93
 
data/Rakefile CHANGED
@@ -5,22 +5,14 @@ require 'fileutils'
5
5
  require './lib/data_doc'
6
6
 
7
7
  Hoe.plugin :newgem
8
- # Hoe.plugin :website
9
- # Hoe.plugin :cucumberfeatures
10
8
 
11
9
  # Generate all the Rake tasks
12
10
  # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
11
  $hoe = Hoe.spec 'data_doc' do
14
- self.developer 'Alister Lee', 'gems@shortepic.com'
15
- self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
16
- self.rubyforge_name = 'data-doc' # TODO this is default value
17
- # self.extra_deps = [['activesupport','>= 2.0.2']]
18
-
12
+ self.developer 'Alister Lee', 'gems@shortepic.com'
13
+ self.rubyforge_name = 'data-doc'
14
+ self.extra_deps = [['activerecord','>= 2.0.2']]
19
15
  end
20
16
 
21
17
  require 'newgem/tasks'
22
18
  Dir['tasks/**/*.rake'].each { |t| load t }
23
-
24
- # TODO - want other tests/tasks run by default? Add them to the list
25
- # remove_task :default
26
- # task :default => [:spec, :features]
@@ -1,6 +1,16 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
+ #
5
+ # Encompasses the data_doc classes.
6
+ #
4
7
  module DataDoc
5
- VERSION = '0.0.2'
6
- end
8
+ # Gem version
9
+ VERSION = '0.0.3'
10
+ # A summary of purpose of the tool.
11
+ DESCRIPTION = 'Processes structured data embedded in a markdown document and then renders it into configurable tables.'
12
+ end
13
+
14
+ require 'data_doc/document.rb'
15
+ # require 'data_doc/store.rb'
16
+ # require 'data_doc/table.rb'
@@ -1,42 +1,103 @@
1
1
  require 'optparse'
2
+ require 'yaml'
2
3
 
3
4
  module DataDoc
5
+
6
+ #
7
+ # Manages command-line options and arguments.
8
+ #
4
9
  class CLI
10
+
11
+ #
12
+ # Parses the command line and calls the main object.
13
+ #
14
+ # stdout:: IO to redirect output for testing.
15
+ # arguments:: contents of command line
16
+ #
5
17
  def self.execute(stdout, arguments=[])
6
18
 
7
- # NOTE: the option -p/--path= is given as an example, and should be replaced in your application.
19
+ doc = DataDoc::Document.new
20
+ doc.output = stdout
8
21
 
9
- options = {
10
- :path => '~'
11
- }
12
- mandatory_options = %w( )
13
-
14
- parser = OptionParser.new do |opts|
22
+ OptionParser.new do |opts|
15
23
  opts.banner = <<-BANNER.gsub(/^ /,'')
16
- This application is wonderful because...
24
+ #{DataDoc::DESCRIPTION}
17
25
 
18
- Usage: #{File.basename($0)} [options]
26
+ Usage: #{File.basename($0)} [options] filename
19
27
 
20
28
  Options are:
21
29
  BANNER
30
+
22
31
  opts.separator ""
23
- opts.on("-p", "--path PATH", String,
24
- "This is a sample message.",
25
- "For multiple lines, add more strings.",
26
- "Default: ~") { |arg| options[:path] = arg }
27
- opts.on("-h", "--help",
28
- "Show this help message.") { stdout.puts opts; exit }
29
- opts.parse!(arguments)
32
+ opts.separator "Specific options:"
30
33
 
31
- if mandatory_options && mandatory_options.find { |option| options[option.to_sym].nil? }
32
- stdout.puts opts; exit
34
+ opts.on("-c", "--connection FILENAME",
35
+ "Override document connection settings with FILENAME") do |filename|
36
+ begin
37
+ doc.connection = YAML.load(File.read(filename))
38
+ rescue Exception => e
39
+ stdout.puts "ERROR with connection file (#{e.message})"
40
+ return 1
41
+ end
42
+ end
43
+
44
+ opts.on("-r", "--read-only", "Use data already in database rather than document data") do |r|
45
+ doc.read_only = r
46
+ end
47
+
48
+ opts.on("-d", "--data-only", "Use document data but do not change database schema") do |d|
49
+ doc.data_only = d
50
+ end
51
+
52
+ opts.on("-o", "--output FILENAME",
53
+ "Put generated output in FILENAME") do |filename|
54
+ begin
55
+ doc.output = File.open(filename, 'w+')
56
+ rescue Exception => e
57
+ stdout.puts "ERROR with output file (#{e.message})"
58
+ return 1
59
+ end
60
+ end
61
+
62
+ type_list = DataDoc::Document::OUTPUT_TYPES.join(', ')
63
+ opts.on("-f", "--format TYPE", DataDoc::Document::OUTPUT_TYPES, "Select type of output from #{type_list} (default: #{doc.format})") do |format|
64
+ doc.format = format
65
+ end
66
+
67
+ opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
68
+ doc.verbose = v
33
69
  end
34
- end
35
70
 
36
- path = options[:path]
71
+ opts.separator ""
72
+ opts.separator "Common options:"
37
73
 
38
- # do stuff
39
- stdout.puts "To update this executable, look in lib/data_doc/cli.rb"
74
+ opts.on_tail("-h", "--help", "Show this message") do
75
+ stdout.puts opts
76
+ return 0
77
+ end
78
+
79
+ opts.on_tail("--version", "Show version") do
80
+ stdout.puts DataDoc::VERSION
81
+ return 0
82
+ end
83
+
84
+ opts.parse!(arguments)
85
+
86
+ if arguments.length != 1
87
+ stdout.puts "ERROR missing input file"
88
+ return 1
89
+ end
90
+
91
+ end
92
+
93
+ begin
94
+ content = File.open(arguments.first, "r")
95
+ rescue Exception => e
96
+ stdout.puts "ERROR opening content file (#{e.message})"
97
+ return 1
98
+ end
99
+
100
+ doc.generate(content)
40
101
  end
41
102
  end
42
103
  end
@@ -0,0 +1,198 @@
1
+ require 'rdiscount'
2
+ require 'erb'
3
+
4
+ module DataDoc
5
+
6
+ #
7
+ # Class for processing and rendering data_docs.
8
+ #
9
+ # Manages processing and formatting of the document.
10
+ #
11
+ class Document
12
+
13
+ #
14
+ # :section: 1. Options
15
+ #
16
+ # Allows access to set processing options prior to document generation.
17
+ #
18
+
19
+ #
20
+ # Sets up so that default options can be read.
21
+ #
22
+ def initialize
23
+ @format = 'html'
24
+ @output = STDOUT
25
+ @verbose = false
26
+ @read_only = false
27
+ @data_only = false
28
+ @connection = nil
29
+ @layout_filename = nil
30
+
31
+ @headers = Array.new
32
+ end
33
+
34
+ # MIME-type for output
35
+ attr_accessor :format
36
+
37
+ # Available mime types that can be generated.
38
+ OUTPUT_TYPES = ['html']
39
+
40
+ # output filename
41
+ attr_accessor :output
42
+
43
+ # display verbose output during processing
44
+ attr_accessor :verbose
45
+
46
+ # do not change schema or data
47
+ attr_accessor :read_only
48
+
49
+ # do not change schema; truncates tables
50
+ attr_accessor :data_only
51
+
52
+ #
53
+ # Sets the database connection that the stores will be using
54
+ #
55
+ def connection=(connection)
56
+ end
57
+
58
+ #
59
+ # Sets the layout file option.
60
+ #
61
+ # See #set_layout_file below for format.
62
+ #
63
+ def layout=(filename)
64
+ @layout_filename = filename
65
+ end
66
+
67
+ #
68
+ # :section: 2. Main function
69
+ #
70
+
71
+ #
72
+ # Generate the output for the given input content.
73
+ #
74
+ def generate(content_io)
75
+ erb_content = content_io.read
76
+ begin
77
+ self.untrust
78
+ mark_down = ERB.new(erb_content, 4).result(binding.taint) # $SAFE = 4
79
+ ensure
80
+ self.trust
81
+ end
82
+ content_html = RDiscount.new(mark_down).to_html
83
+ html = wrap_in_layout(content_html)
84
+ @output.write(html)
85
+ 0
86
+ end
87
+
88
+ #
89
+ # :section: 3. DSL for layout file
90
+ #
91
+
92
+ #
93
+ # Set layout file (from the filename, not the template content itself)
94
+ #
95
+ # Content is html, with ERB placeholders to yield to add content at
96
+ # appropriate points.
97
+ #
98
+ # [ <%= yield :head %> ] marks where to place any headers defined (see #meta below for an example)
99
+ # [ <%= yield :content %> <em>or</em> <%= yield %> ] marks where to place the processed content from the input file.
100
+ #
101
+ def set_layout_file(filename)
102
+ self.layout=(filename)
103
+ end
104
+
105
+ #
106
+ # Default layout if no layout file provided.
107
+ #
108
+ # Simplistic valid html which accepts headers and puts content directly into body tag.
109
+ #
110
+ def self.default_layout
111
+ "<!DOCTYPE html>\n<html>\n<head><%= yield :head %></head>\n<body>\n<%= yield %>\n</body>\n</html>"
112
+ end
113
+
114
+ #
115
+ # :section: 4. DSL for header tags
116
+ #
117
+
118
+ #
119
+ # Sets the title tag and emits the title in a classed div.title.
120
+ #
121
+ def title(text)
122
+ add_header "<title>#{text}</title>"
123
+ "<div class=\"title\">#{text}</div>"
124
+ end
125
+
126
+ #
127
+ # Adds a meta tag to the headers
128
+ #
129
+ def meta(attrs = {})
130
+ add_header "<meta #{html_attrs(attrs)}>"
131
+ end
132
+
133
+ #
134
+ # Adds a script tag to the headers, yielding for body of tag.
135
+ #
136
+ def script(attrs = {})
137
+ add_header "<script #{html_attrs(attrs)}>#{"\n"+yield+"\n" if block_given?}</script>"
138
+ end
139
+
140
+ #
141
+ # Adds a link tag to the headers
142
+ #
143
+ def link(attrs = {})
144
+ add_header "<link #{html_attrs(attrs)}>"
145
+ end
146
+
147
+ #
148
+ # :section: 5. Protected
149
+ #
150
+
151
+ protected
152
+
153
+ #
154
+ # Isolates ERB for layout
155
+ #
156
+ class IsolatedLayoutContext
157
+ # captures binding including any block
158
+ def binding_with_block
159
+ binding
160
+ end
161
+ end
162
+
163
+ #
164
+ # Wraps the default layout or a user provided layout around the content.
165
+ #
166
+ def wrap_in_layout(content)
167
+ @layout ||= @layout_filename.nil? ? DataDoc::Document.default_layout : File.read(@layout_filename)
168
+ block_binding = IsolatedLayoutContext.new.binding_with_block do |section|
169
+ case section.to_s
170
+ when 'head'
171
+ @headers.join("\n")
172
+ else
173
+ content
174
+ end
175
+ end
176
+ ERB.new(@layout, 4, '<>').result(block_binding.taint) # $SAFE = 4
177
+ end
178
+
179
+ #
180
+ # Formats a hash as html attributes for insertion into a tag.
181
+ #
182
+ def html_attrs(attrs)
183
+ list = attrs.to_a.map {|k,v| "#{k}=\"#{v}\"" }
184
+ list.join(' ')
185
+ end
186
+
187
+ #
188
+ # Add another header to the array of headers.
189
+ #
190
+ def add_header(h)
191
+ # Can't use Array#push in $SAFE = 4
192
+ @headers = @headers + [h]
193
+ h
194
+ end
195
+
196
+ end
197
+
198
+ end
File without changes
File without changes
@@ -1,11 +1,10 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
1
+ # require File.dirname(__FILE__) + '/test_helper.rb'
2
+ require_relative 'test_helper.rb'
2
3
 
3
- class TestDataDoc < Test::Unit::TestCase
4
-
5
- def setup
6
- end
4
+ describe DataDoc do
7
5
 
8
- def test_truth
9
- assert true
6
+ describe "integration tests" do
7
+
10
8
  end
9
+
11
10
  end
@@ -1,14 +1,99 @@
1
- require File.join(File.dirname(__FILE__), "test_helper.rb")
2
- require 'data_doc/cli'
3
-
4
- class TestDataDocCli < Test::Unit::TestCase
5
- def setup
6
- DataDoc::CLI.execute(@stdout_io = StringIO.new, [])
7
- @stdout_io.rewind
8
- @stdout = @stdout_io.read
1
+ require_relative 'test_helper.rb'
2
+ require_relative '../lib/data_doc/cli'
3
+ require 'tempfile'
4
+ require 'set'
5
+
6
+ describe DataDoc::CLI do
7
+
8
+ def execute_cli(*args)
9
+ DataDoc::CLI.execute(stdout_io = StringIO.new, args)
10
+ stdout_io.rewind
11
+ stdout_io.read.strip
9
12
  end
13
+
14
+ describe "with no file" do
15
+
16
+ it "should present version" do
17
+ execute_cli('--version').must_equal DataDoc::VERSION
18
+ end
19
+
20
+ it "should present help" do
21
+ result = execute_cli('--help')
22
+ result.must_match(/#{DataDoc::DESCRIPTION}/)
23
+ result.must_match(/Usage:/)
24
+ result.must_match(/--help/)
25
+ end
26
+
27
+ end
28
+
29
+ describe "with a file" do
30
+
31
+ describe "which is empty" do
32
+
33
+ before do
34
+ @filename = temp_file("")
35
+ end
36
+
37
+ it "should return" do
38
+ execute_cli(@filename)
39
+ end
10
40
 
11
- def test_print_default_output
12
- assert_match(/To update this executable/, @stdout)
41
+ it "should require a filename for connection option" do
42
+ proc { execute_cli('--connection') }.must_raise OptionParser::MissingArgument
43
+ end
44
+
45
+ describe "with connection settings file" do
46
+
47
+ before do
48
+ @db_filename = temp_file("")
49
+ connection_yaml = <<YAML
50
+ adapter: sqlite3
51
+ database: #{@db_filename}
52
+ YAML
53
+ @connection_filename = temp_file(connection_yaml)
54
+ end
55
+
56
+ it "should accept a connection option" do
57
+ execute_cli("--connection", "#{@connection_filename}")
58
+ end
59
+
60
+ end
61
+
62
+ it "should accept a read-only option" do
63
+ execute_cli("--read-only", @filename)
64
+ end
65
+
66
+ it "should accept a data-only option" do
67
+ execute_cli("--data-only", @filename)
68
+ end
69
+
70
+ it "should accept an output file option" do
71
+ output_filename = temp_file("")
72
+ execute_cli("--output", output_filename, @filename)
73
+ end
74
+
75
+ it "should require a filename for output option" do
76
+ proc { execute_cli("--output") }.must_raise OptionParser::MissingArgument
77
+ end
78
+
79
+ it "should accept an html format option" do
80
+ execute_cli("--format", 'html', @filename)
81
+ end
82
+
83
+ it "should require a format for format option" do
84
+ proc { execute_cli("--format") }.must_raise OptionParser::MissingArgument
85
+ end
86
+
87
+ it "should require a valid format for format option" do
88
+ proc { execute_cli("--format", 'invalid') }.must_raise OptionParser::InvalidArgument
89
+ end
90
+
91
+ it "should accept a verbose option" do
92
+ execute_cli("--verbose", @filename)
93
+ end
94
+
95
+ end
96
+
13
97
  end
98
+
14
99
  end
@@ -0,0 +1,76 @@
1
+ require_relative 'test_helper.rb'
2
+
3
+ describe DataDoc::Document do
4
+
5
+ before do
6
+ @doc = DataDoc::Document.new
7
+ @input = ""
8
+ @expected_output = ""
9
+ end
10
+
11
+ after do
12
+ output = StringIO.new
13
+ @doc.output = output
14
+ @doc.generate(StringIO.new(@input))
15
+ output.rewind
16
+ output.read.strip.must_equal @expected_output.strip
17
+ end
18
+
19
+ it "should process empty input" do
20
+ @input = ""
21
+ @doc.layout = temp_file('<%= yield %>')
22
+ @expected_output = ""
23
+ end
24
+
25
+ it "should process markdown into html" do
26
+ @input = '# Introduction'
27
+ @doc.layout = temp_file('<%= yield %>')
28
+ @expected_output = '<h1>Introduction</h1>'
29
+ end
30
+
31
+ describe "layout" do
32
+
33
+ it "should wrap the generated text in a layout" do
34
+ layout_filename = temp_file('layout:<%= yield %>:layout')
35
+ @input = "<% set_layout_file '#{layout_filename}' %>Some text."
36
+ @expected_output = "layout:<p>Some text.</p>\n:layout"
37
+ end
38
+
39
+ it "should wrap the content in a default html layout" do
40
+ @input = "<p>XXX</p>"
41
+ @expected_output = erb(DataDoc::Document.default_layout) do |section|
42
+ @input + "\n" if section.to_s != 'head'
43
+ end
44
+ end
45
+
46
+ end
47
+
48
+ describe "head tags" do
49
+
50
+ it "should insert meta tags into the head" do
51
+ @input = '<% meta author: "Author" %>'
52
+ @doc.layout = temp_file('<%= yield :head %>')
53
+ @expected_output = '<meta author="Author">'
54
+ end
55
+
56
+ it "should insert script tags into the head" do
57
+ @input = '<% script(src: "jquery.js") { "XXX" } %>'
58
+ @doc.layout = temp_file('<%= yield :head %>')
59
+ @expected_output = "<script src=\"jquery.js\">\nXXX\n</script>"
60
+ end
61
+
62
+ it "should insert link tags into the head" do
63
+ @input = '<% link rel: "stylesheet", type: "text/css", href: "mystyle.css" %>'
64
+ @doc.layout = temp_file('<%= yield :head %>')
65
+ @expected_output = '<link rel="stylesheet" type="text/css" href="mystyle.css">'
66
+ end
67
+
68
+ it "should set the html document title in the head and in a div.title in the content" do
69
+ @input = '<%= title "Title" %>'
70
+ @doc.layout = temp_file('Head:<%= yield :head %>Content:<%= yield %>')
71
+ @expected_output = 'Head:<title>Title</title>Content:<div class="title">Title</div>'
72
+ end
73
+
74
+ end
75
+
76
+ end
File without changes
File without changes
@@ -1,3 +1,21 @@
1
1
  require 'stringio'
2
- require 'test/unit'
2
+ require 'set'
3
+ require 'tempfile'
4
+ require 'minitest/autorun'
5
+ require 'minitest/mock'
6
+
3
7
  require File.dirname(__FILE__) + '/../lib/data_doc'
8
+
9
+ def temp_file(content)
10
+ @temp_files ||= Set.new
11
+ f = Tempfile.new('test_data_doc')
12
+ @temp_files.add(f)
13
+ f.write(content)
14
+ f.rewind
15
+ f.path
16
+ end
17
+
18
+ # allows yield to call block
19
+ def erb(content)
20
+ ERB.new(content).result(binding)
21
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_doc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-18 00:00:00.000000000 Z
12
+ date: 2012-10-21 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activerecord
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.0.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.0.2
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: rdoc
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -62,7 +78,7 @@ dependencies:
62
78
  description: ! "Complex documents can be challenging to author, and time-consuming
63
79
  to achieve \nhigh levels of internal consistency. This gem offers a Domain Specific
64
80
  Language \nto embed structured data in a markdown document and then render it into
65
- \nconfigurable tables."
81
+ \nconfigurable tables. \n\nNote: See security implications below."
66
82
  email:
67
83
  - gems@shortepic.com
68
84
  executables:
@@ -71,27 +87,31 @@ extensions: []
71
87
  extra_rdoc_files:
72
88
  - History.txt
73
89
  - Manifest.txt
74
- - PostInstall.txt
75
90
  - README.rdoc
76
91
  files:
77
92
  - History.txt
78
93
  - Manifest.txt
79
- - PostInstall.txt
80
94
  - README.rdoc
81
95
  - Rakefile
82
96
  - bin/data_doc
83
97
  - lib/data_doc.rb
84
98
  - lib/data_doc/cli.rb
99
+ - lib/data_doc/document.rb
100
+ - lib/data_doc/store.rb
101
+ - lib/data_doc/present.rb
85
102
  - script/console
86
103
  - script/destroy
87
104
  - script/generate
88
105
  - test/test_data_doc.rb
106
+ - test/test_data_doc_document.rb
107
+ - test/test_data_doc_store.rb
108
+ - test/test_data_doc_present.rb
89
109
  - test/test_data_doc_cli.rb
90
110
  - test/test_helper.rb
91
111
  - .gemtest
92
112
  homepage: http://github.com/alilee/data_doc
93
113
  licenses: []
94
- post_install_message: PostInstall.txt
114
+ post_install_message:
95
115
  rdoc_options:
96
116
  - --main
97
117
  - README.rdoc
@@ -105,7 +125,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
125
  version: '0'
106
126
  segments:
107
127
  - 0
108
- hash: -1827853280249206312
128
+ hash: -2005409692758115623
109
129
  required_rubygems_version: !ruby/object:Gem::Requirement
110
130
  none: false
111
131
  requirements:
@@ -122,4 +142,7 @@ summary: Complex documents can be challenging to author, and time-consuming to a
122
142
  test_files:
123
143
  - test/test_data_doc.rb
124
144
  - test/test_data_doc_cli.rb
145
+ - test/test_data_doc_document.rb
146
+ - test/test_data_doc_present.rb
147
+ - test/test_data_doc_store.rb
125
148
  - test/test_helper.rb
@@ -1,7 +0,0 @@
1
-
2
- For more information on data_doc, see http://data_doc.rubyforge.org
3
-
4
- NOTE: Change this information in PostInstall.txt
5
- You can also delete it if you don't want it.
6
-
7
-