travis-conditions 1.0.5 → 1.0.6

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: 2d21734c118195f32645a5c0e2b1027af5d08eea
4
- data.tar.gz: e1f922b4297f34c652f6687b9323cd6f47c2f62f
3
+ metadata.gz: 0cb3e113cdc4a371a2fe5de849be3570fe8b606a
4
+ data.tar.gz: 3cb1e7b0112ac22b8b15462caa7df1bd6eb5876f
5
5
  SHA512:
6
- metadata.gz: ce9269426c3c4e98689114cae49d81e9f97e7f0267bf83ff7226569176dcdb77dd4c8c12bf3eaeec0c22ef6fbaee36edaa6bf7e97477e247cadaed176ba420bb
7
- data.tar.gz: 92cd8f86ff5db7a41e7ac127af103359ed4070c864b57dec49372311a46864af358837ff33180b798b1a4d2c236428e2d380af6943115f5342318390110c0eab
6
+ metadata.gz: 4d7015a0e92d371d100731a2dbee62d207bbcd641d3752e14cafd88e518948558c6980d41402d14a689291a3b4ce1089bdf4291bc72f2dd7db0763ba7464eb03
7
+ data.tar.gz: a65d7844b120833b8ff4387481bc8bfa141a30dff599bcd21fe83a819d1621c9c17157ffb7e2645533bd6f28428b6ef8dbdbb09680003d1b509af6e35f7c4fbe
data/README.md CHANGED
@@ -16,13 +16,28 @@ See [this file](https://github.com/travis-ci/travis-conditions/blob/master/lib/t
16
16
  ## CLI
17
17
 
18
18
  With the gem installed you can use the command `travis-conditions` in order to
19
- test your conditions locally. For example:
19
+ test your conditions locally.
20
+
21
+ ### parse
22
+
23
+ Check the syntax of a condition by inspecting the resulting abstract syntax
24
+ tree.
25
+
26
+ ```
27
+ $ travis-conditions eval "branch = foo"
28
+ [:eq, [:var, :branch], [:val, "foo"]]
29
+
30
+ ```
31
+
32
+ ### eval
33
+
34
+ Check conditions against a given data hash.
20
35
 
21
36
  ```
22
- $ travis-conditions "branch = foo" --data '{"branch": "foo"}'
37
+ $ travis-conditions eval "branch = foo" --data '{"branch": "foo"}'
23
38
  true
24
39
 
25
- $ echo '{"branch": "foo"}' | travis-conditions "branch = foo"
40
+ $ echo '{"branch": "foo"}' | travis-conditions eval "branch = foo"
26
41
  true
27
42
  ```
28
43
 
@@ -30,9 +45,9 @@ The given `data` hash can include known attributes (such as branch, tag, repo)
30
45
  and an `env` key that can either hold a hash, or an array of strings:
31
46
 
32
47
  ```
33
- $ travis-conditions "env(foo) = bar" --data '{"env": {"foo": "bar"}}'
48
+ $ travis-conditions eval "env(foo) = bar" --data '{"env": {"foo": "bar"}}'
34
49
  true
35
- $ travis-conditions "env(foo) = bar" --data '{"env": ["foo=bar"]}'
50
+ $ travis-conditions eval "env(foo) = bar" --data '{"env": ["foo=bar"]}'
36
51
  true
37
52
  ```
38
53
 
@@ -4,20 +4,41 @@ $: << 'lib'
4
4
 
5
5
  require 'json'
6
6
  require 'optparse'
7
+ require 'pp'
7
8
  require 'travis/conditions'
8
9
 
9
10
  def help
10
- abort <<~help
11
- Usage:
12
- travis-conditions "branch = master" --data '{"branch": "master"}'
13
- travis-conditions echo '{"branch": "master"}' | travis-conditions "branch = master"
11
+ abort <<~str
12
+ SYNOPSIS:
14
13
 
15
- The given data JSON hash can include known attributes (such as branch, tag,
16
- repo) and an "env" key that can either hold a hash, or an array of strings:
14
+ travis-conditions <command>
17
15
 
18
- {"env": {"foo": "bar"}}
19
- {"env": ["foo=bar"]}
20
- help
16
+ COMMANDS:
17
+
18
+ parse
19
+
20
+ Validate the syntax of a condition, inspect the resulting abstract
21
+ syntax tree.
22
+
23
+ E.g.:
24
+
25
+ travis-conditions parse "branch = master"
26
+
27
+ eval
28
+
29
+ Validate the behavior of a condition, given an input data hash.
30
+
31
+ E.g.:
32
+
33
+ travis-conditions eval "branch = master" --data '{"branch": "master"}'
34
+ echo '{"branch": "master"}' | eval travis-conditions "branch = master"
35
+
36
+ The given data JSON hash can include known attributes (such as branch, tag,
37
+ repo) and an "env" key that can either hold a hash, or an array of strings:
38
+
39
+ {"env": {"foo": "bar"}}
40
+ {"env": ["foo=bar"]}
41
+ str
21
42
  end
22
43
 
23
44
  data = $stdin.read unless $stdin.tty?
@@ -28,7 +49,19 @@ ARGV.options do |opts|
28
49
  opts.parse!
29
50
  end
30
51
 
52
+ cmd = ARGV.shift
53
+ abort help unless cmd
54
+
31
55
  cond = ARGV.shift
32
- abort help unless cond && data
56
+ abort help unless cond && (cmd == 'parse' || data)
33
57
 
34
- p Travis::Conditions.eval(cond, JSON.parse(data), version: :v1)
58
+ begin
59
+ case cmd
60
+ when 'parse'
61
+ pp Travis::Conditions.parse(cond, version: :v1)
62
+ when 'eval'
63
+ p Travis::Conditions.eval(cond, JSON.parse(data), version: :v1)
64
+ end
65
+ rescue Travis::Conditions::ParseError => e
66
+ abort e.message
67
+ end
@@ -1,6 +1,7 @@
1
1
  require 'travis/conditions/v1/data'
2
2
  require 'travis/conditions/v1/eval'
3
3
  require 'travis/conditions/v1/parser'
4
+ require 'travis/conditions/v1/regex'
4
5
 
5
6
  module Travis
6
7
  module Conditions
@@ -66,7 +66,6 @@ module Travis
66
66
  NRE = /!~/
67
67
  COMMA = /,/
68
68
  WORD = /[^\s\(\)"',=!]+/
69
- REGEX = %r(/.+/|\S*[^\s\)]+)
70
69
  CONT = /\\\s*[\n\r]/
71
70
 
72
71
  OP = {
@@ -84,7 +83,7 @@ module Travis
84
83
  shell_str: 'Strings cannot start with a dollar (shell code does not work). This can be bypassed by quoting the string.'
85
84
  }
86
85
 
87
- def_delegators :str, :scan, :skip, :string, :pos, :peek
86
+ def_delegators :str, :rest, :scan, :skip, :string, :pos, :peek
88
87
  attr_reader :str
89
88
 
90
89
  def initialize(str)
@@ -118,8 +117,9 @@ module Travis
118
117
  def regex
119
118
  val = call
120
119
  return [:reg, val] if val
121
- reg = space { scan(REGEX) }
122
- [:reg, reg.gsub(/^\/|\/$/, '')] or err('an operand')
120
+ return unless reg = space { Regex.new(rest).scan }
121
+ str.pos = str.pos + reg.size
122
+ [:reg, reg.gsub(%r(^/|/$), '')] # or err('an operand')
123
123
  end
124
124
 
125
125
  def eq
@@ -0,0 +1,54 @@
1
+ require 'strscan'
2
+ require 'forwardable'
3
+
4
+ module Travis
5
+ module Conditions
6
+ module V1
7
+ class Regex
8
+ REGEX = %r(\S*[^\s\)]+)
9
+ DELIM = '/'
10
+ ESC = '\\'
11
+
12
+ extend Forwardable
13
+
14
+ def_delegators :str, :check, :eos?, :getch, :peek, :pos, :scan, :skip, :string
15
+ attr_reader :str
16
+
17
+ def initialize(str)
18
+ @str = StringScanner.new(str.to_s.strip)
19
+ @esc = false
20
+ end
21
+
22
+ def scan
23
+ word || regex
24
+ end
25
+
26
+ def word
27
+ return if peek(1) == DELIM
28
+ str.scan(REGEX)
29
+ end
30
+
31
+ def regex
32
+ return unless peek(1) == DELIM && reg = getch
33
+ char = nil
34
+ reg << char while (char = read) && char != :eos
35
+ reg << DELIM if char == :eos
36
+ reg unless reg.empty?
37
+ end
38
+
39
+ def read
40
+ char = peek(1)
41
+ if char == DELIM && !@esc
42
+ :eos
43
+ elsif char == ESC
44
+ @esc = true
45
+ getch
46
+ else
47
+ @esc = false
48
+ getch
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,5 +1,5 @@
1
1
  module Travis
2
2
  module Conditions
3
- VERSION = '1.0.5'
3
+ VERSION = '1.0.6'
4
4
  end
5
5
  end
data/spec/v1/data_spec.rb CHANGED
@@ -59,6 +59,7 @@ describe Travis::Conditions::V1::Data do
59
59
  describe 'with a string and a secure env var' do
60
60
  let(:env) { ["FOO=foo BAR=bar", { secure: '12345' }] }
61
61
  it { expect(subject.env(:FOO)).to eq 'foo' }
62
+ it { expect(subject.env(:BAR)).to eq 'bar' }
62
63
  end
63
64
  end
64
65
 
@@ -1,12 +1,47 @@
1
1
  describe Travis::Conditions::V1::Parser, 'regex' do
2
2
  let(:str) { |e| e.description }
3
- let(:subject) { described_class.new(str).regex }
3
+ let(:subject) { described_class.new(str).parse }
4
4
 
5
- it '^.*-bar$' do
6
- should eq [:reg, '^.*-bar$']
5
+ it 'branch =~ ^.*-foo$' do
6
+ should eq [:match, [:var, :branch], [:reg, '^.*-foo$']]
7
7
  end
8
8
 
9
- it '/^.* bar$/' do
10
- should eq [:reg, '^.* bar$']
9
+ it 'branch =~ /^.* foo$/' do
10
+ should eq [:match, [:var, :branch], [:reg, '^.* foo$']]
11
+ end
12
+
13
+ it 'branch =~ /foo/ OR tag =~ /^foo$/' do
14
+ should eq [:or,
15
+ [:match, [:var, :branch], [:reg, 'foo']],
16
+ [:match, [:var, :tag], [:reg, '^foo$']]
17
+ ]
18
+ end
19
+
20
+ it 'branch =~ /foo/ OR (tag =~ /^foo$/)' do
21
+ should eq [:or,
22
+ [:match, [:var, :branch], [:reg, 'foo']],
23
+ [:match, [:var, :tag], [:reg, '^foo$']]
24
+ ]
25
+ end
26
+ end
27
+
28
+ describe Travis::Conditions::V1::Regex do
29
+ let(:str) { |e| e.description }
30
+ let(:subject) { described_class.new(str).scan }
31
+
32
+ it '^.*-foo$' do
33
+ should eq '^.*-foo$'
34
+ end
35
+
36
+ it '/^.* foo$/' do
37
+ should eq '/^.* foo$/'
38
+ end
39
+
40
+ it '/^(develop|master|release\/.*)$/' do
41
+ should eq '/^(develop|master|release\/.*)$/'
42
+ end
43
+
44
+ it '/^(develop|master|release\/.*|feature\/.*)$/' do
45
+ should eq '/^(develop|master|release\/.*|feature\/.*)$/'
11
46
  end
12
47
  end
data/spec/v1/user_spec.rb CHANGED
@@ -65,7 +65,7 @@ describe Travis::Conditions::V1, 'real conditions' do
65
65
  fork = false
66
66
  not tag =~ ^autobuild
67
67
  tag =~ ''
68
- tag =~ /(^version_code\/)|(^$)/
68
+ tag =~ /(^version_code\\/)|(^$)/
69
69
  tag =~ /^$|\s+/
70
70
  tag =~ [0-9]+\.[0-9]+\.[0-9]+
71
71
  tag =~ ^\d+(\.\d+)+(-.*)?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: travis-conditions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Travis CI
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-26 00:00:00.000000000 Z
11
+ date: 2018-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet
@@ -63,6 +63,7 @@ files:
63
63
  - lib/travis/conditions/v1/eval.rb
64
64
  - lib/travis/conditions/v1/helper.rb
65
65
  - lib/travis/conditions/v1/parser.rb
66
+ - lib/travis/conditions/v1/regex.rb
66
67
  - lib/travis/conditions/version.rb
67
68
  - spec/conditions_spec.rb
68
69
  - spec/spec_helper.rb