tp 0.5.1 → 0.6.0

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.
data/.cane ADDED
@@ -0,0 +1,5 @@
1
+ --abc-max 10
2
+ --color
3
+ --gte coverage/.last_run.json,100
4
+ --no-doc
5
+ --style-exclude spec/**/*
@@ -1,9 +1,9 @@
1
1
  rvm:
2
2
  - 1.9.2
3
3
  - 1.9.3
4
+ - 2.0.0
4
5
  - ruby-head
5
6
  matrix:
6
7
  allow_failures:
7
- - rvm: 1.9.2
8
8
  - rvm: ruby-head
9
9
 
data/Gemfile CHANGED
@@ -2,6 +2,8 @@ source :rubygems
2
2
 
3
3
  gemspec
4
4
 
5
+ gem 'cane', github: 'square/cane'
6
+
5
7
  group :development, :test do
6
8
  group :darwin do
7
9
  gem 'rb-fsevent'
data/Guardfile CHANGED
@@ -1,6 +1,9 @@
1
- guard 'rspec', version: 2 do
1
+ guard :rspec, env: { skip_coverage: true } do
2
2
  watch(%r{^spec/.+_spec\.rb$})
3
3
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
4
  watch('spec/spec_helper.rb') { "spec" }
5
5
  end
6
6
 
7
+ guard :cane do
8
+ watch(/.*\.rb/)
9
+ end
data/Rakefile CHANGED
@@ -1,8 +1,13 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'cane/rake_task'
2
3
  require 'rspec/core/rake_task'
3
4
 
4
- desc 'Default: run specs'
5
- task default: :spec
5
+ task default: :ci
6
6
 
7
- desc "Run specs"
7
+ task :ci do
8
+ Rake::Task[:spec].invoke
9
+ Rake::Task[:cane].invoke
10
+ end
11
+
12
+ Cane::RakeTask.new
8
13
  RSpec::Core::RakeTask.new
data/Readme.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # tp
2
- [![Build Status](https://secure.travis-ci.org/justincampbell/tp.png)](https://secure.travis-ci.org/justincampbell/tp)
2
+ [![Build Status](https://travis-ci.org/justincampbell/tp.png?branch=master)](https://travis-ci.org/justincampbell/tp)
3
3
  [![Gem Version](https://badge.fury.io/rb/tp.png)](http://badge.fury.io/rb/tp)
4
- [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/justincampbell/tp)
4
+ [![Code Climate](https://codeclimate.com/github/justincampbell/tp.png)](https://codeclimate.com/github/justincampbell/tp)
5
5
 
6
6
  ![Demo](https://s3.amazonaws.com/justincampbell/tp.gif)
7
7
 
data/bin/tp CHANGED
@@ -4,4 +4,6 @@ $: << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
4
4
 
5
5
  require "tp"
6
6
 
7
- TP::Presenter.new(File.read(ARGV[0])).present
7
+ ARGV.unshift(:present) if File.exist?(ARGV[0].to_s)
8
+
9
+ TP::CLI.start
@@ -0,0 +1,39 @@
1
+ require "coderay"
2
+
3
+ class PrawnEncoder < CodeRay::Encoders::Encoder
4
+ register_for :to_prawn
5
+
6
+ COLORS = {
7
+ default: "E6E1DC",
8
+ comment: "BC9458",
9
+ constant: "DA4939",
10
+ instance_variable: "D0D0FF",
11
+ integer: "56D65E",
12
+ float: "56D65E",
13
+ inline_delimiter: "EF804F",
14
+ keyword: "CC7833",
15
+ method: "FFC66D",
16
+ string: "A5C261",
17
+ symbol: "6D9CBE"
18
+ }
19
+
20
+ def setup(options)
21
+ super
22
+ @out = []
23
+ @open = []
24
+ end
25
+
26
+ def text_token(text, kind)
27
+ color = COLORS[kind] || COLORS[@open.last] || COLORS[:default]
28
+
29
+ @out << {:text => text, :color => color}
30
+ end
31
+
32
+ def begin_group(kind)
33
+ @open << kind
34
+ end
35
+
36
+ def end_group(kind)
37
+ @open.pop
38
+ end
39
+ end
@@ -2,26 +2,15 @@ module Keyboard
2
2
  extend self
3
3
 
4
4
  def read
5
- begin
6
- old_stty = `stty -g`
7
- system "stty raw -echo"
8
-
9
- chr = STDIN.getc.chr
5
+ chr = ""
10
6
 
11
- if chr == "\e"
12
- extra_thread = Thread.new {
13
- chr = chr + STDIN.getc.chr
14
- chr = chr + STDIN.getc.chr
15
- }
7
+ with_stty "raw -echo" do
8
+ chr << STDIN.getc.chr
16
9
 
17
- extra_thread.join 0.00001
18
- extra_thread.kill
19
- end
20
- ensure
21
- system "stty #{old_stty}"
10
+ chr = extra_thread_trick(chr) if chr == "\e"
22
11
  end
23
12
 
24
- symbolize chr
13
+ symbolize(chr)
25
14
  end
26
15
 
27
16
  def wait_for_return
@@ -34,6 +23,29 @@ module Keyboard
34
23
 
35
24
  private
36
25
 
26
+ def extra_thread_trick(chr)
27
+ extra_thread = Thread.new {
28
+ chr = chr + STDIN.getc.chr
29
+ chr = chr + STDIN.getc.chr
30
+ }
31
+
32
+ extra_thread.join 0.00001
33
+ extra_thread.kill
34
+
35
+ chr
36
+ end
37
+
38
+ def with_stty(options, &block)
39
+ begin
40
+ old_stty = `stty -g`
41
+ system "stty #{options}"
42
+
43
+ yield
44
+ ensure
45
+ system "stty #{old_stty}"
46
+ end
47
+ end
48
+
37
49
  def symbolize(character)
38
50
  case character
39
51
  when " "
data/lib/tp.rb CHANGED
@@ -1,9 +1,13 @@
1
1
  require 'coderay'
2
+ require 'coderay/prawn_encoder'
3
+ require 'thor'
2
4
 
3
5
  require 'keyboard'
4
6
  require 'screen'
5
7
  require 'string'
8
+ require 'tp/cli'
6
9
  require 'tp/presenter'
10
+ require 'tp/publisher/pdf'
7
11
  require 'tp/renderer'
8
12
  require 'tp/slide'
9
13
  require 'tp/slide/bulleted'
@@ -0,0 +1,27 @@
1
+ module TP
2
+ class CLI < Thor
3
+ default_task :usage
4
+
5
+ desc "usage", "Display usage banner", hide: true
6
+ def usage
7
+ puts [
8
+ "Terminal Presenter #{TP::VERSION}",
9
+ "https://github.com/justincampbell/tp"
10
+ ].join("\n")
11
+
12
+ puts "\n"
13
+
14
+ help
15
+ end
16
+
17
+ desc "FILENAME", "Present a Markdown file in your terminal"
18
+ def present(filename)
19
+ TP::Presenter.new(File.read(filename)).present
20
+ end
21
+
22
+ desc "pdf FILENAME [OUTPUT]", "Convert a Markdown slide deck to a PDF"
23
+ def pdf(filename, output = nil)
24
+ TP::Publisher::PDF.new(filename, output).publish
25
+ end
26
+ end
27
+ end
@@ -7,9 +7,17 @@ module TP
7
7
  end
8
8
 
9
9
  def present
10
+ suggest_sizing
11
+ render_slides
12
+ clear_screen
13
+ end
14
+
15
+ def suggest_sizing
10
16
  Screen.suggest slide_deck.width, slide_deck.height
11
17
  Keyboard.wait_for_return
18
+ end
12
19
 
20
+ def render_slides
13
21
  loop do
14
22
  Renderer.new(slide_deck.current_frame).render
15
23
 
@@ -24,14 +32,16 @@ module TP
24
32
 
25
33
  break if slide_deck.ended?
26
34
  end
35
+ end
27
36
 
37
+ def clear_screen
28
38
  Screen.clear!
29
39
  end
30
40
 
31
41
  def slides
32
42
  result = markdown.split /^#/
33
43
  result.reject! &:empty?
34
- result.map! { |string| string.prepend "#" }
44
+ result.map! { |string| "##{string}" }
35
45
 
36
46
  result.map { |string| SlideFactory.from_markdown string }
37
47
  end
@@ -0,0 +1,85 @@
1
+ require "prawn"
2
+ require "prawn/measurement_extensions"
3
+
4
+ module TP
5
+ module Publisher
6
+ class PDF
7
+ extend Forwardable
8
+ def_delegators :pdf,
9
+ :bounds,
10
+ :canvas,
11
+ :fill_color,
12
+ :fill_rectangle,
13
+ :font,
14
+ :font_size,
15
+ :render_file,
16
+ :start_new_page,
17
+ :text_box,
18
+ :width_of
19
+
20
+ attr_reader :input_filename
21
+
22
+ def initialize(input_filename, output_filename)
23
+ @input_filename = input_filename
24
+ @output_filename = output_filename
25
+ end
26
+
27
+ def publish
28
+ slides.each do |slide|
29
+ render_slide(slide)
30
+ end
31
+
32
+ render_file output_filename
33
+ end
34
+
35
+ def render_slide(slide)
36
+ new_page
37
+
38
+ slide.render_pdf(pdf)
39
+ end
40
+
41
+ def markdown
42
+ @markdown ||= File.read(input_filename)
43
+ end
44
+
45
+ def presenter
46
+ @presenter ||= Presenter.new(markdown)
47
+ end
48
+
49
+ def slides
50
+ presenter.slides
51
+ end
52
+
53
+ def output_filename
54
+ @output_filename || "#{input_filename.split('.').first}.pdf"
55
+ end
56
+
57
+ def pdf
58
+ @pdf ||= Prawn::Document.new(document_options)
59
+ end
60
+
61
+ def document_options
62
+ {
63
+ page_layout: :landscape,
64
+ optimize_objects: true,
65
+ skip_page_creation: true
66
+ }
67
+ end
68
+
69
+ def new_page
70
+ start_new_page
71
+
72
+ fill_color '111111'
73
+
74
+ canvas do
75
+ fill_rectangle [bounds.left, bounds.top], bounds.width, bounds.height
76
+ end
77
+
78
+ fill_color 'EEEEEE'
79
+
80
+ font "Helvetica"
81
+ font_size 1.in
82
+ end
83
+ end
84
+ end
85
+ end
@@ -22,23 +22,31 @@ module TP
22
22
  end
23
23
 
24
24
  def frames
25
- [render]
25
+ [render_terminal]
26
26
  end
27
27
 
28
28
  def lines
29
29
  markdown.lines.to_a
30
30
  end
31
31
 
32
- def render
33
- raise NotImplementedError
32
+ def pdf_content_height(pdf)
33
+ pdf.bounds.height - pdf_header_height
34
34
  end
35
35
 
36
- def width
37
- raise NotImplementedError
36
+ def pdf_content_top_left(pdf)
37
+ [pdf.bounds.left, pdf.bounds.top - pdf_header_height]
38
+ end
39
+
40
+ def pdf_header_height
41
+ header != "" ? 1.in : 0
38
42
  end
39
43
 
40
44
  def height
41
45
  lines.count
42
46
  end
47
+
48
+ def hard_width?
49
+ true
50
+ end
43
51
  end
44
52
  end
@@ -1,18 +1,41 @@
1
1
  class TP::Slide::Bulleted < TP::Slide
2
- BULLET = "\u2022 "
2
+ BULLET = "\u2022"
3
+
4
+ def render_pdf(pdf)
5
+ pdf.text_box header,
6
+ align: :center,
7
+ overflow: :shrink_to_fit,
8
+ single_line: true,
9
+ height: pdf_header_height,
10
+ size: pdf_header_height
11
+
12
+ pdf.text_box rendered_bullets,
13
+ at: pdf_content_top_left(pdf),
14
+ height: pdf_content_height(pdf),
15
+ overflow: :shrink_to_fit,
16
+ valign: :center
17
+ end
3
18
 
4
- def render
19
+ def render_terminal
5
20
  frames.last
6
21
  end
7
22
 
8
23
  def width
9
24
  header_length = header.length
10
- longest_bullet = bullets.collect(&:length).max + 2
25
+ longest_bullet = bullets.collect(&:length).max + bullet_length
11
26
  [header_length, longest_bullet].max
12
27
  end
13
28
 
14
29
  def bullets
15
- content.lines.to_a.map { |line| line.gsub(/^\*\s/, "").strip }
30
+ content.lines.to_a.map { |line| line.gsub(/^[\*|-]\s/, "").strip }
31
+ end
32
+
33
+ def bullet_length
34
+ BULLET.length + 1
35
+ end
36
+
37
+ def rendered_bullets
38
+ bullets.map { |text| "#{BULLET} #{text}" }.join("\n")
16
39
  end
17
40
 
18
41
  def frames
@@ -23,8 +46,8 @@ class TP::Slide::Bulleted < TP::Slide
23
46
 
24
47
  @frames = [buffer.dup]
25
48
 
26
- bullets.each do |bullet|
27
- buffer << "#{BULLET} #{bullet}\n"
49
+ bullets.each do |line|
50
+ buffer << "#{BULLET} #{line}\n"
28
51
  @frames << buffer.dup
29
52
  end
30
53
 
@@ -1,5 +1,41 @@
1
1
  class TP::Slide::Code < TP::Slide
2
- def render
2
+ LANGUAGE_MAPPINGS = {
3
+ [nil] => 'text',
4
+ %w[clj] => 'clojure',
5
+ %w[objc] => 'cpp',
6
+ %w[rb] => 'ruby'
7
+ }
8
+
9
+ def render_pdf(pdf)
10
+ pdf.text_box header,
11
+ align: :center,
12
+ overflow: :shrink_to_fit,
13
+ single_line: true,
14
+ height: pdf_header_height,
15
+ size: pdf_header_height
16
+
17
+ pdf.font 'Courier' do
18
+ pdf.formatted_text_box prawn_code,
19
+ at: pdf_content_top_left(pdf),
20
+ height: pdf_content_height(pdf),
21
+ size: (pdf.bounds.width / maximum_line_length) * character_ratio(pdf),
22
+ valign: :center
23
+ end
24
+ end
25
+
26
+ def character_ratio(pdf)
27
+ pdf.font_size / pdf.width_of("#")
28
+ end
29
+
30
+ def maximum_line_length
31
+ [code.lines.to_a.map { |line| line.rstrip.length }.max, 80].min
32
+ end
33
+
34
+ def prawn_code
35
+ CodeRay.scan(code.gsub(' ', Prawn::Text::NBSP), language).to_prawn
36
+ end
37
+
38
+ def render_terminal
3
39
  centered_header +
4
40
  "\n\n" +
5
41
  highlighted_code
@@ -28,13 +64,10 @@ class TP::Slide::Code < TP::Slide
28
64
  end
29
65
 
30
66
  def language
31
- case raw_language
32
- when nil then "text"
33
- when "clj" then "clojure"
34
- when "objc" then "cpp"
35
- when "rb" then "ruby"
36
- else
37
- raw_language
67
+ LANGUAGE_MAPPINGS.each do |keys, value|
68
+ return value if keys.include? raw_language
38
69
  end
70
+
71
+ raw_language
39
72
  end
40
73
  end
@@ -1,5 +1,14 @@
1
1
  class TP::Slide::HeaderOnly < TP::Slide
2
- def render
2
+ def render_pdf(pdf)
3
+ pdf.text_box header,
4
+ align: :center,
5
+ overflow: :shrink_to_fit,
6
+ single_line: true,
7
+ size: pdf.bounds.height,
8
+ valign: :center
9
+ end
10
+
11
+ def render_terminal
3
12
  centered_header
4
13
  end
5
14
 
@@ -1,5 +1,20 @@
1
1
  class TP::Slide::Paragraph < TP::Slide
2
- def render
2
+ def render_pdf(pdf)
3
+ pdf.text_box header,
4
+ align: :center,
5
+ overflow: :shrink_to_fit,
6
+ single_line: true,
7
+ height: pdf_header_height,
8
+ size: pdf_header_height
9
+
10
+ pdf.text_box paragraph,
11
+ at: pdf_content_top_left(pdf),
12
+ height: pdf_content_height(pdf),
13
+ overflow: :shrink_to_fit,
14
+ valign: :center
15
+ end
16
+
17
+ def render_terminal
3
18
  centered_header +
4
19
  "\n\n" +
5
20
  paragraph
@@ -15,4 +30,8 @@ class TP::Slide::Paragraph < TP::Slide
15
30
  def width
16
31
  content.length
17
32
  end
33
+
34
+ def hard_width?
35
+ false
36
+ end
18
37
  end
@@ -7,10 +7,6 @@ module TP
7
7
  @slides = slides
8
8
  end
9
9
 
10
- def [](index)
11
- frames[index]
12
- end
13
-
14
10
  def current
15
11
  frames[cursor]
16
12
  end
@@ -45,20 +41,27 @@ module TP
45
41
  end
46
42
 
47
43
  def width
48
- slides_without_paragraphs = slides.reject { |slide| slide.class == TP::Slide::Paragraph }
49
-
50
- if slides_without_paragraphs.empty?
51
- [slides.collect(&:width).max, 80].min
44
+ if maximum_hard_width
45
+ [maximum_header_length, maximum_hard_width].max
52
46
  else
53
- [
54
- slides.collect(&:header).map(&:length).max,
55
- slides_without_paragraphs.collect(&:width).max
56
- ].max
47
+ [maximum_width, 80].min
57
48
  end
58
49
  end
59
50
 
60
51
  def height
61
52
  slides.collect(&:height).max
62
53
  end
54
+
55
+ def maximum_header_length
56
+ slides.collect(&:header).map(&:length).max
57
+ end
58
+
59
+ def maximum_width
60
+ slides.collect(&:width).max
61
+ end
62
+
63
+ def maximum_hard_width
64
+ slides.select(&:hard_width?).collect(&:width).max
65
+ end
63
66
  end
64
67
  end
@@ -1,3 +1,3 @@
1
1
  module TP
2
- VERSION = "0.5.1"
2
+ VERSION = "0.6.0"
3
3
  end
data/slides.md CHANGED
@@ -10,11 +10,15 @@ Presents Markdown slides in your terminal
10
10
 
11
11
  # Installation
12
12
 
13
- gem install tp
13
+ ```sh
14
+ $ gem install tp
15
+ ```
14
16
 
15
17
  # Usage
16
18
 
17
- tp slides.md
19
+ ```sh
20
+ $ tp slides.md
21
+ ```
18
22
 
19
23
  # Navigation
20
24
 
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ require 'fileutils'
4
+ require 'tmpdir'
5
+
6
+ describe TP::CLI do
7
+ subject { cli }
8
+ let(:cli) { klass.new }
9
+
10
+ let(:tmpdir) { Dir.mktmpdir }
11
+ let(:input_filename) { File.join(tmpdir, "slides.md") }
12
+ let(:slides) { File.read("slides.md") }
13
+
14
+ before do
15
+ File.open(input_filename, 'w') {|file| file.write slides }
16
+ end
17
+
18
+ after do
19
+ FileUtils.rm_rf tmpdir
20
+ end
21
+
22
+ describe "#usage" do
23
+ subject(:usage) { cli.usage }
24
+
25
+ it "displays a banner and help" do
26
+ cli.should_receive(:puts).exactly(2).times
27
+ cli.should_receive(:help)
28
+
29
+ usage
30
+ end
31
+ end
32
+
33
+ describe "#present" do
34
+ subject(:present) { cli.present(input_filename) }
35
+
36
+ before do
37
+ Keyboard.stub(:read).and_return(:return, :return, :backspace, 'q')
38
+ Screen.stub(:print)
39
+ end
40
+
41
+ it "presents" do
42
+ present
43
+ end
44
+ end
45
+
46
+ describe "#pdf" do
47
+ subject(:pdf) { cli.pdf(input_filename, output_filename) }
48
+
49
+ let(:output_filename) { File.join(tmpdir, "slides.pdf") }
50
+
51
+ it "renders a PDF" do
52
+ pdf
53
+
54
+ File.exist?(output_filename).should be_true
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe PrawnEncoder do
4
+ subject { prawn_encoder }
5
+ let(:prawn_encoder) { klass.new }
6
+
7
+ let(:options) { {} }
8
+
9
+ before do
10
+ prawn_encoder.setup(options)
11
+ end
12
+
13
+ it "builds a prawn token" do
14
+ prawn_encoder.begin_group(:comment)
15
+ prawn_encoder.text_token("# test", nil).should == [{
16
+ text: "# test",
17
+ color: klass::COLORS[:comment]
18
+ }]
19
+ prawn_encoder.end_group(:comment)
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe TP::Publisher::PDF do
4
+ subject { publisher }
5
+ let(:publisher) { klass.new(input_filename, output_filename) }
6
+
7
+ let(:input_filename) { "slides.md" }
8
+ let(:output_filename) { nil }
9
+
10
+ its(:output_filename) { should == "slides.pdf" }
11
+ end
@@ -3,6 +3,7 @@ require 'spec_helper'
3
3
  describe TP::Slide::Bulleted do
4
4
  subject { slide }
5
5
 
6
+ let(:bullet) { TP::Slide::Bulleted::BULLET }
6
7
  let(:markdown) { "# Bullets\n\n* Bullet 1\n* Bullet 2" }
7
8
  let(:slide) { klass.new markdown }
8
9
 
@@ -10,11 +11,19 @@ describe TP::Slide::Bulleted do
10
11
  Screen.stub width: 20
11
12
  end
12
13
 
14
+ its(:bullets) { should == ["Bullet 1", "Bullet 2"] }
15
+
13
16
  its(:width) { should == 10 }
14
17
  its(:height) { should == 4 }
15
18
 
16
- describe "#render" do
17
- subject(:lines) { slide.render.lines.to_a }
19
+ context "with dash bullets" do
20
+ let(:markdown) { "# Bullets\n\n- Bullet 1\n- Bullet 2" }
21
+
22
+ its(:bullets) { should == ["Bullet 1", "Bullet 2"] }
23
+ end
24
+
25
+ describe "#render_terminal" do
26
+ subject(:lines) { slide.render_terminal.lines.to_a }
18
27
 
19
28
  it { lines.count.should == 4 }
20
29
 
@@ -23,11 +32,17 @@ describe TP::Slide::Bulleted do
23
32
  end
24
33
 
25
34
  it "renders bullets" do
26
- lines[2].should == "#{TP::Slide::Bulleted::BULLET} Bullet 1\n"
27
- lines[3].should == "#{TP::Slide::Bulleted::BULLET} Bullet 2\n"
35
+ lines[2].should == "#{bullet} Bullet 1\n"
36
+ lines[3].should == "#{bullet} Bullet 2\n"
28
37
  end
29
38
  end
30
39
 
40
+ describe "#rendered_bullets" do
41
+ subject(:rendered_bullets) { slide.rendered_bullets }
42
+
43
+ it { should == "#{bullet} Bullet 1\n#{bullet} Bullet 2" }
44
+ end
45
+
31
46
  describe "#frames" do
32
47
  subject(:frames) { slide.frames }
33
48
 
@@ -16,6 +16,9 @@ describe TP::Slide::Code do
16
16
  its(:code) { should == "class Thing\nend\n" }
17
17
  its(:language) { should == "ruby" }
18
18
 
19
+ its(:maximum_line_length) { should == 11 }
20
+ its(:prawn_code) { should be_a Array }
21
+
19
22
  describe "#highlighted_code" do
20
23
  subject(:highlighted_code) { slide.highlighted_code }
21
24
 
@@ -34,8 +37,8 @@ describe TP::Slide::Code do
34
37
  end
35
38
  end
36
39
 
37
- describe "#render" do
38
- subject(:render) { slide.render }
40
+ describe "#render_terminal" do
41
+ subject(:render_terminal) { slide.render_terminal }
39
42
 
40
43
  before do
41
44
  slide.stub highlighted_code: "Highlighted code"
@@ -13,8 +13,8 @@ describe TP::Slide::HeaderOnly do
13
13
  its(:width) { should == 6 }
14
14
  its(:height) { should == 1 }
15
15
 
16
- describe "#render" do
17
- subject(:lines) { slide.render.lines.to_a }
16
+ describe "#render_terminal" do
17
+ subject(:lines) { slide.render_terminal.lines.to_a }
18
18
 
19
19
  it { lines.count.should == 1 }
20
20
 
@@ -13,8 +13,8 @@ describe TP::Slide::Paragraph do
13
13
  its(:width) { should == 15 }
14
14
  its(:height) { should == 3 }
15
15
 
16
- describe "#render" do
17
- subject(:lines) { slide.render.lines.to_a }
16
+ describe "#render_terminal" do
17
+ subject(:lines) { slide.render_terminal.lines.to_a }
18
18
 
19
19
  it { lines.count.should == 3 }
20
20
 
@@ -4,7 +4,7 @@ require 'support/klass'
4
4
 
5
5
  puts RUBY_DESCRIPTION
6
6
 
7
- if RUBY_DESCRIPTION.start_with? "ruby 1.9"
7
+ unless ENV['skip_coverage']
8
8
  require 'simplecov'
9
9
  SimpleCov.start
10
10
  end
@@ -15,6 +15,6 @@ RSpec.configure do |config|
15
15
  config.treat_symbols_as_metadata_keys_with_true_values = true
16
16
  config.run_all_when_everything_filtered = true
17
17
  config.filter_run :focus
18
- config.order = 'random'
18
+ config.order = :random
19
19
  end
20
20
 
data/tp.gemspec CHANGED
@@ -20,9 +20,14 @@ Gem::Specification.new do |gem|
20
20
  gem.require_paths = ["lib"]
21
21
 
22
22
  gem.add_dependency "coderay", "~> 1.0"
23
+ gem.add_dependency "prawn", "~> 0.12"
24
+ gem.add_dependency "thor", "~> 0.17"
23
25
 
26
+ gem.add_development_dependency "cane"
27
+ gem.add_development_dependency "guard"
24
28
  gem.add_development_dependency "guard-rspec"
29
+ gem.add_development_dependency "guard-cane"
25
30
  gem.add_development_dependency "rake"
26
31
  gem.add_development_dependency "rspec"
27
- gem.add_development_dependency "simplecov" if RUBY_DESCRIPTION.start_with? "ruby 1.9"
32
+ gem.add_development_dependency "simplecov" if RUBY_DESCRIPTION.start_with? "ruby"
28
33
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-28 00:00:00.000000000 Z
12
+ date: 2013-02-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: coderay
@@ -27,6 +27,70 @@ dependencies:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1.0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: prawn
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '0.12'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.12'
46
+ - !ruby/object:Gem::Dependency
47
+ name: thor
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '0.17'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.17'
62
+ - !ruby/object:Gem::Dependency
63
+ name: cane
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: guard
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
30
94
  - !ruby/object:Gem::Dependency
31
95
  name: guard-rspec
32
96
  requirement: !ruby/object:Gem::Requirement
@@ -43,6 +107,22 @@ dependencies:
43
107
  - - ! '>='
44
108
  - !ruby/object:Gem::Version
45
109
  version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: guard-cane
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
46
126
  - !ruby/object:Gem::Dependency
47
127
  name: rake
48
128
  requirement: !ruby/object:Gem::Requirement
@@ -99,6 +179,7 @@ executables:
99
179
  extensions: []
100
180
  extra_rdoc_files: []
101
181
  files:
182
+ - .cane
102
183
  - .gitignore
103
184
  - .rspec
104
185
  - .travis.yml
@@ -108,11 +189,14 @@ files:
108
189
  - Rakefile
109
190
  - Readme.md
110
191
  - bin/tp
192
+ - lib/coderay/prawn_encoder.rb
111
193
  - lib/keyboard.rb
112
194
  - lib/screen.rb
113
195
  - lib/string.rb
114
196
  - lib/tp.rb
197
+ - lib/tp/cli.rb
115
198
  - lib/tp/presenter.rb
199
+ - lib/tp/publisher/pdf.rb
116
200
  - lib/tp/renderer.rb
117
201
  - lib/tp/slide.rb
118
202
  - lib/tp/slide/bulleted.rb
@@ -126,7 +210,10 @@ files:
126
210
  - spec/lib/keyboard_spec.rb
127
211
  - spec/lib/screen_spec.rb
128
212
  - spec/lib/string_spec.rb
213
+ - spec/lib/tp/cli_spec.rb
214
+ - spec/lib/tp/coderay/prawn_encoder_spec.rb
129
215
  - spec/lib/tp/presenter_spec.rb
216
+ - spec/lib/tp/publisher/pdf_spec.rb
130
217
  - spec/lib/tp/slide/bulleted_spec.rb
131
218
  - spec/lib/tp/slide/code_spec.rb
132
219
  - spec/lib/tp/slide/header_only_spec.rb
@@ -166,7 +253,10 @@ test_files:
166
253
  - spec/lib/keyboard_spec.rb
167
254
  - spec/lib/screen_spec.rb
168
255
  - spec/lib/string_spec.rb
256
+ - spec/lib/tp/cli_spec.rb
257
+ - spec/lib/tp/coderay/prawn_encoder_spec.rb
169
258
  - spec/lib/tp/presenter_spec.rb
259
+ - spec/lib/tp/publisher/pdf_spec.rb
170
260
  - spec/lib/tp/slide/bulleted_spec.rb
171
261
  - spec/lib/tp/slide/code_spec.rb
172
262
  - spec/lib/tp/slide/header_only_spec.rb