tweek 1.2.0 → 1.2.1
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 +4 -4
- data/lib/tweek/entry.rb +139 -0
- data/lib/tweek/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1e291275563c2896f9c59ee25c11486e0a891f7
|
4
|
+
data.tar.gz: e97cac8c95c5beda3dc9ec48a3c4ea418c5d6bbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49c42da3fcfa156d2f12cd6fdf561fb2a010982f7e272ec45ec00d49f7f829021606cd8f26bd78679791ad8c58125ff360118ce2a9a5a69890b7c9432ea6e59e
|
7
|
+
data.tar.gz: b2c84d89a856596c074c941e757d047b902877a4a4ad513ca0b22e42bc88fb4f196b0140e9fd0cb4aececd9200f3a746648899520c3fa8c345a36b5080f1fc8e
|
data/lib/tweek/entry.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
# A tweek file consists of lines represented by Tweek::Entry
|
2
|
+
#
|
3
|
+
# All of the entries in the file have a line number and optional comment
|
4
|
+
# other attributes depend on the specific type.
|
5
|
+
#
|
6
|
+
# Lifecycle: An entry is created either directly or parsed from an input line,
|
7
|
+
# then the 'condfail' method is called to see if it's relevant, if so
|
8
|
+
# the actual values are filled in according to the section. Then the 'mismatch'
|
9
|
+
# method can be used to see if it matched. Finally the 'generate' method
|
10
|
+
# produces a human-readable output
|
11
|
+
#
|
12
|
+
require 'ostruct'
|
13
|
+
|
14
|
+
class Tweek::Entry < OpenStruct
|
15
|
+
|
16
|
+
# Not all entries are settable: record if this entry was used to set/reset a value or not
|
17
|
+
attr_accessor :mode
|
18
|
+
|
19
|
+
# The type of this entry:
|
20
|
+
# :literal With line attributes - single lines
|
21
|
+
# :section With section type and list attributes
|
22
|
+
# :parameter With parameter value and conditional attributes
|
23
|
+
#
|
24
|
+
attr_reader :type
|
25
|
+
|
26
|
+
def initialize section, type, h
|
27
|
+
raise "Invalid Entry type #{type}" unless [:literal, :parameter, :section].include? type
|
28
|
+
super h
|
29
|
+
@section = section
|
30
|
+
@type = type
|
31
|
+
@mode = :query
|
32
|
+
@condfail = nil
|
33
|
+
@mismatch = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
# Parse an input line
|
37
|
+
#
|
38
|
+
def self.parse section, line
|
39
|
+
|
40
|
+
line.chomp!
|
41
|
+
comment = line.slice!(/#.*$/)
|
42
|
+
comment.slice!(/^#\s*/) if comment
|
43
|
+
entry = case
|
44
|
+
when line.empty?
|
45
|
+
Tweek::Entry.new( section, :literal, :line => line, :comment => comment )
|
46
|
+
|
47
|
+
when /^\s*([A-Z0-9]+)\s*(.*?)\s*$/ =~ line # We've hit a new section
|
48
|
+
Tweek::Entry.new( section, :section, :section_type => $1.to_sym, :list => $2,
|
49
|
+
:comment => comment )
|
50
|
+
|
51
|
+
when /^\s*(.+?)\s*=\s*(.*?)\s*(\bif\b(.*))?$/ =~ line # A parameter line
|
52
|
+
param = $1
|
53
|
+
value = $2
|
54
|
+
raise "Missing condition after 'if'" if $4 and $4.strip.empty?
|
55
|
+
cond = $4.nil? ? nil : $4.strip
|
56
|
+
was = /\s*\[was\s+(.*)\]/.match(comment)
|
57
|
+
if was
|
58
|
+
comment = was.pre_match+was.post_match
|
59
|
+
was = was.captures.first
|
60
|
+
end
|
61
|
+
expected = /\s*\[expected\s+(.*)\]/.match(comment)
|
62
|
+
if expected
|
63
|
+
comment = expected.pre_match+was.post_match
|
64
|
+
expected = expected.captures.first
|
65
|
+
end
|
66
|
+
comment = nil if comment and comment.empty?
|
67
|
+
Tweek::Entry.new( section, :parameter, :param => param, :value => value,
|
68
|
+
:cond => cond, :comment => comment,
|
69
|
+
:was => was, :expected => expected )
|
70
|
+
else
|
71
|
+
raise "Unrecognized line"
|
72
|
+
end
|
73
|
+
return entry
|
74
|
+
end
|
75
|
+
|
76
|
+
# Check if any associated condition is true or false
|
77
|
+
#
|
78
|
+
def condfail
|
79
|
+
@condfail ||= @section.twf.condfail(cond)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Check if the entry matches reality
|
83
|
+
#
|
84
|
+
def mismatch
|
85
|
+
raise "Value or Actual missing! Can't check for mismatch" if value.nil? or actual.nil?
|
86
|
+
@mismatch ||= !(value === actual)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Generate an output line for this entry
|
90
|
+
#
|
91
|
+
def generate
|
92
|
+
|
93
|
+
outline = nil
|
94
|
+
|
95
|
+
case self.type
|
96
|
+
|
97
|
+
when :literal
|
98
|
+
outline = line
|
99
|
+
outline += "# #{comment}" if comment
|
100
|
+
|
101
|
+
when :section
|
102
|
+
if section_type.nil?
|
103
|
+
outline = nil
|
104
|
+
else
|
105
|
+
name = list_element || list
|
106
|
+
outline = "#{section_type} #{name} #{comment}"
|
107
|
+
end
|
108
|
+
|
109
|
+
when :parameter
|
110
|
+
condout = cond.nil? ? "": " if #{cond}"
|
111
|
+
if condfail
|
112
|
+
body = "#{param} = #{value}#{condout.colorize(:red)}"
|
113
|
+
note = nil
|
114
|
+
else
|
115
|
+
swap! if mode != :query
|
116
|
+
if mismatch
|
117
|
+
body = "#{param} = #{actual.colorize(:red)}#{condout.colorize(:green)}"
|
118
|
+
note = " [#{mode != :query ? 'was' : 'expected'} #{value.colorize(:yellow)}]"
|
119
|
+
else
|
120
|
+
body = "#{param} = #{actual}#{condout.colorize(:green)}"
|
121
|
+
note = nil
|
122
|
+
end
|
123
|
+
end
|
124
|
+
if comment.nil?
|
125
|
+
outline = (note ? (body + " #" + note) : body)
|
126
|
+
else
|
127
|
+
outline = (note ? (body + " # " + comment + note) : (body + " # " + comment))
|
128
|
+
end
|
129
|
+
end
|
130
|
+
return outline
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
# Method to toggle the actual and expected values, used for :query, :set, :reset
|
135
|
+
def swap!
|
136
|
+
self.actual, self.value = self.value, self.actual
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
data/lib/tweek/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tweek
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Townsend
|
@@ -79,6 +79,7 @@ files:
|
|
79
79
|
- README.md
|
80
80
|
- bin/tweek
|
81
81
|
- lib/tweek.rb
|
82
|
+
- lib/tweek/entry.rb
|
82
83
|
- lib/tweek/file.rb
|
83
84
|
- lib/tweek/section.rb
|
84
85
|
- lib/tweek/version.rb
|