card_printer 0.0.1 → 0.0.2

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.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MmM4OGE5NDVlMzk3MDI1M2UzZGExMDgxMWMxYTRiMmU0ZGQ3OWM3OQ==
5
- data.tar.gz: !binary |-
6
- YTllZGMwNGI0OWVjYWFmN2U0NTYyNzUwMGFhZmIxYWZlODhkYWNlZQ==
2
+ SHA1:
3
+ metadata.gz: 7ae51cf4fc64c025bf64e8b930b7f8c0221d7f00
4
+ data.tar.gz: 6da9286634464482d7e13e7828ef51d9e0743ae8
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NmYzOTk4NzAyNDk2NzBjNzIwN2VkNWY0YjZhMzYxMWNkYWVlYWI2ZDUzZjM4
10
- Nzk3YjM4YzQzM2YwNWM1Zjk3ZDUyNTE1MWRiOWNmN2I4ZjNlNzFlZTc1ZmZi
11
- MjA0ZTNiYjNkYThhMjgwOTQ1Y2M0MTg4Yzk1OTE5ZTNkYTdmZmE=
12
- data.tar.gz: !binary |-
13
- NWIzYTk1MWQxZTI5ZTQwZmIwNjAyYzZiNTExNWE3ZjEwNTVmNGRhN2QwNDZm
14
- YzRkMTFhY2Y5YzEyZjBlNzk2ZDUxMzQwMGQyMjUwNWUxMGI0NmMyY2YxZGRh
15
- MDFmYjQ1NGViNzdiYTk2OGY0ZmNiZmEzOTJjYjI2ZDdiNzM2ZjI=
6
+ metadata.gz: cfa85bcd78b645d00baa81a8f08af260baf27bd4b4153e8508a165b8cb1491726c394828a5e402ddd9ec4881bee56c85fb8bbd34b0029bfc17d64ec4e782272b
7
+ data.tar.gz: f9249df5fc9c9db11fc1f41e6bd530b70ee53e1b934124638cdfbb1067265fc4ccd0772fdef9a77a273e084afb8c1827b62d729be965ca0b318a3a2969531d4f
data/bin/card_printer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'slop'
4
4
  require 'card_printer'
5
- require 'card_printer/story'
5
+ require 'card_printer/parser'
6
6
  require 'json'
7
7
 
8
8
  # stories << CardPrinter::Story.new(name: "Foobar")
@@ -15,13 +15,19 @@ class Cli
15
15
  class BadCliOptionError < StandardError; end
16
16
 
17
17
  def initialize
18
- @opts = Slop.parse(help: true) do
19
- banner "Usage: #{File.basename(__FILE__)} [options] <output file.pdf>"
20
- separator %{Options:}
21
- on '-r=', 'renderer', %Q{Choose layout renderer (one of '#{CardPrinter.available_layouts.join("', '")}') }
22
- on '-h=', %Q{display this help message}
23
-
24
- separator %{
18
+ @opts = Slop.parse do |o|
19
+ o.banner = "Usage: #{File.basename(__FILE__)} [options] <output file.pdf>"
20
+ o.separator %{Options:}
21
+ o.on('-p=', 'parser',
22
+ %Q{Choose input parser (one of '#{CardPrinter::Parser.available_parsers.join("', '")}', default: trello_json_export)},
23
+ default: 'trello_json_export'
24
+ )
25
+ o.on('-r=', 'renderer', "Choose layout renderer (one of '#{CardPrinter.available_layouts.join("', '")}', default: '6x4')",
26
+ default: '6x4'
27
+ )
28
+ o.on '-h=', %Q{display this help message}
29
+
30
+ o.separator %{
25
31
  Data input:
26
32
 
27
33
  Provide story data on standard input in json-lines format (one JSON object per
@@ -41,26 +47,17 @@ e.g.
41
47
  {"name": "Second story", "description": "Do some things", "label": "epic one", "story_type": "feature", "estimate": "1"}
42
48
  }
43
49
  end
44
-
45
- end
46
-
47
- def renderer_name
48
- opts[:renderer] || "6x4"
49
50
  end
50
51
 
51
52
  def run
52
53
  if ARGV.size == 1
53
- stories = []
54
- $stdin.each_line do |line|
55
- data = JSON.parse(line)
56
- stories << CardPrinter::Story.new(data)
57
- end
58
-
59
- CardPrinter.render(stories, ARGV[0])
54
+ stories = CardPrinter::Parser.parse($stdin, opts[:parser])
55
+ CardPrinter.render(stories, ARGV[0], opts[:renderer])
60
56
  else
61
57
  puts opts
58
+ puts opts['parser']
62
59
  end
63
60
  end
64
61
  end
65
62
 
66
- Cli.new.run
63
+ Cli.new.run
@@ -0,0 +1,21 @@
1
+ require 'card_printer'
2
+ require 'card_printer/parser'
3
+ require 'card_printer/story'
4
+
5
+ class CardPrinter::Parser::Base
6
+ attr_reader :iostream
7
+
8
+ def initialize(iostream)
9
+ @iostream = iostream
10
+ end
11
+
12
+ def parse
13
+ @iostream.each_line.map do |line|
14
+ CardPrinter::Story.new(parse_line(line))
15
+ end.compact
16
+ end
17
+
18
+ def parse_line(line)
19
+ raise "parse_line not implemented"
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ require 'card_printer/parser'
2
+ require 'card_printer/parser/base'
3
+
4
+ class CardPrinter::Parser::CsvParser < CardPrinter::Parser::Base
5
+ def parse_line(line)
6
+ parsed = CSV.parse_line(line)
7
+ if @headers
8
+ Hash[@headers.zip(parsed)]
9
+ else
10
+ @headers = parsed
11
+ nil
12
+ end
13
+ end
14
+ end
15
+
16
+ CardPrinter::Parser.register_parser('csv', CardPrinter::Parser::CsvParser)
@@ -0,0 +1,12 @@
1
+ require 'card_printer/parser'
2
+ require 'card_printer/parser/base'
3
+
4
+ class CardPrinter::Parser::JsonLine < CardPrinter::Parser::Base
5
+ def parse_line(line)
6
+ JSON.parse(line)
7
+ rescue
8
+ nil
9
+ end
10
+ end
11
+
12
+ CardPrinter::Parser.register_parser('json_lines', CardPrinter::Parser::JsonLine)
@@ -0,0 +1,73 @@
1
+ require 'ostruct'
2
+ require 'card_printer/parser'
3
+ require 'card_printer/parser/base'
4
+
5
+ ###*****
6
+ require 'pp'
7
+
8
+ class CardPrinter::Parser::TrelloJsonExport < CardPrinter::Parser::Base
9
+ def parse
10
+ lists.map do |list|
11
+ list.cards.map do |card|
12
+ story_from_card(list, card)
13
+ end
14
+ end.flatten
15
+ end
16
+
17
+ def data
18
+ @data ||= JSON.load(iostream)
19
+ end
20
+
21
+ def lists
22
+ data['lists'].map do |list|
23
+ List.new(list).tap do |l|
24
+ l.cards = cards_for_list_id(l.id)
25
+ end
26
+ end
27
+ end
28
+
29
+ def cards_for_list_id(list_id)
30
+ data['cards'].select do |card|
31
+ card['idList'] == list_id
32
+ end.map do |card|
33
+ Card.new(card)
34
+ end
35
+ end
36
+
37
+ def story_from_card(list, card)
38
+ CardPrinter::Story.new(
39
+ name: "#{card.name}",
40
+ description: card.desc,
41
+ story_type: story_type(card),
42
+ estimate: "",
43
+ label: "",
44
+ id: "##{card.idShort}"
45
+ )
46
+ end
47
+
48
+ def story_type(card)
49
+ case label_of(card)
50
+ when /feature/i
51
+ "feature"
52
+ when /bug/i
53
+ "bug"
54
+ when /chore/i
55
+ "chore"
56
+ else
57
+ "other"
58
+ end
59
+ end
60
+
61
+ def label_of(card)
62
+ if card.labels.any?
63
+ card.labels.first['name']
64
+ else
65
+ ""
66
+ end
67
+ end
68
+
69
+ class List < OpenStruct; end
70
+ class Card < OpenStruct; end
71
+ end
72
+
73
+ CardPrinter::Parser.register_parser('trello_json_export', CardPrinter::Parser::TrelloJsonExport)
@@ -0,0 +1,33 @@
1
+ require 'json'
2
+ require 'csv'
3
+ require 'card_printer'
4
+
5
+ module CardPrinter::Parser
6
+ def self.parse(iostream, parser_type = default_parser)
7
+ parser_for(parser_type).call(iostream)
8
+ end
9
+
10
+ def self.available_parsers
11
+ @parsers.keys
12
+ end
13
+
14
+ def self.default_parser
15
+ 'trello_json_export'
16
+ end
17
+
18
+ def self.parser_for(parser_type)
19
+ parser_class = @parsers.fetch(parser_type)
20
+ ->(iostream) { parser_class.new(iostream).parse }
21
+ end
22
+
23
+ def self.register_parser(name, klass)
24
+ @parsers[name] = klass
25
+ end
26
+
27
+ private
28
+ @parsers = {}
29
+ end
30
+
31
+ require 'card_printer/parser/csv'
32
+ require 'card_printer/parser/json_line'
33
+ require 'card_printer/parser/trello_json_export'
@@ -86,6 +86,7 @@ class CardPrinter::SixByFourRenderer
86
86
  render_crest
87
87
  render_story_title(story)
88
88
  render_story_points(story, padding_y)
89
+ render_story_id(story, padding_y)
89
90
  end
90
91
  render_iteration_number(story)
91
92
  end
@@ -146,6 +147,19 @@ class CardPrinter::SixByFourRenderer
146
147
  end
147
148
  end
148
149
 
150
+ def render_story_id(story, padding_y)
151
+ return if story.id.to_s.empty?
152
+ @pdf.fill_color "000000"
153
+ @pdf.font "Helvetica" do
154
+ @pdf.text_box story.id.to_s,
155
+ :size => 10.mm * @scale,
156
+ :at => [@pdf.bounds.left, padding_y + 10.mm * @scale],
157
+ :width => @pdf.bounds.right - @pdf.bounds.left,
158
+ valign: :bottom,
159
+ align: :center
160
+ end
161
+ end
162
+
149
163
  def render_iteration_number(story)
150
164
  @pdf.fill_color "000000"
151
165
  text_height = 6.mm * @scale
@@ -2,8 +2,8 @@ require "card_printer"
2
2
 
3
3
  class CardPrinter::Story
4
4
  # story_type = {feature|bug|chore|other}
5
- ATTRS = [:name, :description, :story_type, :estimate, :label]
6
-
5
+ ATTRS = [:name, :description, :story_type, :estimate, :label, :id]
6
+
7
7
  attr_accessor *ATTRS
8
8
 
9
9
  def initialize(data = {})
@@ -11,4 +11,8 @@ class CardPrinter::Story
11
11
  self.send(:"#{attr_name}=", data[attr_name] || data[attr_name.to_s])
12
12
  end
13
13
  end
14
- end
14
+
15
+ def to_s
16
+ Hash[ATTRS.map {|a| [a, self.send(a)] }].to_s
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
1
  module CardPrinter
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/card_printer.rb CHANGED
@@ -10,7 +10,7 @@ module CardPrinter
10
10
  "a5" => CardPrinter::Renderer
11
11
  }
12
12
 
13
- def self.render(stories, destination_path, renderer_name = '6x4', opts = {})
13
+ def self.render(stories, destination_path, renderer_name, opts = {})
14
14
  renderer = LAYOUTS[renderer_name] || raise("Unknown layout renderer #{renderer_name}")
15
15
  renderer.new(stories, opts).render_to(destination_path)
16
16
  end
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: card_printer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heath
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-19 00:00:00.000000000 Z
11
+ date: 2015-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: prawn
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.3.0
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
26
  version: 1.3.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: slop
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
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
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.3'
48
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
54
  version: '1.3'
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
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
68
  version: '0'
69
69
  description: Produce nicely formatted PDFs of story cards for printing
@@ -74,7 +74,7 @@ executables:
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
- - .gitignore
77
+ - ".gitignore"
78
78
  - Gemfile
79
79
  - LICENSE.txt
80
80
  - README.md
@@ -85,6 +85,11 @@ files:
85
85
  - images/label_icon.jpg
86
86
  - lib/card_printer.rb
87
87
  - lib/card_printer/a6_renderer.rb
88
+ - lib/card_printer/parser.rb
89
+ - lib/card_printer/parser/base.rb
90
+ - lib/card_printer/parser/csv.rb
91
+ - lib/card_printer/parser/json_line.rb
92
+ - lib/card_printer/parser/trello_json_export.rb
88
93
  - lib/card_printer/renderer.rb
89
94
  - lib/card_printer/six_by_four_renderer.rb
90
95
  - lib/card_printer/story.rb
@@ -99,17 +104,17 @@ require_paths:
99
104
  - lib
100
105
  required_ruby_version: !ruby/object:Gem::Requirement
101
106
  requirements:
102
- - - ! '>='
107
+ - - ">="
103
108
  - !ruby/object:Gem::Version
104
109
  version: '0'
105
110
  required_rubygems_version: !ruby/object:Gem::Requirement
106
111
  requirements:
107
- - - ! '>='
112
+ - - ">="
108
113
  - !ruby/object:Gem::Version
109
114
  version: '0'
110
115
  requirements: []
111
116
  rubyforge_project:
112
- rubygems_version: 2.1.0
117
+ rubygems_version: 2.2.2
113
118
  signing_key:
114
119
  specification_version: 4
115
120
  summary: ''