gitattributes 2.8.0 → 2.9.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9dbc9ae3068f89180ecfd208254dd413a358d01
4
- data.tar.gz: 8557715a83892b0f361ffa162f10e7491074034c
3
+ metadata.gz: 74e12406eeb9e2147d5f85a1c3b3bbcec0d00413
4
+ data.tar.gz: 01349400936be63156845c7f40f527c032f127b8
5
5
  SHA512:
6
- metadata.gz: 1fd79ddde7dceeded25c2f00eca18afc99559a388c043073a78cede9da31f55cd79c8fb2ac673d1db85bbda1b34f56de4bd5387bed4510388f03687a6933354d
7
- data.tar.gz: 793d06a6b3a86d5a03a8f13d844bf8abd3844aecbca5d910cb4599a3eee232297c838a3d43ee2e613160fab8e72105aa47f020dff30f961ec697b43eb44ddbf5
6
+ metadata.gz: dfa70d0473d6a1daacd5a11207b53da1e9d84b411c5f7ab4bd490338a8493e0ff70da2dfa0003b0e33b3434f727daff36aa7268686a6f23ab86179e5960268b2
7
+ data.tar.gz: f4098c940c647c8ff44ffaa4fe75caebd74228486d61a3a81334ad51a41178ea6b0cc63079b4fc110e944ca07790d52ec2bfbc745d079ed31b370a053ef0eca3
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{gitattributes}
5
- s.version = '2.8.0'
5
+ s.version = '2.9.0'
6
6
  s.platform = Gem::Platform::RUBY
7
7
 
8
8
  s.authors = ['Peter Donald']
@@ -36,7 +36,7 @@ module Reality #nodoc
36
36
  attr_reader :priority
37
37
 
38
38
  def to_s
39
- rule = self.pattern.gsub(' ','[[:space:]]')
39
+ rule = self.pattern.gsub(' ', '[[:space:]]')
40
40
 
41
41
  attributes = self.attributes.dup
42
42
  ATTR_ORDER.each do |key|
@@ -80,6 +80,66 @@ module Reality #nodoc
80
80
  to_s <=> other.to_s
81
81
  end
82
82
  end
83
+
84
+ class << self
85
+ def parse_line(line)
86
+ line = line.strip
87
+ return nil if line.start_with?('#') || line.empty?
88
+ pattern, attrs = line.strip.split(/\s+/, 2)
89
+ AttributeRule.new(pattern, attrs ? parse_attributes(attrs) : {})
90
+ end
91
+
92
+ private
93
+
94
+ # Parses an attribute string.
95
+ #
96
+ # These strings can be in the following formats:
97
+ #
98
+ # text # => { "text" => true }
99
+ # -text # => { "text" => false }
100
+ # key=value # => { "key" => "value" }
101
+ #
102
+ # string - The string to parse.
103
+ #
104
+ # Returns a Hash containing the attributes and their values.
105
+ def parse_attributes(string)
106
+ values = {}
107
+ dash = '-'
108
+ equal = '='
109
+ binary = 'binary'
110
+
111
+ string.split(/\s+/).each do |chunk|
112
+ # Data such as "foo = bar" should be treated as "foo" and "bar" being
113
+ # separate boolean attributes.
114
+ next if chunk == equal
115
+
116
+ key = chunk
117
+
118
+ # Input: "-foo"
119
+ if chunk.start_with?(dash)
120
+ key = chunk.byteslice(1, chunk.length - 1)
121
+ value = false
122
+
123
+ # Input: "foo=bar"
124
+ elsif chunk.include?(equal)
125
+ key, value = chunk.split(equal, 2)
126
+
127
+ # Input: "foo"
128
+ else
129
+ value = true
130
+ end
131
+
132
+ values[key] = value
133
+
134
+ # When the "binary" option is set the "diff" option should be set to
135
+ # the inverse. If "diff" is later set it should overwrite the
136
+ # automatically set value.
137
+ values['diff'] = false if key == binary && value
138
+ end
139
+
140
+ values
141
+ end
142
+ end
83
143
  end
84
144
  end
85
145
  end
@@ -24,9 +24,22 @@ module Reality #nodoc
24
24
  def parse(repository_path, attributes_file = nil, relative_path = nil)
25
25
  path = File.expand_path(repository_path)
26
26
  attributes_file ||= "#{path}/.gitattributes"
27
- rules = File.exist?(attributes_file) ? Reality::Git::AttributesParser.parse_file(attributes_file) : []
27
+ rules = File.exist?(attributes_file) ? parse_file(attributes_file) : []
28
28
  Attributes.new(repository_path, attributes_file, relative_path, rules)
29
29
  end
30
+
31
+ private
32
+
33
+ def parse_file(filename)
34
+ rules = []
35
+
36
+ IO.readlines(filename).each do |line|
37
+ rule = AttributeRule.parse_line(line)
38
+ rules << rule if rule
39
+ end
40
+
41
+ rules
42
+ end
30
43
  end
31
44
 
32
45
  def initialize(repository_path, attributes_file = nil, relative_path = nil, rules = [])
@@ -13,5 +13,4 @@
13
13
  #
14
14
 
15
15
  require 'reality/git/attribute_rule'
16
- require 'reality/git/attributes_parser'
17
16
  require 'reality/git/attributes'
@@ -66,4 +66,20 @@ class Reality::Git::TestAttributeRule < Reality::TestCase
66
66
  assert_equal(false, rule1.eql?(rule2))
67
67
  assert_not_equal(rule1.hash, rule2.hash)
68
68
  end
69
+
70
+ def test_parse_line_comment
71
+ rule = Reality::Git::AttributeRule.parse_line('# This is a comment')
72
+ assert_equal nil, rule
73
+ end
74
+
75
+ def test_parse_line_empty
76
+ rule = Reality::Git::AttributeRule.parse_line(' ')
77
+ assert_equal nil, rule
78
+ end
79
+
80
+ def test_parse_line
81
+ rule = Reality::Git::AttributeRule.parse_line('*.rdl text')
82
+ assert_equal '*.rdl', rule.pattern
83
+ assert_equal({ 'text' => true }, rule.attributes)
84
+ end
69
85
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitattributes
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.0
4
+ version: 2.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Donald
@@ -56,7 +56,6 @@ files:
56
56
  - gitattributes.gemspec
57
57
  - lib/reality/git/attribute_rule.rb
58
58
  - lib/reality/git/attributes.rb
59
- - lib/reality/git/attributes_parser.rb
60
59
  - lib/reality/gitattributes.rb
61
60
  - test/helper.rb
62
61
  - test/reality/git/test_attribute_rule.rb
@@ -1,104 +0,0 @@
1
- # Copyright (c) 2017 Peter Donald
2
- # Copyright (c) 2013 Dmitriy Zaporozhets
3
- #
4
- # Permission is hereby granted, free of charge, to any person obtaining a copy
5
- # of this software and associated documentation files (the "Software"), to deal
6
- # in the Software without restriction, including without limitation the rights
7
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
- # copies of the Software, and to permit persons to whom the Software is
9
- # furnished to do so, subject to the following conditions:
10
- #
11
- # The above copyright notice and this permission notice shall be included in
12
- # all copies or substantial portions of the Software.
13
- #
14
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
- # THE SOFTWARE.
21
-
22
- # These classes were extracted from the https://gitlab.com/ben.boeckel/gitlab_git repository
23
- # with the gitattribtues code originally authored by Douwe Maan. Credit to the original authors.
24
-
25
- module Reality #nodoc
26
- module Git
27
- # Parse the Git attribute file extracting the attributes for file patterns.
28
- module AttributesParser
29
- class << self
30
-
31
- # Parses the specified Git attributes file.
32
- def parse_file(filename)
33
- rules = []
34
- comment = '#'
35
-
36
- IO.readlines(filename).each do |line|
37
- next if line.start_with?(comment) || line.empty?
38
-
39
- pattern, attrs = line.split(/\s+/, 2)
40
-
41
- parsed_attributes = attrs ? parse_attributes(attrs) : {}
42
-
43
- rules << AttributeRule.new(pattern, parsed_attributes)
44
- end
45
-
46
- # Newer entries take precedence over older entries.
47
- rules
48
- end
49
-
50
- private
51
-
52
- # Parses an attribute string.
53
- #
54
- # These strings can be in the following formats:
55
- #
56
- # text # => { "text" => true }
57
- # -text # => { "text" => false }
58
- # key=value # => { "key" => "value" }
59
- #
60
- # string - The string to parse.
61
- #
62
- # Returns a Hash containing the attributes and their values.
63
- def parse_attributes(string)
64
- values = {}
65
- dash = '-'
66
- equal = '='
67
- binary = 'binary'
68
-
69
- string.split(/\s+/).each do |chunk|
70
- # Data such as "foo = bar" should be treated as "foo" and "bar" being
71
- # separate boolean attributes.
72
- next if chunk == equal
73
-
74
- key = chunk
75
-
76
- # Input: "-foo"
77
- if chunk.start_with?(dash)
78
- key = chunk.byteslice(1, chunk.length - 1)
79
- value = false
80
-
81
- # Input: "foo=bar"
82
- elsif chunk.include?(equal)
83
- key, value = chunk.split(equal, 2)
84
-
85
- # Input: "foo"
86
- else
87
- value = true
88
- end
89
-
90
- values[key] = value
91
-
92
- # When the "binary" option is set the "diff" option should be set to
93
- # the inverse. If "diff" is later set it should overwrite the
94
- # automatically set value.
95
- values['diff'] = false if key == binary && value
96
- end
97
-
98
- values
99
- end
100
- end
101
- end
102
- end
103
- end
104
-