lens_protocol 0.1.1 → 0.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.
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