dcm 0.0.10 → 0.0.12

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
  SHA256:
3
- metadata.gz: e5f3bbfdbb0284f5b1e4dea4e3428e49049724ee9fc5e059337fccb9f953ec37
4
- data.tar.gz: 52215d5d5ad42b0157d6b6b61110a57b1a2c97a64a3192e59e0ace8ab486868b
3
+ metadata.gz: 7d6c6d8b3341afdbe2ee6d4fbb596409e364844ca8e16552e6b2deb22756609a
4
+ data.tar.gz: 7881fdc1335265a96d70e88121dca3c5cfee693c328b1f8518a9952633e13bca
5
5
  SHA512:
6
- metadata.gz: f157553d0a3d945aa43c90359e540310ecdd38efda40a1644799e28a30eb9a43a31447e5369ac7ce3dd5b9f56b21349ad5c286083cd4ca2ce3364875ae198caf
7
- data.tar.gz: 4f49b2a5aa5280dfef2f4933dc6fcb308e537097a6d28730faf31084a1f8fe78e3bbde5f615f76bc38654f31783c8c0819fbb5e166d8f8c8fea34259b89dba79
6
+ metadata.gz: 246e46a81052ddb1c86a49c529979e7e9134b129b6d68d58756ce319b84453d2b9b9d155e424ff748eaea226ab40774f5f11971ee3a43df36374dd2b2bbbcf7e
7
+ data.tar.gz: aaec1159240e20cc19caf6be99b9f8d62c6c8c04d40441957c6f1d34febc4de28dc069fac4aca833aa795a409524457e533b584af044349b4d2b62e067fbf141
data/lib/cli.rb CHANGED
@@ -11,6 +11,7 @@ require_relative "codinginfo"
11
11
  require_relative "tempfile_handler"
12
12
  require_relative "diff_viewer"
13
13
  require_relative "label_selector"
14
+ require_relative "variant_filter"
14
15
  require_relative "core_ext"
15
16
  require_relative "version"
16
17
 
@@ -40,20 +41,20 @@ module Dcm
40
41
  loop { LabelSelector.choose_from(list) }
41
42
  end
42
43
 
43
- desc "creta2begu ID CODING FILE", "Convert a hierarchical DCM to a flat DCM"
44
- def creta2begu(id, codingpath, file)
44
+ desc "creta2begu FILTER CODING FILE", "Convert a hierarchical DCM to a flat DCM"
45
+ def creta2begu(expr, codingpath, file)
45
46
  list = parse_file(file)
46
47
 
47
- puts Codinginfo.new([id], codingpath)
48
+ puts Codinginfo.new(codingpath, VariantFilter.new(expr))
48
49
  .flatten_list(list)
49
50
  .to_dcm
50
51
  end
51
52
 
52
- desc "begu2creta IDS CODING FILE", "Convert a flat DCM to a hierarchical DCM"
53
- def begu2creta(ids, codingpath, file)
53
+ desc "begu2creta FILTER CODING FILE", "Convert a flat DCM to a hierarchical DCM"
54
+ def begu2creta(expr, codingpath, file)
54
55
  list = parse_file(file)
55
56
 
56
- puts Codinginfo.new(ids.split(","), codingpath)
57
+ puts Codinginfo.new(codingpath, VariantFilter.new(expr))
57
58
  .unflatten_list(list)
58
59
  .to_dcm
59
60
  end
data/lib/codinginfo.rb CHANGED
@@ -25,8 +25,8 @@ class Codinginfo
25
25
  def to_s = "#{name}=#{value}"
26
26
  def ==(other) = name == other.name
27
27
 
28
- def merge(other)
29
- fail "Cannot merge #{name} with #{other.name}" unless self == other
28
+ def combine(other)
29
+ fail "Cannot combine #{name} with #{other.name}" unless self == other
30
30
 
31
31
  self.class.new \
32
32
  name: name,
@@ -47,8 +47,9 @@ class Codinginfo
47
47
  end
48
48
  end
49
49
 
50
- def initialize(ids, filepath)
50
+ def initialize(filepath, filter)
51
51
  @doc = SimpleXlsxReader.open(filepath)
52
+ @filter = filter
52
53
  @headers = []
53
54
  @variants = []
54
55
  @assignments = {}
@@ -56,11 +57,8 @@ class Codinginfo
56
57
  overview_sheet
57
58
  .rows
58
59
  .each do |row|
59
- parse_headers(row) if @headers.empty?
60
- next if @headers.empty?
61
- next if row[1].nil? || row[3].nil?
62
- next unless ids.any? { row[1].match?(/#{_1}/i) }
63
- next unless row[3].match?(/CVAR/)
60
+ next unless headers_parsed?(row)
61
+ next unless filter.match?(@headers, row)
64
62
 
65
63
  @variants << Variant.new(@headers, row)
66
64
  end
@@ -89,21 +87,23 @@ class Codinginfo
89
87
  end
90
88
 
91
89
  def variant
92
- fail "No variant matching #{id} found!" if @variants.empty?
90
+ fail "No variant matching #{@filter} found!" if @variants.empty?
93
91
  fail "More than one variant matching #{id} found!" if @variants.size > 1
94
92
 
95
93
  @variants.first
96
94
  end
97
95
 
98
96
  def unflatten_list(list)
97
+ fail "No variants found matching #{@filter}" if @variants.empty?
98
+
99
99
  Ecu::LabelList.new \
100
100
  list.flat_map { |label|
101
101
  if has_cvar_assignment?(label)
102
- @variants.map { label.with(name: add_cvar_prefix(label, _1)) }
102
+ @variants.map { label.with(name: add_cvar_prefix(label.name, _1)) }
103
103
  else
104
104
  label
105
105
  end
106
- }
106
+ }.uniq
107
107
  end
108
108
 
109
109
  def flatten_list(list)
@@ -124,28 +124,33 @@ class Codinginfo
124
124
  variant.cvars.any? { label.name.match?(_1.label_prefix) }
125
125
  end
126
126
 
127
- def add_cvar_prefix(label, variant)
127
+ def add_cvar_prefix(name, variant)
128
128
  variant
129
129
  .cvars
130
- .find { _1 == @assignments[label.name] }
131
- .then { _1.merge(@assignments[label.name]) }
132
- .then { _1.label_prefix + label.name }
130
+ .find { _1 == @assignments[name] }
131
+ .then { _1.combine(@assignments[name]) }
132
+ .then { _1.label_prefix + name }
133
133
  end
134
134
 
135
135
  def remove_cvar_prefix(name)
136
136
  name.sub(CVAR_PREFIX_REGEXP, "")
137
137
  end
138
138
 
139
- def parse_headers(row)
140
- return unless row[1]&.match?(/SWFK-ID/)
141
- return unless row[1]&.match?(/CVAR_BeguData/)
142
- return unless row[2]&.match?(/Kommentar/)
139
+ def headers_parsed?(row)
140
+ return true if @headers.any?
141
+
142
+ return false unless row[1]&.match?(/SWFK-ID/)
143
+ return false unless row[1]&.match?(/CVAR_BeguData/)
144
+ return false unless row[2]&.match?(/Kommentar/)
143
145
 
144
146
  @headers = row
145
147
  .map(&:chomp)
146
148
  .map(&:lstrip)
147
149
  .map(&:strip)
148
150
  .map { _1.sub(/\n.*/, "") }
149
- .tap { _1[0] = "typestr" }
151
+ .tap { _1[0] = :typestr }
152
+ .tap { _1[1] = :swfk_id }
153
+ .tap { _1[4] = :typekey }
154
+ .tap { _1[6] = :devkey }
150
155
  end
151
156
  end
@@ -0,0 +1,27 @@
1
+ module Dcm
2
+ class VariantFilter
3
+ ALLOWED_FILTERKEYS = %w(swfk_id typekey devkey)
4
+
5
+ attr_reader :key, :matchers
6
+ def initialize(expr)
7
+ unless expr.match?(/^[\w_]+\:/) && ALLOWED_FILTERKEYS.include?(expr.split(":").first)
8
+ fail "Unknown filter expression #{expr}. "
9
+ "Syntax: (#{ALLOWED_FILTERKEYS.join("|")}):value[,value2]."
10
+ end
11
+
12
+ key, matchers = expr.split(":")
13
+ @key = key.to_sym
14
+ @matchers = matchers.split(",").map { /#{_1}/i }
15
+ end
16
+
17
+ def match?(headers, row)
18
+ return false unless row[3]
19
+ return false unless row[3].match?(/CVAR/)
20
+ return false unless headers.include?(@key)
21
+
22
+ matchers.any? { row[headers.index(@key)].match?(_1) }
23
+ end
24
+
25
+ def to_s = "<Filter #{key}:#{matchers.join(",")}"
26
+ end
27
+ end
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dcm
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.12"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dcm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Mueller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-11-09 00:00:00.000000000 Z
11
+ date: 2024-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: automotive-ecu
@@ -84,6 +84,7 @@ files:
84
84
  - lib/list_colorizer.rb
85
85
  - lib/selecta.rb
86
86
  - lib/tempfile_handler.rb
87
+ - lib/variant_filter.rb
87
88
  - lib/version.rb
88
89
  homepage: https://sr.ht/~muellerj/dcm
89
90
  licenses: