codeclimate-yaml 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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