codeclimate-yaml 0.3.0 → 0.4.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: 71d782fa25bad738efd94fcc20f94902ac73d485
4
- data.tar.gz: c22fdb5275b93887fefd1f6cb11a925089fd4a30
3
+ metadata.gz: a7245f6f455befe3f6b8ca5a7d5db3c0cc90f94d
4
+ data.tar.gz: 5919951b30ab401f965b8b75041be0b5e23494e9
5
5
  SHA512:
6
- metadata.gz: e876bb9daf725313ac2ded6d0ded54464b4bfe57e38e4dff07aaf371d2daa51dd646dd19fd3bdc4202f3a4c05c80f1f55ede032e8cad96c6a388a4f23b01c7b3
7
- data.tar.gz: bc1ff4e054002bb4b3c100805100de89adee6fd9438538860134d3a2d3c61865299f43004f69f74b53044bfc72cab9d7f2965c1d14ace12df4181acf2a4f0a83
6
+ metadata.gz: c5007979ccd4e0a85e85fc306ba9c6ba95a191442efb4ddab20cc6e60283f82a97c7b1ab87ade729f167904fa24842923f742cee4ed9c92b6a8bbad0183cab20
7
+ data.tar.gz: 0bf4693e9accf963178411d706f0629e1439c8d15fd2173f2e11e504e54bbeb0b567bb525d8fe6e578df8c993a8db754cc313682e25585bb4430a0967dc2a915
@@ -2,7 +2,30 @@ module CC
2
2
  module Yaml
3
3
  module Nodes
4
4
  class EngineList < OpenMapping
5
+ GENERIC_ERROR_MESSAGE = "The engines key should be a mapping from engine name to engine config.".freeze
6
+ EMPTY_ERROR_MESSAGE = "The engines key cannot be empty.".freeze
7
+
5
8
  default_type Engine
9
+
10
+ def verify
11
+ super
12
+ verify_not_empty
13
+ end
14
+
15
+ def visit_unexpected(_visitor, _value, message = nil)
16
+ if message
17
+ message = message << ". #{GENERIC_ERROR_MESSAGE}"
18
+ else
19
+ message = GENERIC_ERROR_MESSAGE
20
+ end
21
+ error(message)
22
+ end
23
+
24
+ private
25
+
26
+ def verify_not_empty
27
+ error(EMPTY_ERROR_MESSAGE) if mapping.keys.empty? && errors.empty?
28
+ end
6
29
  end
7
30
  end
8
31
  end
@@ -1,7 +1,7 @@
1
1
  module CC::Yaml
2
2
  module Nodes
3
3
  class Mapping < Node
4
- INCOMPATIBLE_KEYS_WARNING = "Use either a Languages key or an Engines key, but not both. They are mutually exclusive.".freeze
4
+ INCOMPATIBLE_KEYS_WARNING = "Use either a languages key or an engines key, but not both. They are mutually exclusive.".freeze
5
5
 
6
6
  def self.mapping
7
7
  @mapping ||= superclass.respond_to?(:mapping) ? superclass.mapping.dup : {}
@@ -24,7 +24,7 @@ module CC::Yaml
24
24
  when Symbol then aliases[key.to_s] = options[:to].to_s
25
25
  when Module then mapping[key.to_s] = options[:to]
26
26
  when nil then mapping[key.to_s] = Nodes[key]
27
- else raise ArgumentError, 'unexpected value for to: %p' % options[:to]
27
+ else raise ArgumentError, "unexpected value for to: %p" % options[:to]
28
28
  end
29
29
  end
30
30
  end
@@ -153,7 +153,7 @@ module CC::Yaml
153
153
  def verify_errors
154
154
  @mapping.delete_if do |key, value|
155
155
  if value.errors?
156
- warning "dropping %p section: %s", key, value.errors.join(', ')
156
+ error "invalid %p section: %s", key, value.errors.join(", ")
157
157
  true
158
158
  end
159
159
  end
@@ -65,23 +65,23 @@ module CC
65
65
  end
66
66
 
67
67
  def visit_mapping(visitor, value)
68
- error("unexpected mapping")
68
+ visit_unexpected(visitor, value, "unexpected mapping")
69
69
  end
70
70
 
71
71
  def visit_pair(visitor, key, value)
72
- error("unexpected pair")
72
+ visit_unexpected(visitor, value, "unexpected pair")
73
73
  end
74
74
 
75
75
  def visit_scalar(visitor, type, value, implicit = true)
76
- error("unexpected scalar") unless type == :null
76
+ visit_unexpected(visitor, value, "unexpected scalar") unless type == :null
77
77
  end
78
78
 
79
79
  def visit_sequence(visitor, value)
80
- error("unexpected sequence")
80
+ visit_unexpected(visitor, value, "unexpected sequence")
81
81
  end
82
82
 
83
83
  def visit_child(visitor, value)
84
- error("unexpected child")
84
+ visit_unexpected(visitor, value, "unexpected child")
85
85
  end
86
86
 
87
87
  def respond_to_missing?(method, include_private = false)
@@ -10,8 +10,12 @@ module CC
10
10
  map :languages, to: LanguageList
11
11
  map :ratings, to: Ratings
12
12
 
13
+ attr_accessor :parseable
14
+ alias_method :parseable?, :parseable
15
+
13
16
  def initialize
14
17
  super(nil)
18
+ @parseable = true
15
19
  end
16
20
 
17
21
  def nested_warnings(*)
@@ -1,5 +1,5 @@
1
- require 'psych'
2
- require 'delegate'
1
+ require "psych"
2
+ require "delegate"
3
3
 
4
4
  module CC::Yaml
5
5
  module Parser
@@ -37,14 +37,14 @@ module CC::Yaml
37
37
  TRUE = /\A(?:y|Y|yes|Yes|YES|true|True|TRUE|on|On|ON)\z/
38
38
  FALSE = /\A(?:n|N|no|No|NO|false|False|FALSE|off|Off|OFF)\z/
39
39
  REGEXP = /\A!(?:ruby\/)?regexp\z/
40
- REG_FLAGS = { 'i' => Regexp::IGNORECASE, 'm' => Regexp::MULTILINE, 'x' => Regexp::EXTENDED }
40
+ REG_FLAGS = { "i" => Regexp::IGNORECASE, "m" => Regexp::MULTILINE, "x" => Regexp::EXTENDED }
41
41
  FORMATS = {
42
- '!bool' => Regexp.union(TRUE, FALSE),
43
- '!float' => ::Psych::ScalarScanner::FLOAT,
44
- '!null' => /\A(:?~|null|Null|NULL|)\z/,
45
- '!timestamp' => ::Psych::ScalarScanner::TIME,
46
- '!int' => ::Psych::ScalarScanner::INTEGER,
47
- '!regexp' => /\A\/(.*)\/([imx]*)\z/
42
+ "!bool" => Regexp.union(TRUE, FALSE),
43
+ "!float" => ::Psych::ScalarScanner::FLOAT,
44
+ "!null" => /\A(:?~|null|Null|NULL|)\z/,
45
+ "!timestamp" => ::Psych::ScalarScanner::TIME,
46
+ "!int" => ::Psych::ScalarScanner::INTEGER,
47
+ "!regexp" => /\A\/(.*)\/([imx]*)\z/,
48
48
  }
49
49
 
50
50
  if defined? ::Psych::ClassLoader
@@ -87,11 +87,12 @@ module CC::Yaml
87
87
  root.verify
88
88
  root.warnings.clear
89
89
  root.error("syntax error: %s", error.message)
90
+ root.parseable = false
90
91
  root
91
92
  end
92
93
 
93
94
  def check_for_analysis_key(root)
94
- unless root.engines? || root.languages?
95
+ unless root.engines? || root.languages? || root.errors.any?
95
96
  root.error NO_ANALYSIS_KEY_FOUND_ERROR
96
97
  end
97
98
  end
@@ -127,10 +128,10 @@ module CC::Yaml
127
128
  when SET then node.visit_sequence self, SetNode.new(value)
128
129
  when SEQ then node.visit_sequence self, value
129
130
  when nil
130
- if value.children.size == 2 and value.children.first.value == 'secure'
131
+ if value.children.size == 2 and value.children.first.value == "secure"
131
132
  secret_value = value.children.last
132
133
  if secret_value.is_a? ::Psych::Nodes::Scalar
133
- secret_value.tag ||= '!secure'
134
+ secret_value.tag ||= "!secure"
134
135
  node.visit_scalar(self, :secure, secret_value, false)
135
136
  else
136
137
  node.visit_unexpected(self, value, "secret value needs to be a string")
@@ -179,16 +180,16 @@ module CC::Yaml
179
180
 
180
181
  def scalar_tag(value)
181
182
  return value.tag if value.tag
182
- return '!str' if value.quoted
183
+ return "!str" if value.quoted
183
184
  FORMATS.each do |tag, format|
184
185
  return tag if value.value =~ format
185
186
  end
186
- '!str'
187
+ "!str"
187
188
  end
188
189
 
189
190
  def regexp(pattern)
190
191
  return pattern if pattern.is_a? Regexp
191
- return Regexp.new(pattern) unless pattern =~ FORMATS['!regexp']
192
+ return Regexp.new(pattern) unless pattern =~ FORMATS["!regexp"]
192
193
  flag = $2.chars.inject(0) { |f,c| f | REG_FLAGS.fetch(c, 0) }
193
194
  Regexp.new($1, flag)
194
195
  rescue RegexpError => error
@@ -198,15 +199,15 @@ module CC::Yaml
198
199
  def cast(type, value)
199
200
  case type
200
201
  when :str then value.value
201
- when :binary then value.value.unpack('m').first
202
+ when :binary then value.value.unpack("m").first
202
203
  when :bool then value.value !~ FALSE
203
204
  when :float then Float @scanner.tokenize(value.value)
204
205
  when :int then Integer @scanner.tokenize(value.value)
205
206
  when :time then @scanner.parse_time(value.value)
206
- when :secure then SecureString.new(value.value, value.tag != '!decrypted')
207
+ when :secure then SecureString.new(value.value, value.tag != "!decrypted")
207
208
  when :regexp then regexp(value.value)
208
209
  when :null then nil
209
- else raise ArgumentError, 'unknown scalar type %p' % type
210
+ else raise ArgumentError, "unknown scalar type %p" % type
210
211
  end
211
212
  end
212
213
 
@@ -1,4 +1,4 @@
1
- require 'secure_string'
1
+ require "secure_string"
2
2
 
3
3
  module CC::Yaml
4
4
  module Serializer
@@ -23,7 +23,7 @@ module CC::Yaml
23
23
  when Nodes::Scalar then serialize_scalar(node)
24
24
  when Nodes::Mapping then serialize_mapping(node)
25
25
  when Nodes::Sequence then serialize_sequence(node)
26
- else raise NotSupportedError, 'do not know how to serialize %p' % node.class
26
+ else raise NotSupportedError, "do not know how to serialize %p" % node.class
27
27
  end
28
28
  end
29
29
 
@@ -57,13 +57,13 @@ module CC::Yaml
57
57
  def serialize_secure(value)
58
58
  case options[:secure]
59
59
  when :decrypted
60
- raise ArgumentError, 'secure option is set decrypted, but a secure value is not decrypted' unless value.decrypted?
60
+ raise ArgumentError, "secure option is set decrypted, but a secure value is not decrypted" unless value.decrypted?
61
61
  serialize_decrypted(value)
62
62
  when :encrypted
63
- raise ArgumentError, 'secure option is set encrypted, but a secure value is not encrypted' unless value.encrypted?
63
+ raise ArgumentError, "secure option is set encrypted, but a secure value is not encrypted" unless value.encrypted?
64
64
  serialize_encrypted(value)
65
65
  else
66
- raise ArgumentError, 'unexpected value for secure option: %p' % options[:secure] if options[:secure]
66
+ raise ArgumentError, "unexpected value for secure option: %p" % options[:secure] if options[:secure]
67
67
  value.encrypted? ? serialize_encrypted(value) : serialize_decrypted(value)
68
68
  end
69
69
  end
@@ -93,7 +93,7 @@ module CC::Yaml
93
93
  end
94
94
 
95
95
  def serialize_value(node)
96
- raise NotSupportedError, 'cannot serialize %p with %p' % [node.class, self.class]
96
+ raise NotSupportedError, "cannot serialize %p with %p" % [node.class, self.class]
97
97
  end
98
98
 
99
99
  def serialize_root(node)
@@ -16,7 +16,7 @@ module CC
16
16
  end
17
17
 
18
18
  def serialize_float(value)
19
- raise NotSupportedError, 'cannot serialize infinity as JSON' if value.infinite?
19
+ raise NotSupportedError, "cannot serialize infinity as JSON" if value.infinite?
20
20
  "#{value}"
21
21
  end
22
22
 
@@ -29,15 +29,15 @@ module CC
29
29
  end
30
30
 
31
31
  def serialize_str(value)
32
- string = value.encode('utf-8')
33
- string.force_encoding('binary')
32
+ string = value.encode("utf-8")
33
+ string.force_encoding("binary")
34
34
  string.gsub!(/["\\\x0-\x1f]/) { MAP[$&] }
35
- string.force_encoding('utf-8')
35
+ string.force_encoding("utf-8")
36
36
  "\"#{string}\""
37
37
  end
38
38
 
39
39
  def serialize_binary(value)
40
- raise NotSupportedError, 'cannot serialize binary data as JSON'
40
+ raise NotSupportedError, "cannot serialize binary data as JSON"
41
41
  end
42
42
 
43
43
  def serialize_bool(value)
@@ -45,11 +45,11 @@ module CC
45
45
  end
46
46
 
47
47
  def serialize_mapping(node)
48
- lines('{%s}', super.map { |key, value| key_value(key, value) })
48
+ lines("{%s}", super.map { |key, value| key_value(key, value) })
49
49
  end
50
50
 
51
51
  def serialize_sequence(node)
52
- lines('[%s]', super)
52
+ lines("[%s]", super)
53
53
  end
54
54
 
55
55
  def key_value(key, value, wrapper = "%s")
@@ -58,7 +58,7 @@ module CC
58
58
  end
59
59
 
60
60
  def lines(wrapper, lines)
61
- return wrapper % lines.join(',') unless pretty?
61
+ return wrapper % lines.join(",") unless pretty?
62
62
  return wrapper % "" if lines.empty?
63
63
  return wrapper % " #{lines.first} " unless lines.size > 1 or lines.first.include?("\n") or lines.first.size > 50
64
64
  lines = "\n " + lines.join(",\n").strip.gsub("\n", "\n ") + "\n"
@@ -1,5 +1,5 @@
1
1
  module CC
2
2
  module Yaml
3
- VERSION = "0.3.0".freeze
3
+ VERSION = "0.4.0".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codeclimate-yaml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code Climate
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-12 00:00:00.000000000 Z
11
+ date: 2015-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: secure_string