lens_protocol 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +2 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +16 -4
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +1 -3
  7. data/Gemfile.lock +47 -34
  8. data/README.md +2 -2
  9. data/examples/oma/R1000_1.oma +213 -213
  10. data/examples/oma/R1000_2.oma +213 -213
  11. data/examples/oma/STHKFMT.oma +358 -0
  12. data/lens_protocol.gemspec +2 -2
  13. data/lib/lens_protocol/errors.rb +3 -0
  14. data/lib/lens_protocol/oma/builder.rb +18 -0
  15. data/lib/lens_protocol/oma/formatter.rb +10 -2
  16. data/lib/lens_protocol/oma/line.rb +16 -0
  17. data/lib/lens_protocol/oma/message.rb +5 -59
  18. data/lib/lens_protocol/oma/parser.rb +17 -9
  19. data/lib/lens_protocol/oma/record.rb +0 -1
  20. data/lib/lens_protocol/oma/types/array.rb +21 -0
  21. data/lib/lens_protocol/oma/types/chiral.rb +31 -0
  22. data/lib/lens_protocol/oma/types/ignored.rb +15 -0
  23. data/lib/lens_protocol/oma/types/matrix.rb +17 -0
  24. data/lib/lens_protocol/oma/types/single.rb +21 -0
  25. data/lib/lens_protocol/oma/types/trcfmt.rb +77 -0
  26. data/lib/lens_protocol/oma/types/type.rb +74 -0
  27. data/lib/lens_protocol/oma/types/values/tracing_dataset.rb +42 -0
  28. data/lib/lens_protocol/oma/types.rb +81 -79
  29. data/lib/lens_protocol/oma.rb +1 -1
  30. data/lib/lens_protocol/version.rb +1 -1
  31. data/lib/lens_protocol.rb +10 -6
  32. data/shell.nix +9 -0
  33. metadata +27 -21
  34. data/lib/lens_protocol/oma/type/base.rb +0 -97
  35. data/lib/lens_protocol/oma/type/integer.rb +0 -15
  36. data/lib/lens_protocol/oma/type/numeric.rb +0 -24
  37. data/lib/lens_protocol/oma/type/r.rb +0 -17
  38. data/lib/lens_protocol/oma/type/text.rb +0 -8
  39. data/lib/lens_protocol/oma/type/trcfmt.rb +0 -30
@@ -0,0 +1,358 @@
1
+ OMAV=03.10
2
+ ACCN=999999
3
+ ADD=1.75;1.75
4
+ AVAL=13.80;13.80
5
+ AX=65;135
6
+ BACK=84.19;84.19
7
+ BCDRPIN=0.00;0.00
8
+ BCDRPUP=8.00;8.00
9
+ BCERIN=0.0;0.0
10
+ BCERUP=0.0;0.0
11
+ BCNRPIN=2.50;2.50
12
+ BCNRPUP=-13.00;-13.00
13
+ BCOCIN=0.00;0.00
14
+ BCOCUP=0.00;0.00
15
+ BCSBIN=0.00;0.00
16
+ BCSBUP=0.00;0.00
17
+ BCSGIN=0.00;0.00
18
+ BCSGUP=4.00;4.00
19
+ BCTHK=12.80;12.80
20
+ BETHK=14.70;14.70
21
+ BEVM=35.00;35.00
22
+ BEVP=2;2
23
+ BLKD=63.0;63.0
24
+ CBUMP=6.00;6.00
25
+ CIRC=151.761;151.761
26
+ CLIENT=11372
27
+ CLNAME=11372
28
+ CORRLEN=17;17
29
+ CRIB=70;70
30
+ CRIBFMTOK=0
31
+ CTHICK=4.90;4.40
32
+ CYL=-0.75;-0.75
33
+ DBL=19.00
34
+ DIA=80;80
35
+ DO=B
36
+ ERDRIN=0.00;0.00
37
+ ERDRUP=8.00;8.00
38
+ ERNRIN=3.50;3.50
39
+ ERNRUP=-13.00;-13.00
40
+ ETYP=1
41
+ FCBCIN=2.80;2.80
42
+ FCBCUP=0.00;0.40
43
+ FCOCIN=7.0;8.0
44
+ FCOCUP=-1.5;-1.5
45
+ FCRV=0;0
46
+ FCSGIN=6.98;7.98
47
+ FCSGUP=2.50;2.50
48
+ FED=59;59
49
+ FINCMP=0.20;0.20
50
+ FMFR=TST
51
+ FPINB=0.00;0.00
52
+ FRAM=4
53
+ FRNT=85.68;85.68
54
+ FTYP=2
55
+ FUPC=4
56
+ GAX=0;0
57
+ GBASE=-3.31;-3.81
58
+ GBASEX=-3.292;-3.805
59
+ GCROS=-4.25;-4.81
60
+ GCROSX=-4.243;-4.780
61
+ GTHK=4.90;4.40
62
+ HBOX=54.96;54.96
63
+ INSADD=1.77;1.78
64
+ INSAX=65.00;135.00
65
+ INSCTHK=4.96;4.47
66
+ INSCYL=-0.75;-0.75
67
+ INSDRAX=65.00;135.00
68
+ INSDRCYL=-0.75;-0.75
69
+ INSDRSPH=2.50;2.00
70
+ INSNRAX=60.00;139.00
71
+ INSNRCYL=-0.73;-0.79
72
+ INSNRSPH=4.26;3.80
73
+ INSPRPRVA=270;270
74
+ INSPRPRVM=0.12;0.12
75
+ INSSPH=2.50;2.00
76
+ IPD=30.00;29.00
77
+ JOB=L438942100
78
+ KPRVA=338;194
79
+ KPRVM=1.03;1.02
80
+ LDADD=1.77;1.78
81
+ LDDRAX=65;135
82
+ LDDRCYL=-0.75;-0.75
83
+ LDDRSPH=2.50;2.00
84
+ LDNAM=C85900;C85900
85
+ LDNRAX=60;139
86
+ LDNRCYL=-0.73;-0.79
87
+ LDNRSPH=4.26;3.80
88
+ LDPATH=00L438942100R.stf;00L438942100L.stf
89
+ LDPRVA=270;270
90
+ LDPRVM=0.12;0.12
91
+ LDVEN=essilor;essilor
92
+ LIND=1.498;1.498
93
+ LMATID=47;47
94
+ LMATTYPE=1;1
95
+ LMFR=ESSILOR;ESSILOR
96
+ LNAM=2590;2590
97
+ LTYP=PR;PR
98
+ LTYPE=PR FF;PR FF
99
+ LTYPEB=PR FF;PR FF
100
+ LTYPEF=SV;SV
101
+ MADD=0.00;0.00
102
+ MBASE=6.25;6.25
103
+ MINCTR=4.85;4.35
104
+ MINEDG=1.60;1.60
105
+ MINTHKCD=0.60;0.60
106
+ OCHT=22.00;22.00
107
+ OPC=0192301885;0192301885
108
+ OTHK=4.96;4.47
109
+ PHOTO=0
110
+ PINB=0.25;0.25
111
+ PIND=1.498;1.498
112
+ POLAR=0
113
+ POLISH=1
114
+ PTOK=1
115
+ PTPRVA=270;270
116
+ PTPRVM=0.12;0.12
117
+ REM=lo mas fino y estetico posible
118
+ RNGD=63.0;63.0
119
+ RNGH=5.3;5.3
120
+ RPRVA=173;-3
121
+ RPRVM=-1.28;-1.25
122
+ RXNM=10671905
123
+ SBBCIN=2.5;-2.5
124
+ SBBCUP=0.0;0.0
125
+ SBFCIN=0.00;0.00
126
+ SBFCUP=0.00;0.00
127
+ SBOCIN=4.20;5.20
128
+ SBOCUP=-1.50;-1.90
129
+ SBSGIN=7.00;8.00
130
+ SBSGUP=2.50;2.50
131
+ SGOCIN=0.00;0.00
132
+ SGOCUP=-4.00;-4.00
133
+ SPH=2.50;2.00
134
+ STATUS=0
135
+ STHKFMT=1;72;E;R
136
+ R=2574;2659;2745;2838;2891;2846;2741;2594;2460;2344
137
+ R=2245;2161;2090;2037;1997;1977;1961;1949;1940;1957
138
+ R=1979;2015;2062;2127;2209;2305;2416;2541;2684;2814
139
+ R=2918;2946;2903;2845;2775;2712;2655;2602;2549;2504
140
+ R=2458;2410;2364;2324;2281;2237;2192;2147;2104;2064
141
+ R=2029;2001;1977;1958;1943;1940;1942;1947;1955;1970
142
+ R=1993;2018;2044;2074;2107;2146;2189;2236;2288;2350
143
+ R=2420;2495
144
+ T=0346;0338;0327;0313;0300;0293;0293;0297;0304;0311
145
+ T=0315;0318;0321;0322;0324;0324;0322;0321;0318;0317
146
+ T=0314;0309;0304;0297;0289;0279;0266;0250;0230;0208
147
+ T=0187;0174;0173;0177;0183;0188;0191;0193;0195;0194
148
+ T=0194;0194;0195;0196;0201;0207;0216;0227;0238;0250
149
+ T=0263;0275;0287;0299;0309;0319;0328;0337;0343;0349
150
+ T=0354;0358;0361;0363;0364;0365;0365;0365;0365;0361
151
+ T=0359;0354
152
+ STHKFMT=1;72;E;L
153
+ R=2655;2712;2775;2845;2903;2946;2918;2814;2684;2541
154
+ R=2416;2305;2209;2127;2062;2015;1979;1957;1940;1949
155
+ R=1961;1977;1997;2037;2090;2161;2245;2344;2460;2594
156
+ R=2741;2846;2891;2838;2745;2659;2574;2495;2420;2350
157
+ R=2288;2236;2189;2146;2107;2074;2044;2018;1993;1970
158
+ R=1955;1947;1942;1940;1943;1958;1977;2001;2029;2064
159
+ R=2104;2147;2192;2237;2281;2324;2364;2410;2458;2504
160
+ R=2549;2602
161
+ T=0164;0165;0165;0165;0167;0174;0192;0213;0234;0252
162
+ T=0266;0278;0286;0293;0299;0302;0306;0308;0308;0310
163
+ T=0311;0311;0310;0308;0306;0303;0300;0295;0288;0282
164
+ T=0276;0273;0277;0288;0300;0309;0317;0324;0329;0332
165
+ T=0336;0337;0338;0339;0339;0338;0336;0334;0330;0325
166
+ T=0319;0312;0303;0294;0282;0272;0259;0246;0233;0220
167
+ T=0207;0195;0183;0174;0167;0162;0161;0160;0160;0161
168
+ T=0163;0163
169
+ SVAL=5.86;5.35
170
+ SWIDTH=0.0;0.0
171
+ TEXT_11= ;
172
+ TEXT_12= ;
173
+ TEXT_13= ;
174
+ TEXT_14= ;
175
+ TEXT_15= ;
176
+ TEXT_16= ;
177
+ THKA=355;190
178
+ THKP=2.78;2.67
179
+ THKR=35.00;35.00
180
+ THNA=240;305
181
+ THNP=0.11;0.14
182
+ THNR=35.00;35.00
183
+ TIND=1.530;1.530
184
+ TRCFMT=1;360;E;R;F
185
+ R=2574;2591;2609;2626;2642;2659;2676;2693;2709;2727
186
+ R=2745;2764;2782;2801;2820;2838;2857;2873;2881;2888
187
+ R=2891;2886;2881;2872;2859;2846;2830;2812;2794;2768
188
+ R=2741;2714;2683;2653;2623;2594;2565;2537;2511;2485
189
+ R=2460;2436;2413;2390;2367;2344;2323;2302;2282;2263
190
+ R=2245;2227;2210;2193;2177;2161;2145;2130;2116;2102
191
+ R=2090;2079;2068;2057;2047;2037;2027;2017;2009;2003
192
+ R=1997;1992;1988;1984;1980;1977;1973;1970;1967;1964
193
+ R=1961;1959;1956;1954;1952;1949;1947;1945;1943;1941
194
+ R=1940;1943;1947;1950;1954;1957;1961;1965;1969;1974
195
+ R=1979;1985;1991;1999;2006;2015;2024;2033;2043;2052
196
+ R=2062;2073;2083;2096;2112;2127;2143;2159;2175;2192
197
+ R=2209;2226;2245;2264;2283;2305;2326;2348;2370;2393
198
+ R=2416;2439;2463;2489;2515;2541;2569;2597;2626;2655
199
+ R=2684;2712;2739;2766;2791;2814;2837;2859;2880;2901
200
+ R=2918;2934;2948;2948;2949;2946;2938;2930;2922;2912
201
+ R=2903;2893;2882;2871;2858;2845;2832;2818;2803;2789
202
+ R=2775;2760;2747;2735;2723;2712;2701;2690;2678;2667
203
+ R=2655;2644;2633;2623;2612;2602;2591;2580;2569;2559
204
+ R=2549;2540;2531;2522;2513;2504;2495;2486;2477;2467
205
+ R=2458;2449;2439;2429;2420;2410;2400;2391;2381;2373
206
+ R=2364;2356;2348;2340;2332;2324;2315;2307;2298;2290
207
+ R=2281;2272;2263;2255;2246;2237;2228;2219;2210;2201
208
+ R=2192;2183;2174;2164;2155;2147;2138;2129;2121;2112
209
+ R=2104;2095;2087;2079;2071;2064;2056;2049;2042;2035
210
+ R=2029;2023;2017;2012;2006;2001;1995;1991;1986;1981
211
+ R=1977;1972;1968;1965;1961;1958;1954;1951;1948;1946
212
+ R=1943;1942;1941;1940;1940;1940;1940;1940;1941;1941
213
+ R=1942;1943;1944;1945;1946;1947;1948;1949;1951;1953
214
+ R=1955;1957;1959;1962;1966;1970;1975;1979;1984;1989
215
+ R=1993;1998;2003;2008;2013;2018;2023;2028;2034;2039
216
+ R=2044;2050;2055;2061;2067;2074;2080;2087;2094;2101
217
+ R=2107;2114;2122;2129;2137;2146;2154;2163;2171;2180
218
+ R=2189;2198;2207;2216;2226;2236;2246;2257;2267;2278
219
+ R=2288;2299;2311;2322;2336;2350;2364;2378;2392;2406
220
+ R=2420;2435;2449;2465;2480;2495;2511;2526;2542;2558
221
+ TRCFMT=1;360;E;L;F
222
+ R=2655;2667;2678;2690;2701;2712;2723;2735;2747;2760
223
+ R=2775;2789;2803;2818;2832;2845;2858;2871;2882;2893
224
+ R=2903;2912;2922;2930;2938;2946;2949;2948;2948;2934
225
+ R=2918;2901;2880;2859;2837;2814;2791;2766;2739;2712
226
+ R=2684;2655;2626;2597;2569;2541;2515;2489;2463;2439
227
+ R=2416;2393;2370;2348;2326;2305;2283;2264;2245;2226
228
+ R=2209;2192;2175;2159;2143;2127;2112;2096;2083;2073
229
+ R=2062;2052;2043;2033;2024;2015;2006;1999;1991;1985
230
+ R=1979;1974;1969;1965;1961;1957;1954;1950;1947;1943
231
+ R=1940;1941;1943;1945;1947;1949;1952;1954;1956;1959
232
+ R=1961;1964;1967;1970;1973;1977;1980;1984;1988;1992
233
+ R=1997;2003;2009;2017;2027;2037;2047;2057;2068;2079
234
+ R=2090;2102;2116;2130;2145;2161;2177;2193;2210;2227
235
+ R=2245;2263;2282;2302;2323;2344;2367;2390;2413;2436
236
+ R=2460;2485;2511;2537;2565;2594;2623;2653;2683;2714
237
+ R=2741;2768;2794;2812;2830;2846;2859;2872;2881;2886
238
+ R=2891;2888;2881;2873;2857;2838;2820;2801;2782;2764
239
+ R=2745;2727;2709;2693;2676;2659;2642;2626;2609;2591
240
+ R=2574;2558;2542;2527;2511;2495;2480;2465;2449;2435
241
+ R=2420;2406;2392;2378;2364;2350;2336;2322;2311;2299
242
+ R=2288;2278;2267;2257;2246;2236;2226;2216;2207;2198
243
+ R=2189;2180;2171;2163;2154;2146;2137;2129;2122;2114
244
+ R=2107;2101;2094;2087;2080;2074;2067;2061;2055;2050
245
+ R=2044;2039;2034;2028;2023;2018;2013;2008;2003;1998
246
+ R=1993;1989;1984;1979;1975;1970;1966;1962;1959;1957
247
+ R=1955;1953;1951;1949;1948;1947;1946;1945;1944;1943
248
+ R=1942;1941;1941;1940;1940;1940;1940;1940;1941;1942
249
+ R=1943;1946;1948;1951;1954;1958;1961;1965;1968;1972
250
+ R=1977;1981;1986;1991;1995;2001;2006;2012;2017;2023
251
+ R=2029;2035;2042;2049;2056;2064;2071;2079;2087;2095
252
+ R=2104;2112;2121;2129;2138;2147;2155;2164;2174;2183
253
+ R=2192;2201;2210;2219;2228;2237;2246;2255;2263;2272
254
+ R=2281;2290;2298;2307;2315;2324;2332;2340;2348;2356
255
+ R=2364;2373;2381;2391;2400;2410;2420;2429;2439;2449
256
+ R=2458;2467;2477;2486;2495;2504;2513;2522;2531;2540
257
+ R=2549;2559;2569;2580;2591;2602;2612;2623;2633;2644
258
+ UNI=0;0
259
+ VBOX=39.01;39.01
260
+ VEN=MODVCA
261
+ XSTATUS=R;1110;External module returns warning;W
262
+ XSTATUS=L;1110;External module returns warning;W
263
+ _ADDENGCODE=J2688;J2688
264
+ _BACK=84.190;84.190
265
+ _BATORIC=0
266
+ _BLKINSC=azul0;azul0
267
+ _BLKRNG=0063;0063
268
+ _CALCMODE=AUTO;AUTO
269
+ _COMMENT=lo mas fino y estetico posible
270
+ _CRIBBC=65;65
271
+ _CRIBTYPE=R;R
272
+ _CTO=1;1
273
+ _DENSITY=1.3;1.3
274
+ _DIA2=80;80
275
+ _DIAPHYS=80;80
276
+ _DIASALES=77;78
277
+ _DIASB=80;80
278
+ _DIGIT=257;275;289;274;246;225;209;200;196;194;198;206;221;242;268;292;290;278;266;255;246;236;228;219;210;203;198;194;194;196;199;204;211;219;229;242;
279
+ _DLP1=010702501112000000;010702501112000000
280
+ _DLP1DM=070;070
281
+ _DLP1TYP=01;01
282
+ _DLP2=000702500000000000;000702500000000000
283
+ _DLP2DM=070;070
284
+ _DLP2TYP=00;00
285
+ _DLP3=000702500000000000;000702500000000000
286
+ _DLP3DM=070;070
287
+ _DLP3TYP=00;00
288
+ _DOBLEND=0
289
+ _DODECENTER=0
290
+ _EDI=0
291
+ _EID=10671905
292
+ _ENTRYDATE=20200303
293
+ _ENTRYTIME=16:28:22
294
+ _ENTRYTYPE=I
295
+ _ENVELOPE=,;,
296
+ _FININKCODE=C324;C324
297
+ _FORCEDBATORIC=0
298
+ _FRNT=85.680;85.680
299
+ _FRONTTORIC=0
300
+ _GBASEX=-3.093;-3.575
301
+ _GCROSX=-3.987;-4.491
302
+ _GPRVA=338;194
303
+ _GPRVM=1.03;1.02
304
+ _JOBX=10671905
305
+ _LDESC=Varilux Comfort DS Orma;Varilux Comfort DS Orma
306
+ _LDS_CTHICK=4.90;4.40
307
+ _LDS_STHKA=322.00;221.00
308
+ _LDS_STHKP=4.30;4.00
309
+ _LDS_STHNA=157.00;348.00
310
+ _LDS_STHNP=2.30;2.20
311
+ _LENSGROUP=PR;PR
312
+ _LENTIOPT=0
313
+ _LMATID2=47;47
314
+ _LMATID3=47;47
315
+ _LMATID4=47;47
316
+ _LNAM=2590;2590
317
+ _MARGIN=3.00;3.00
318
+ _MATCHCRIB=0
319
+ _MATCODE=ORN498;ORN498
320
+ _MATTYPE=OR;OR
321
+ _MAXSAGR=121.249;107.888
322
+ _MAXSAGV=51.6;58.3
323
+ _MBASEACT=1;1
324
+ _MINSAGR=228.963;183.188
325
+ _MINSAGV=26.9;33.7
326
+ _MINSUM=3.80;3.80
327
+ _NOCALC=0
328
+ _OCONTROLS= 0 1 ; 0 1
329
+ _OMITADD=0
330
+ _ORDTYPE=I
331
+ _PHOTO=N;N
332
+ _PRINTLOCAL=0
333
+ _PROCESS=Essilor
334
+ _PRPON=1;1
335
+ _RECTYPE=F
336
+ _RNGZ=7.035;7.035
337
+ _SCSBCCA=0.00;0.00
338
+ _SCSBRD=0.00;0.00
339
+ _SHEIGHT=0.0;0.0
340
+ _SLABOFF=0
341
+ _SPORT=0
342
+ _STHKB=3.79;3.48
343
+ _STHKI=4.18;3.83
344
+ _STHKO=2.60;2.29
345
+ _STHKT=3.89;3.73
346
+ _STOCKRX=R;R
347
+ _SUPRAD=0.00;0.00
348
+ _SURFACE1=SP;SP
349
+ _SURFACE2=FP;FP
350
+ _THKA=325;220
351
+ _THKP=4.36;4.05
352
+ _THKR=19.47;19.52
353
+ _THNA=160;340
354
+ _THNP=2.42;2.25
355
+ _THNR=31.80;27.21
356
+ _USER=VCA
357
+ _VARINSET=0
358
+ _XCALC=ESS;ESS
@@ -24,10 +24,10 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency 'activesupport', '>= 4.0'
25
25
  spec.add_dependency 'nokogiri'
26
26
  spec.add_development_dependency "bundler", "~> 2.0"
27
- spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "rake", "~> 13.0"
28
28
  spec.add_development_dependency "rspec", "~> 3.0"
29
29
  spec.add_development_dependency "guard-rspec"
30
30
  spec.add_development_dependency 'pry'
31
- spec.add_development_dependency 'pry-byebug'
32
31
  spec.add_development_dependency 'sinatra'
32
+ spec.add_development_dependency 'rubocop', '~> 0.80.0'
33
33
  end
@@ -7,4 +7,7 @@ module LensProtocol
7
7
  super "#{msg}\n Line: #{line}"
8
8
  end
9
9
  end
10
+
11
+ class ValidationError < Error
12
+ end
10
13
  end
@@ -0,0 +1,18 @@
1
+ module LensProtocol
2
+ module OMA
3
+ class Builder
4
+ def build hash, types: {}
5
+ types = TYPES.merge(types)
6
+
7
+ hash.reduce Message.new do |message, (label, value)|
8
+ wrapped_value = types[label].wrap(value, hash, label)
9
+ if wrapped_value == :ignored
10
+ message
11
+ else
12
+ message.add_record(label, wrapped_value)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -13,10 +13,18 @@ module LensProtocol
13
13
 
14
14
  def format_lines message, types: {}
15
15
  types = TYPES.merge(types)
16
- message.records.values.flat_map do |record|
17
- types[record.label].format(record, message)
16
+ message.records.flat_map do |label, record|
17
+ format_record label, record.value, types
18
18
  end
19
19
  end
20
+
21
+ private
22
+
23
+ def format_record label, value, types
24
+ lines = types[label].format(label, value)
25
+ lines = lines.is_a?(Array) ? lines : [lines]
26
+ lines.map &:to_s
27
+ end
20
28
  end
21
29
  end
22
30
  end
@@ -0,0 +1,16 @@
1
+ module LensProtocol
2
+ module OMA
3
+ Line = Struct.new(:label, :data, :raw, keyword_init: true) do
4
+ def self.parse raw_line
5
+ raise ParsingError.new('The label separator is missing', raw_line) unless raw_line.include?('=')
6
+
7
+ label, data = raw_line.split('=', -1)
8
+ Line.new label: label, data: data, raw: raw_line
9
+ end
10
+
11
+ def to_s
12
+ "#{label}=#{data}"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -4,15 +4,12 @@ module LensProtocol
4
4
  attr_reader :records
5
5
 
6
6
  # Builds a message from a hash of record labels to record value.
7
- def self.from_hash hash
8
- hash.reduce new do |message, (label, value)|
9
- message.add_record(label, value)
10
- end
7
+ def self.from_hash *args
8
+ OMA.generate *args
11
9
  end
12
10
 
13
- def initialize records: {}, context: {}
11
+ def initialize records: {}
14
12
  @records = records
15
- @context = context
16
13
  end
17
14
 
18
15
  def add_record label, value
@@ -20,29 +17,6 @@ module LensProtocol
20
17
  self
21
18
  end
22
19
 
23
- def add_record_or_insert_values label, values
24
- @records[label] ||= Record.new(label: label, value: [])
25
- @records[label].value << values
26
- self
27
- end
28
-
29
- def add_record_or_concat_values label, values
30
- @records[label] ||= Record.new(label: label, value: [])
31
- @records[label].value.concat values
32
- self
33
- end
34
-
35
- def add_record_side_values label, side, values
36
- @records[label] ||= Record.new(label: label, value: [[], []])
37
- @records[label].value[side].concat values
38
- self
39
- end
40
-
41
- def set_context key, value
42
- @context[key] = value
43
- self
44
- end
45
-
46
20
  def value_of label, default = nil
47
21
  if include? label
48
22
  @records[label].value
@@ -60,46 +34,18 @@ module LensProtocol
60
34
  @records.empty?
61
35
  end
62
36
 
63
- def context key
64
- @context[key]
65
- end
66
-
67
37
  def to_hash
68
38
  Hash[*@records.flat_map { |label, record| [label, record.value] }]
69
39
  end
70
40
 
71
- # Returns the "R" reconds decoded radiuses according to the tracing format.
72
- def radius_data
73
- return [] unless value_of('TRCFMT') && value_of('R')
74
- [0, 1].map do |side|
75
- format_number, = value_of('TRCFMT')[side]
76
- case format_number.to_i
77
- when 0 # side not present
78
- []
79
- when 1 # ASCII format
80
- value_of('R')[side]
81
- else # unknown format
82
- return []
83
- end
84
- end
85
- end
86
-
87
41
  # Converts the "R" record values to polar coordinates.
88
42
  def tracing_in_polar_coordinates
89
- radius_data.map { |radiuses| radiuses_to_polar radiuses }
90
- end
91
-
92
- def radiuses_to_polar radiuses
93
- radiuses.map.with_index { |r, i| [i * 2 * Math::PI / radiuses.size, r] }
43
+ value_of('TRCFMT', []).map { |tracing_dataset| tracing_dataset&.in_polar_coordinates || [] }
94
44
  end
95
45
 
96
46
  # Converts the "R" record values to rectangular coordinates.
97
47
  def tracing_in_rectangular_coordinates
98
- radius_data.map { |radiuses| radiuses_to_rectangular radiuses }
99
- end
100
-
101
- def radiuses_to_rectangular radiuses
102
- radiuses_to_polar(radiuses).map { |(a, r)| [r * Math.cos(a), r * Math.sin(a)].map { |v| v.round 2 } }
48
+ value_of('TRCFMT', []).map { |tracing_dataset| tracing_dataset&.in_rectangular_coordinates || [] }
103
49
  end
104
50
 
105
51
  # Returns an array of SVG strings, one for each side. If the tracing format is not recognized
@@ -3,22 +3,30 @@ module LensProtocol
3
3
  class Parser
4
4
  def parse oma_str, types: {}
5
5
  types = TYPES.merge(types)
6
- normalize_line_endings(oma_str)
7
- .split("\n")
8
- .reduce(Message.new) { |message, line| parse_line line, message, types }
6
+ lines = convert_to_structured_lines normalize_line_endings(oma_str).split("\n")
7
+ parse_lines lines, types, Message.new
9
8
  end
10
9
 
11
10
  private
12
11
 
13
- def parse_line line, message, types
14
- raise ParsingError.new('The label separator is missing', line) unless line.include?('=')
15
- label, = line.split('=')
16
- types[label].parse(line, message)
17
- end
18
-
19
12
  def normalize_line_endings str
20
13
  str.to_s.gsub /\r\n?/, "\n"
21
14
  end
15
+
16
+ def convert_to_structured_lines lines
17
+ lines.map { |line| Line.parse line }
18
+ end
19
+
20
+ def parse_lines lines, types, message
21
+ line, *next_lines = lines
22
+ if line
23
+ value, next_lines = types[line.label].parse(line, next_lines)
24
+ message.add_record(line.label, value) if value
25
+ parse_lines next_lines, types, message
26
+ else
27
+ message
28
+ end
29
+ end
22
30
  end
23
31
  end
24
32
  end
@@ -3,7 +3,6 @@ module LensProtocol
3
3
  class Record
4
4
  attr_reader :label
5
5
 
6
- # May hold a single value, an array of values (on multi-value and chiral records), or an array of array of values (in R records for example)
7
6
  attr_reader :value
8
7
 
9
8
  def initialize label:, value:
@@ -0,0 +1,21 @@
1
+ module LensProtocol
2
+ module OMA
3
+ module Types
4
+ class Array < Type
5
+ def parse line, next_lines
6
+ values = parse_values line.data
7
+ [values, next_lines]
8
+ end
9
+
10
+ def wrap value, _message_hash, label
11
+ raise ValidationError, "#{label}: Expected an array of values. Got #{value}" unless value.is_a?(::Array)
12
+ value
13
+ end
14
+
15
+ def format label, values
16
+ build_line label, format_values(values)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ module LensProtocol
2
+ module OMA
3
+ module Types
4
+ class Chiral < Type
5
+ def parse line, next_lines
6
+ values = make_chiral parse_values line.data
7
+ [values, next_lines]
8
+ end
9
+
10
+ def wrap value, _message_hash, _label
11
+ make_chiral Array(value)
12
+ end
13
+
14
+ def format label, values
15
+ data = values.select(&:present?).empty? ? '' : format_values(values)
16
+ build_line label, data
17
+ end
18
+
19
+ private
20
+
21
+ def make_chiral values
22
+ if values.size <= 1
23
+ [values[0], values[0]]
24
+ else
25
+ values[0..1]
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ module LensProtocol
2
+ module OMA
3
+ module Types
4
+ class Ignored < Type
5
+ def parse _line, next_lines
6
+ [nil, next_lines]
7
+ end
8
+
9
+ def wrap _value, _message, _label
10
+ :ignored
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ module LensProtocol
2
+ module OMA
3
+ module Types
4
+ class Matrix < Type
5
+ def parse line, next_lines
6
+ same_label_lines, next_lines = next_lines.partition { |other_line| other_line.label == line.label }
7
+ values = [line, *same_label_lines].map { |line| parse_values line.data }
8
+ [values, next_lines]
9
+ end
10
+
11
+ def format label, values
12
+ values.map { |v| build_line label, format_values(v) }
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ module LensProtocol
2
+ module OMA
3
+ module Types
4
+ class Single < Type
5
+ def parse line, next_lines
6
+ value = parse_value line.data
7
+ [value, next_lines]
8
+ end
9
+
10
+ def wrap value, _message_hash, label
11
+ raise ValidationError, "#{label}: Expected a single value. Got #{value}" if value.respond_to?(:each)
12
+ value
13
+ end
14
+
15
+ def format label, value
16
+ build_line label, format_value(value)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end