pdd 0.12 → 0.13

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.
@@ -66,6 +66,21 @@
66
66
  </xs:restriction>
67
67
  </xs:simpleType>
68
68
  </xs:element>
69
+ <xs:element name="author" minOccurs="0">
70
+ <xs:simpleType>
71
+ <xs:restriction base="xs:string">
72
+ <xs:pattern value=".+"/>
73
+ </xs:restriction>
74
+ </xs:simpleType>
75
+ </xs:element>
76
+ <xs:element name="email" minOccurs="0">
77
+ <xs:simpleType>
78
+ <xs:restriction base="xs:string">
79
+ <xs:pattern value=".+"/>
80
+ </xs:restriction>
81
+ </xs:simpleType>
82
+ </xs:element>
83
+ <xs:element name="time" minOccurs="0" type="xs:dateTime"/>
69
84
  </xs:all>
70
85
  </xs:complexType>
71
86
  <xs:element name="puzzles">
@@ -81,7 +81,7 @@ module PDD
81
81
  lines: "#{idx + 1}-#{idx + tail.size + 1}",
82
82
  body: body,
83
83
  file: @path
84
- )
84
+ ).merge(git(idx + 1))
85
85
  )
86
86
  end
87
87
 
@@ -95,6 +95,28 @@ module PDD
95
95
  .each { |txt| fail Error, 'Too many spaces' if txt =~ /^\s{2,}/ }
96
96
  .map { |txt| txt[1, txt.length] }
97
97
  end
98
+
99
+ # Git information at the line
100
+ def git(pos)
101
+ cmd = [
102
+ "cd #{File.dirname(@file)}",
103
+ "git blame -L #{pos},#{pos} --porcelain #{File.basename(@file)}"
104
+ ].join(' && ')
105
+ Hash[
106
+ `#{cmd}`.split("\n").map do |line|
107
+ if line =~ /^author /
108
+ [:author, line.sub(/^author /, '')]
109
+ elsif line =~ /^author-mail /
110
+ [:email, line.sub(/^author-mail <(.+)>$/, '\1')]
111
+ elsif line =~ /^author-time /
112
+ [
113
+ :time,
114
+ Time.at(line.sub(/^author-time ([0-9]+)$/, '\1').to_i).iso8601
115
+ ]
116
+ end
117
+ end.compact
118
+ ]
119
+ end
98
120
  end
99
121
 
100
122
  # Verbose Source.
@@ -26,5 +26,5 @@
26
26
  # Copyright:: Copyright (c) 2014 Yegor Bugayenko
27
27
  # License:: MIT
28
28
  module PDD
29
- VERSION = '0.12'
29
+ VERSION = '0.13'
30
30
  end
@@ -59,6 +59,34 @@ class TestPDD < Minitest::Test
59
59
  end
60
60
  end
61
61
 
62
+ def test_git_repo
63
+ Dir.mktmpdir 'test' do |dir|
64
+ opts = opts(['-v', '-s', dir])
65
+ fail unless system("
66
+ set -e
67
+ cd '#{dir}'
68
+ git init .
69
+ git config user.email test@teamed.io
70
+ git config user.name 'Mr. Tester'
71
+ echo '@todo #1 this is the puzzle' > x.txt
72
+ git add x.txt
73
+ git commit -am 'first version'
74
+ ")
75
+ matches(
76
+ Nokogiri::XML(PDD::Base.new(opts).xml),
77
+ [
78
+ '/puzzles[count(puzzle)=1]',
79
+ '/puzzles/puzzle[file="x.txt"]',
80
+ '/puzzles/puzzle[author="Mr. Tester"]',
81
+ '/puzzles/puzzle[email="test@teamed.io"]',
82
+ '/puzzles/puzzle[time]'
83
+ ]
84
+ )
85
+ end
86
+ end
87
+
88
+ private
89
+
62
90
  def opts(args)
63
91
  Slop.parse args do
64
92
  on 'v', 'verbose'
@@ -69,4 +69,28 @@ class TestSources < Minitest::Test
69
69
  assert !error.message.index('Space expected').nil?
70
70
  end
71
71
  end
72
+
73
+ def test_reads_git_author
74
+ Dir.mktmpdir 'test' do |dir|
75
+ fail unless system("
76
+ set -e
77
+ cd '#{dir}'
78
+ git init .
79
+ git config user.email test@teamed.io
80
+ git config user.name test
81
+ echo '@todo #1 this is the puzzle' > a.txt
82
+ git add a.txt
83
+ git commit -am 'first version'
84
+ git blame a.txt
85
+ ")
86
+ list = PDD::Source.new(File.join(dir, 'a.txt'), '').puzzles
87
+ assert_equal 1, list.size
88
+ puzzle = list.first
89
+ assert_equal '1-1', puzzle.props[:lines]
90
+ assert_equal 'this is the puzzle', puzzle.props[:body]
91
+ assert_equal 'test', puzzle.props[:author]
92
+ assert_equal 'test@teamed.io', puzzle.props[:email]
93
+ assert !puzzle.props[:time].nil?
94
+ end
95
+ end
72
96
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdd
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.12'
4
+ version: '0.13'
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: 2015-01-06 00:00:00.000000000 Z
12
+ date: 2015-01-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri