codin_rep 0.1.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e40b5d66a9adcd57d0cd46e384142079590cfb38
4
- data.tar.gz: 9e87fa8364e105e6c8487796127c4a8a135badcd
3
+ metadata.gz: b899679412c8e4c220ca7c062dbd642d9fa2a4dd
4
+ data.tar.gz: fdb5f8943e5fb5e05cade78f860829868b16b436
5
5
  SHA512:
6
- metadata.gz: f34acf2a831190d23c59c4e61761987c9f60dff714c0736f3828c52aebe628a118d47bb17f276041f4b73bfa32fb204e0d41355216d1f366e0ee1daf8c529630
7
- data.tar.gz: fb37f568f897ee7bf934db130c8727563bcac1990b54aeb7f3cb7131f407add9cdb3d8065b9c14e853d056378b6f065c7bd6d0444170eb1b126d8514606e2847
6
+ metadata.gz: 92405274f99579511d1fcaad648b3940dfac116f0356e43c12c2c3c7677cfdb56e3e024d931b63554b776d7b6be5f49e6ec744dcd95eebcaa200fad9a8245dc6
7
+ data.tar.gz: 95fb2748572ff674fec78633011a6592699590f56197c8a351071f12bdde0ee434853dc0911601725394d00b1543575022f1f9091952b543d68baa4e346fa981
@@ -0,0 +1,186 @@
1
+ # -*- coding: utf-8 -*-
2
+ # codin_rep - Gem para acesso de REPs da Telebyte
3
+ # Copyright (C) 2016 O.S. Systems Softwares Ltda.
4
+
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Affero General Public License as
7
+ # published by the Free Software Foundation, either version 3 of the
8
+ # License, or (at your option) any later version.
9
+
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ # Rua Clóvis Gularte Candiota 132, Pelotas-RS, Brasil.
19
+ # e-mail: contato@ossystems.com.br
20
+
21
+ require 'codin_rep'
22
+ require 'codin_rep/time_util'
23
+ require 'socket'
24
+
25
+ module CodinRep
26
+ class MockTimeClock
27
+ include CodinRep
28
+
29
+ attr_reader :data, :ip
30
+
31
+ def initialize
32
+ @data = OpenStruct.new
33
+ @ip = '127.0.0.1'
34
+ @server = TCPServer.new(@ip, 0)
35
+ @running = false
36
+ @served_connections = 0
37
+ @threads = []
38
+ @threadsMutex = Mutex.new
39
+ @served_connections = 0
40
+ @time = true
41
+ @is_sending_records = false
42
+ end
43
+
44
+ def tcp_port
45
+ @server.addr[1]
46
+ end
47
+
48
+ def serve(socket)
49
+ Thread.new do
50
+ Thread.current.abort_on_exception = true
51
+ @threadsMutex.synchronize {
52
+ @threads << Thread.current
53
+ @served_connections += 1
54
+ }
55
+ begin
56
+ raw_command = []
57
+ @keep_connected = true
58
+ @first_connection = true
59
+ # Read command type
60
+ while @keep_connected && raw_command = read_from_socket_with_timeout(socket, 9)
61
+ response = process_command(raw_command, socket)
62
+ socket.write response
63
+ @first_connection = false
64
+ end
65
+ ensure
66
+ socket.close unless socket.closed?
67
+ @threadsMutex.synchronize {
68
+ @threads.delete(Thread.current)
69
+ }
70
+ end
71
+ end
72
+ end
73
+
74
+ def start
75
+ @server_thread = Thread.new do
76
+ Thread.current.abort_on_exception = true
77
+ @running = true
78
+ while @running
79
+ break if @server.closed?
80
+ socket = @server.accept
81
+ serve(socket)
82
+ end
83
+ end
84
+ self
85
+ end
86
+
87
+ def stop
88
+ @threadsMutex.synchronize {
89
+ @threads.each{|thread| thread.kill}
90
+ @threads = []
91
+ }
92
+ @server_thread.kill if @server_thread
93
+ @server.close unless @server.closed?
94
+ @server_thread.join
95
+ @running = false
96
+ true
97
+ end
98
+
99
+ def running?
100
+ @running
101
+ end
102
+
103
+ private
104
+ def process_command(raw_command, socket)
105
+ case raw_command
106
+ when "PGREP009b" # Get time
107
+ response = 'REP008b' + get_timeclock_time
108
+ when "PGREP016A" # Set time
109
+ payload = read_from_socket_with_timeout(socket, 7)
110
+ response = 'REP008A' + payload
111
+ set_timeclock_time(payload)
112
+ when "PGREP009Z"
113
+ response = 'REP2359' + @data.afd.header.export + "\r\n"
114
+ @keep_connected = false
115
+ when "PGREP0289"
116
+ @afd_read_start_id = read_from_socket_with_timeout(socket, 9).to_i
117
+ @afd_read_end_id = read_from_socket_with_timeout(socket, 9).to_i
118
+ @afd_read_current_id = nil
119
+ @afd_read_finished = false
120
+ response = "REP0029["
121
+ when "PGREP009,"
122
+ if @afd_read_finished
123
+ response = "REP0029]"
124
+ @keep_connected = false
125
+ else
126
+ if @afd_read_current_id.nil?
127
+ @afd_read_current_id = @afd_read_start_id
128
+ response = 'REP3029'
129
+ elsif @afd_read_current_id == @afd_read_end_id or @afd_read_current_id >= @data.afd.records.size
130
+ response = 'REP0909'
131
+ @afd_read_finished = true
132
+ else
133
+ response = 'REP0379'
134
+ end
135
+ afd_records = ([@data.afd.header] + @data.afd.records)
136
+ response += afd_records[@afd_read_current_id].export + "\r\n"
137
+ end
138
+ @afd_read_current_id += 1
139
+ when "PGREP075h"
140
+ payload = read_from_socket_with_timeout(socket, 66)
141
+ raw_registration, raw_pis, raw_name = payload.scan(/.(.{6})(.{6})(.+)/).flatten
142
+ registration = convert_bytes_to_string(raw_registration)
143
+ pis = convert_bytes_to_string(raw_pis)
144
+ name = raw_name.strip
145
+ @data.employees << {name: name, pis: pis, registration: registration}
146
+ response = "REP003h1\0"
147
+ when "PGREP016j"
148
+ payload = read_from_socket_with_timeout(socket, 7)
149
+ raw_registration = payload.scan(/.(.{6})/).flatten[0]
150
+ registration = convert_bytes_to_string(raw_registration)
151
+ @data.employees.delete_if{|employee| employee[:registration] == registration}
152
+ response = "REP003j1\0"
153
+ when 'PGREP010h', 'PGREP010j'
154
+ # Don't care for the result of these comands, just disconnect when
155
+ # possible.
156
+ @keep_connected = false
157
+ response = ""
158
+ else
159
+ raise StandardError.new("Unknown command \"#{raw_command}\"!")
160
+ end
161
+ response
162
+ end
163
+
164
+ def read_from_socket_with_timeout(socket, bytes_to_be_read, timeout_value=5)
165
+ data_to_receive = nil
166
+ timeout_value = 600 if @first_connection # use a large timeout on first connection
167
+ timeout(timeout_value) { data_to_receive = socket.readpartial( bytes_to_be_read ) }
168
+ return data_to_receive
169
+ end
170
+
171
+ def get_timeclock_time(current_time=nil)
172
+ current_time ||= @data.time
173
+ CodinRep::TimeUtil.pack current_time
174
+ end
175
+
176
+ def set_timeclock_time(payload)
177
+ time = CodinRep::TimeUtil.unpack payload
178
+ @data.time = time
179
+ return time
180
+ end
181
+
182
+ def convert_bytes_to_string(bytes)
183
+ bytes.unpack('H*')[0]
184
+ end
185
+ end
186
+ end
@@ -19,5 +19,5 @@
19
19
  # e-mail: contato@ossystems.com.br
20
20
 
21
21
  module CodinRep
22
- VERSION = "0.1.0".freeze
22
+ VERSION = "0.2.0".freeze
23
23
  end
@@ -14,14 +14,14 @@
14
14
  <img src="./assets/0.10.0/loading.gif" alt="loading"/>
15
15
  </div>
16
16
  <div id="wrapper" style="display:none;">
17
- <div class="timestamp">Generated <abbr class="timeago" title="2017-01-19T17:18:28-02:00">2017-01-19T17:18:28-02:00</abbr></div>
17
+ <div class="timestamp">Generated <abbr class="timeago" title="2017-01-25T17:10:31-02:00">2017-01-25T17:10:31-02:00</abbr></div>
18
18
  <ul class="group_tabs"></ul>
19
19
 
20
20
  <div id="content">
21
21
  <div class="file_list_container" id="AllFiles">
22
22
  <h2>
23
23
  <span class="group_name">All Files</span>
24
- (<span class="covered_percent"><span class="red">0.23%</span></span>
24
+ (<span class="covered_percent"><span class="red">0.19%</span></span>
25
25
  covered at
26
26
  <span class="covered_strength">
27
27
  <span class="red">
@@ -31,10 +31,10 @@
31
31
  </h2>
32
32
  <a name="AllFiles"></a>
33
33
  <div>
34
- <b>12</b> files in total.
35
- <b>881</b> relevant lines.
34
+ <b>13</b> files in total.
35
+ <b>1067</b> relevant lines.
36
36
  <span class="green"><b>2</b> lines covered</span> and
37
- <span class="red"><b>879</b> lines missed </span>
37
+ <span class="red"><b>1065</b> lines missed </span>
38
38
  </div>
39
39
  <table class="file_list">
40
40
  <thead>
@@ -140,6 +140,16 @@
140
140
  <td>0.0</td>
141
141
  </tr>
142
142
 
143
+ <tr>
144
+ <td class="strong"><a href="#eafa662feda24b9dc266cb168febb2abf1d20de2" class="src_link" title="lib/codin_rep/mock_time_clock.rb">lib/codin_rep/mock_time_clock.rb</a></td>
145
+ <td class="red strong">0.0 %</td>
146
+ <td>186</td>
147
+ <td>186</td>
148
+ <td>0</td>
149
+ <td>186</td>
150
+ <td>0.0</td>
151
+ </tr>
152
+
143
153
  <tr>
144
154
  <td class="strong"><a href="#1fa9099a69ac9fedd79846842381b07491658c37" class="src_link" title="lib/codin_rep/set_time.rb">lib/codin_rep/set_time.rb</a></td>
145
155
  <td class="red strong">0.0 %</td>
@@ -364,7 +374,7 @@
364
374
  <div class="file_list_container" id="Libraries">
365
375
  <h2>
366
376
  <span class="group_name">Libraries</span>
367
- (<span class="covered_percent"><span class="red">0.23%</span></span>
377
+ (<span class="covered_percent"><span class="red">0.19%</span></span>
368
378
  covered at
369
379
  <span class="covered_strength">
370
380
  <span class="red">
@@ -374,10 +384,10 @@
374
384
  </h2>
375
385
  <a name="Libraries"></a>
376
386
  <div>
377
- <b>12</b> files in total.
378
- <b>881</b> relevant lines.
387
+ <b>13</b> files in total.
388
+ <b>1067</b> relevant lines.
379
389
  <span class="green"><b>2</b> lines covered</span> and
380
- <span class="red"><b>879</b> lines missed </span>
390
+ <span class="red"><b>1065</b> lines missed </span>
381
391
  </div>
382
392
  <table class="file_list">
383
393
  <thead>
@@ -483,6 +493,16 @@
483
493
  <td>0.0</td>
484
494
  </tr>
485
495
 
496
+ <tr>
497
+ <td class="strong"><a href="#eafa662feda24b9dc266cb168febb2abf1d20de2" class="src_link" title="lib/codin_rep/mock_time_clock.rb">lib/codin_rep/mock_time_clock.rb</a></td>
498
+ <td class="red strong">0.0 %</td>
499
+ <td>186</td>
500
+ <td>186</td>
501
+ <td>0</td>
502
+ <td>186</td>
503
+ <td>0.0</td>
504
+ </tr>
505
+
486
506
  <tr>
487
507
  <td class="strong"><a href="#1fa9099a69ac9fedd79846842381b07491658c37" class="src_link" title="lib/codin_rep/set_time.rb">lib/codin_rep/set_time.rb</a></td>
488
508
  <td class="red strong">0.0 %</td>
@@ -5292,6 +5312,1140 @@
5292
5312
  </pre>
5293
5313
  </div>
5294
5314
 
5315
+ <div class="source_table" id="eafa662feda24b9dc266cb168febb2abf1d20de2">
5316
+ <div class="header">
5317
+ <h3>lib/codin_rep/mock_time_clock.rb</h3>
5318
+ <h4><span class="red">0.0 %</span> covered</h4>
5319
+ <div>
5320
+ <b>186</b> relevant lines.
5321
+ <span class="green"><b>0</b> lines covered</span> and
5322
+ <span class="red"><b>186</b> lines missed.</span>
5323
+ </div>
5324
+ </div>
5325
+
5326
+ <pre>
5327
+ <ol>
5328
+
5329
+ <li class="missed" data-hits="0" data-linenumber="1">
5330
+
5331
+
5332
+ <code class="ruby"># -*- coding: utf-8 -*-</code>
5333
+ </li>
5334
+
5335
+ <li class="missed" data-hits="0" data-linenumber="2">
5336
+
5337
+
5338
+ <code class="ruby"># codin_rep - Gem para acesso de REPs da Telebyte</code>
5339
+ </li>
5340
+
5341
+ <li class="missed" data-hits="0" data-linenumber="3">
5342
+
5343
+
5344
+ <code class="ruby"># Copyright (C) 2016 O.S. Systems Softwares Ltda.</code>
5345
+ </li>
5346
+
5347
+ <li class="missed" data-hits="0" data-linenumber="4">
5348
+
5349
+
5350
+ <code class="ruby"></code>
5351
+ </li>
5352
+
5353
+ <li class="missed" data-hits="0" data-linenumber="5">
5354
+
5355
+
5356
+ <code class="ruby"># This program is free software: you can redistribute it and/or modify</code>
5357
+ </li>
5358
+
5359
+ <li class="missed" data-hits="0" data-linenumber="6">
5360
+
5361
+
5362
+ <code class="ruby"># it under the terms of the GNU Affero General Public License as</code>
5363
+ </li>
5364
+
5365
+ <li class="missed" data-hits="0" data-linenumber="7">
5366
+
5367
+
5368
+ <code class="ruby"># published by the Free Software Foundation, either version 3 of the</code>
5369
+ </li>
5370
+
5371
+ <li class="missed" data-hits="0" data-linenumber="8">
5372
+
5373
+
5374
+ <code class="ruby"># License, or (at your option) any later version.</code>
5375
+ </li>
5376
+
5377
+ <li class="missed" data-hits="0" data-linenumber="9">
5378
+
5379
+
5380
+ <code class="ruby"></code>
5381
+ </li>
5382
+
5383
+ <li class="missed" data-hits="0" data-linenumber="10">
5384
+
5385
+
5386
+ <code class="ruby"># This program is distributed in the hope that it will be useful,</code>
5387
+ </li>
5388
+
5389
+ <li class="missed" data-hits="0" data-linenumber="11">
5390
+
5391
+
5392
+ <code class="ruby"># but WITHOUT ANY WARRANTY; without even the implied warranty of</code>
5393
+ </li>
5394
+
5395
+ <li class="missed" data-hits="0" data-linenumber="12">
5396
+
5397
+
5398
+ <code class="ruby"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</code>
5399
+ </li>
5400
+
5401
+ <li class="missed" data-hits="0" data-linenumber="13">
5402
+
5403
+
5404
+ <code class="ruby"># GNU Affero General Public License for more details.</code>
5405
+ </li>
5406
+
5407
+ <li class="missed" data-hits="0" data-linenumber="14">
5408
+
5409
+
5410
+ <code class="ruby"></code>
5411
+ </li>
5412
+
5413
+ <li class="missed" data-hits="0" data-linenumber="15">
5414
+
5415
+
5416
+ <code class="ruby"># You should have received a copy of the GNU Affero General Public License</code>
5417
+ </li>
5418
+
5419
+ <li class="missed" data-hits="0" data-linenumber="16">
5420
+
5421
+
5422
+ <code class="ruby"># along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</code>
5423
+ </li>
5424
+
5425
+ <li class="missed" data-hits="0" data-linenumber="17">
5426
+
5427
+
5428
+ <code class="ruby"></code>
5429
+ </li>
5430
+
5431
+ <li class="missed" data-hits="0" data-linenumber="18">
5432
+
5433
+
5434
+ <code class="ruby"># Rua Clóvis Gularte Candiota 132, Pelotas-RS, Brasil.</code>
5435
+ </li>
5436
+
5437
+ <li class="missed" data-hits="0" data-linenumber="19">
5438
+
5439
+
5440
+ <code class="ruby"># e-mail: contato@ossystems.com.br</code>
5441
+ </li>
5442
+
5443
+ <li class="missed" data-hits="0" data-linenumber="20">
5444
+
5445
+
5446
+ <code class="ruby"></code>
5447
+ </li>
5448
+
5449
+ <li class="missed" data-hits="0" data-linenumber="21">
5450
+
5451
+
5452
+ <code class="ruby">require &#39;codin_rep&#39;</code>
5453
+ </li>
5454
+
5455
+ <li class="missed" data-hits="0" data-linenumber="22">
5456
+
5457
+
5458
+ <code class="ruby">require &#39;codin_rep/time_util&#39;</code>
5459
+ </li>
5460
+
5461
+ <li class="missed" data-hits="0" data-linenumber="23">
5462
+
5463
+
5464
+ <code class="ruby">require &#39;socket&#39;</code>
5465
+ </li>
5466
+
5467
+ <li class="missed" data-hits="0" data-linenumber="24">
5468
+
5469
+
5470
+ <code class="ruby"></code>
5471
+ </li>
5472
+
5473
+ <li class="missed" data-hits="0" data-linenumber="25">
5474
+
5475
+
5476
+ <code class="ruby">module CodinRep</code>
5477
+ </li>
5478
+
5479
+ <li class="missed" data-hits="0" data-linenumber="26">
5480
+
5481
+
5482
+ <code class="ruby"> class MockTimeClock</code>
5483
+ </li>
5484
+
5485
+ <li class="missed" data-hits="0" data-linenumber="27">
5486
+
5487
+
5488
+ <code class="ruby"> include CodinRep</code>
5489
+ </li>
5490
+
5491
+ <li class="missed" data-hits="0" data-linenumber="28">
5492
+
5493
+
5494
+ <code class="ruby"></code>
5495
+ </li>
5496
+
5497
+ <li class="missed" data-hits="0" data-linenumber="29">
5498
+
5499
+
5500
+ <code class="ruby"> attr_reader :data, :ip</code>
5501
+ </li>
5502
+
5503
+ <li class="missed" data-hits="0" data-linenumber="30">
5504
+
5505
+
5506
+ <code class="ruby"></code>
5507
+ </li>
5508
+
5509
+ <li class="missed" data-hits="0" data-linenumber="31">
5510
+
5511
+
5512
+ <code class="ruby"> def initialize</code>
5513
+ </li>
5514
+
5515
+ <li class="missed" data-hits="0" data-linenumber="32">
5516
+
5517
+
5518
+ <code class="ruby"> @data = OpenStruct.new</code>
5519
+ </li>
5520
+
5521
+ <li class="missed" data-hits="0" data-linenumber="33">
5522
+
5523
+
5524
+ <code class="ruby"> @ip = &#39;127.0.0.1&#39;</code>
5525
+ </li>
5526
+
5527
+ <li class="missed" data-hits="0" data-linenumber="34">
5528
+
5529
+
5530
+ <code class="ruby"> @server = TCPServer.new(@ip, 0)</code>
5531
+ </li>
5532
+
5533
+ <li class="missed" data-hits="0" data-linenumber="35">
5534
+
5535
+
5536
+ <code class="ruby"> @running = false</code>
5537
+ </li>
5538
+
5539
+ <li class="missed" data-hits="0" data-linenumber="36">
5540
+
5541
+
5542
+ <code class="ruby"> @served_connections = 0</code>
5543
+ </li>
5544
+
5545
+ <li class="missed" data-hits="0" data-linenumber="37">
5546
+
5547
+
5548
+ <code class="ruby"> @threads = []</code>
5549
+ </li>
5550
+
5551
+ <li class="missed" data-hits="0" data-linenumber="38">
5552
+
5553
+
5554
+ <code class="ruby"> @threadsMutex = Mutex.new</code>
5555
+ </li>
5556
+
5557
+ <li class="missed" data-hits="0" data-linenumber="39">
5558
+
5559
+
5560
+ <code class="ruby"> @served_connections = 0</code>
5561
+ </li>
5562
+
5563
+ <li class="missed" data-hits="0" data-linenumber="40">
5564
+
5565
+
5566
+ <code class="ruby"> @time = true</code>
5567
+ </li>
5568
+
5569
+ <li class="missed" data-hits="0" data-linenumber="41">
5570
+
5571
+
5572
+ <code class="ruby"> @is_sending_records = false</code>
5573
+ </li>
5574
+
5575
+ <li class="missed" data-hits="0" data-linenumber="42">
5576
+
5577
+
5578
+ <code class="ruby"> end</code>
5579
+ </li>
5580
+
5581
+ <li class="missed" data-hits="0" data-linenumber="43">
5582
+
5583
+
5584
+ <code class="ruby"></code>
5585
+ </li>
5586
+
5587
+ <li class="missed" data-hits="0" data-linenumber="44">
5588
+
5589
+
5590
+ <code class="ruby"> def tcp_port</code>
5591
+ </li>
5592
+
5593
+ <li class="missed" data-hits="0" data-linenumber="45">
5594
+
5595
+
5596
+ <code class="ruby"> @server.addr[1]</code>
5597
+ </li>
5598
+
5599
+ <li class="missed" data-hits="0" data-linenumber="46">
5600
+
5601
+
5602
+ <code class="ruby"> end</code>
5603
+ </li>
5604
+
5605
+ <li class="missed" data-hits="0" data-linenumber="47">
5606
+
5607
+
5608
+ <code class="ruby"></code>
5609
+ </li>
5610
+
5611
+ <li class="missed" data-hits="0" data-linenumber="48">
5612
+
5613
+
5614
+ <code class="ruby"> def serve(socket)</code>
5615
+ </li>
5616
+
5617
+ <li class="missed" data-hits="0" data-linenumber="49">
5618
+
5619
+
5620
+ <code class="ruby"> Thread.new do</code>
5621
+ </li>
5622
+
5623
+ <li class="missed" data-hits="0" data-linenumber="50">
5624
+
5625
+
5626
+ <code class="ruby"> Thread.current.abort_on_exception = true</code>
5627
+ </li>
5628
+
5629
+ <li class="missed" data-hits="0" data-linenumber="51">
5630
+
5631
+
5632
+ <code class="ruby"> @threadsMutex.synchronize {</code>
5633
+ </li>
5634
+
5635
+ <li class="missed" data-hits="0" data-linenumber="52">
5636
+
5637
+
5638
+ <code class="ruby"> @threads &lt;&lt; Thread.current</code>
5639
+ </li>
5640
+
5641
+ <li class="missed" data-hits="0" data-linenumber="53">
5642
+
5643
+
5644
+ <code class="ruby"> @served_connections += 1</code>
5645
+ </li>
5646
+
5647
+ <li class="missed" data-hits="0" data-linenumber="54">
5648
+
5649
+
5650
+ <code class="ruby"> }</code>
5651
+ </li>
5652
+
5653
+ <li class="missed" data-hits="0" data-linenumber="55">
5654
+
5655
+
5656
+ <code class="ruby"> begin</code>
5657
+ </li>
5658
+
5659
+ <li class="missed" data-hits="0" data-linenumber="56">
5660
+
5661
+
5662
+ <code class="ruby"> raw_command = []</code>
5663
+ </li>
5664
+
5665
+ <li class="missed" data-hits="0" data-linenumber="57">
5666
+
5667
+
5668
+ <code class="ruby"> @keep_connected = true</code>
5669
+ </li>
5670
+
5671
+ <li class="missed" data-hits="0" data-linenumber="58">
5672
+
5673
+
5674
+ <code class="ruby"> @first_connection = true</code>
5675
+ </li>
5676
+
5677
+ <li class="missed" data-hits="0" data-linenumber="59">
5678
+
5679
+
5680
+ <code class="ruby"> # Read command type</code>
5681
+ </li>
5682
+
5683
+ <li class="missed" data-hits="0" data-linenumber="60">
5684
+
5685
+
5686
+ <code class="ruby"> while @keep_connected &amp;&amp; raw_command = read_from_socket_with_timeout(socket, 9)</code>
5687
+ </li>
5688
+
5689
+ <li class="missed" data-hits="0" data-linenumber="61">
5690
+
5691
+
5692
+ <code class="ruby"> response = process_command(raw_command, socket)</code>
5693
+ </li>
5694
+
5695
+ <li class="missed" data-hits="0" data-linenumber="62">
5696
+
5697
+
5698
+ <code class="ruby"> socket.write response</code>
5699
+ </li>
5700
+
5701
+ <li class="missed" data-hits="0" data-linenumber="63">
5702
+
5703
+
5704
+ <code class="ruby"> @first_connection = false</code>
5705
+ </li>
5706
+
5707
+ <li class="missed" data-hits="0" data-linenumber="64">
5708
+
5709
+
5710
+ <code class="ruby"> end</code>
5711
+ </li>
5712
+
5713
+ <li class="missed" data-hits="0" data-linenumber="65">
5714
+
5715
+
5716
+ <code class="ruby"> ensure</code>
5717
+ </li>
5718
+
5719
+ <li class="missed" data-hits="0" data-linenumber="66">
5720
+
5721
+
5722
+ <code class="ruby"> socket.close unless socket.closed?</code>
5723
+ </li>
5724
+
5725
+ <li class="missed" data-hits="0" data-linenumber="67">
5726
+
5727
+
5728
+ <code class="ruby"> @threadsMutex.synchronize {</code>
5729
+ </li>
5730
+
5731
+ <li class="missed" data-hits="0" data-linenumber="68">
5732
+
5733
+
5734
+ <code class="ruby"> @threads.delete(Thread.current)</code>
5735
+ </li>
5736
+
5737
+ <li class="missed" data-hits="0" data-linenumber="69">
5738
+
5739
+
5740
+ <code class="ruby"> }</code>
5741
+ </li>
5742
+
5743
+ <li class="missed" data-hits="0" data-linenumber="70">
5744
+
5745
+
5746
+ <code class="ruby"> end</code>
5747
+ </li>
5748
+
5749
+ <li class="missed" data-hits="0" data-linenumber="71">
5750
+
5751
+
5752
+ <code class="ruby"> end</code>
5753
+ </li>
5754
+
5755
+ <li class="missed" data-hits="0" data-linenumber="72">
5756
+
5757
+
5758
+ <code class="ruby"> end</code>
5759
+ </li>
5760
+
5761
+ <li class="missed" data-hits="0" data-linenumber="73">
5762
+
5763
+
5764
+ <code class="ruby"></code>
5765
+ </li>
5766
+
5767
+ <li class="missed" data-hits="0" data-linenumber="74">
5768
+
5769
+
5770
+ <code class="ruby"> def start</code>
5771
+ </li>
5772
+
5773
+ <li class="missed" data-hits="0" data-linenumber="75">
5774
+
5775
+
5776
+ <code class="ruby"> @server_thread = Thread.new do</code>
5777
+ </li>
5778
+
5779
+ <li class="missed" data-hits="0" data-linenumber="76">
5780
+
5781
+
5782
+ <code class="ruby"> Thread.current.abort_on_exception = true</code>
5783
+ </li>
5784
+
5785
+ <li class="missed" data-hits="0" data-linenumber="77">
5786
+
5787
+
5788
+ <code class="ruby"> @running = true</code>
5789
+ </li>
5790
+
5791
+ <li class="missed" data-hits="0" data-linenumber="78">
5792
+
5793
+
5794
+ <code class="ruby"> while @running</code>
5795
+ </li>
5796
+
5797
+ <li class="missed" data-hits="0" data-linenumber="79">
5798
+
5799
+
5800
+ <code class="ruby"> break if @server.closed?</code>
5801
+ </li>
5802
+
5803
+ <li class="missed" data-hits="0" data-linenumber="80">
5804
+
5805
+
5806
+ <code class="ruby"> socket = @server.accept</code>
5807
+ </li>
5808
+
5809
+ <li class="missed" data-hits="0" data-linenumber="81">
5810
+
5811
+
5812
+ <code class="ruby"> serve(socket)</code>
5813
+ </li>
5814
+
5815
+ <li class="missed" data-hits="0" data-linenumber="82">
5816
+
5817
+
5818
+ <code class="ruby"> end</code>
5819
+ </li>
5820
+
5821
+ <li class="missed" data-hits="0" data-linenumber="83">
5822
+
5823
+
5824
+ <code class="ruby"> end</code>
5825
+ </li>
5826
+
5827
+ <li class="missed" data-hits="0" data-linenumber="84">
5828
+
5829
+
5830
+ <code class="ruby"> self</code>
5831
+ </li>
5832
+
5833
+ <li class="missed" data-hits="0" data-linenumber="85">
5834
+
5835
+
5836
+ <code class="ruby"> end</code>
5837
+ </li>
5838
+
5839
+ <li class="missed" data-hits="0" data-linenumber="86">
5840
+
5841
+
5842
+ <code class="ruby"></code>
5843
+ </li>
5844
+
5845
+ <li class="missed" data-hits="0" data-linenumber="87">
5846
+
5847
+
5848
+ <code class="ruby"> def stop</code>
5849
+ </li>
5850
+
5851
+ <li class="missed" data-hits="0" data-linenumber="88">
5852
+
5853
+
5854
+ <code class="ruby"> @threadsMutex.synchronize {</code>
5855
+ </li>
5856
+
5857
+ <li class="missed" data-hits="0" data-linenumber="89">
5858
+
5859
+
5860
+ <code class="ruby"> @threads.each{|thread| thread.kill}</code>
5861
+ </li>
5862
+
5863
+ <li class="missed" data-hits="0" data-linenumber="90">
5864
+
5865
+
5866
+ <code class="ruby"> @threads = []</code>
5867
+ </li>
5868
+
5869
+ <li class="missed" data-hits="0" data-linenumber="91">
5870
+
5871
+
5872
+ <code class="ruby"> }</code>
5873
+ </li>
5874
+
5875
+ <li class="missed" data-hits="0" data-linenumber="92">
5876
+
5877
+
5878
+ <code class="ruby"> @server_thread.kill if @server_thread</code>
5879
+ </li>
5880
+
5881
+ <li class="missed" data-hits="0" data-linenumber="93">
5882
+
5883
+
5884
+ <code class="ruby"> @server.close unless @server.closed?</code>
5885
+ </li>
5886
+
5887
+ <li class="missed" data-hits="0" data-linenumber="94">
5888
+
5889
+
5890
+ <code class="ruby"> @server_thread.join</code>
5891
+ </li>
5892
+
5893
+ <li class="missed" data-hits="0" data-linenumber="95">
5894
+
5895
+
5896
+ <code class="ruby"> @running = false</code>
5897
+ </li>
5898
+
5899
+ <li class="missed" data-hits="0" data-linenumber="96">
5900
+
5901
+
5902
+ <code class="ruby"> true</code>
5903
+ </li>
5904
+
5905
+ <li class="missed" data-hits="0" data-linenumber="97">
5906
+
5907
+
5908
+ <code class="ruby"> end</code>
5909
+ </li>
5910
+
5911
+ <li class="missed" data-hits="0" data-linenumber="98">
5912
+
5913
+
5914
+ <code class="ruby"></code>
5915
+ </li>
5916
+
5917
+ <li class="missed" data-hits="0" data-linenumber="99">
5918
+
5919
+
5920
+ <code class="ruby"> def running?</code>
5921
+ </li>
5922
+
5923
+ <li class="missed" data-hits="0" data-linenumber="100">
5924
+
5925
+
5926
+ <code class="ruby"> @running</code>
5927
+ </li>
5928
+
5929
+ <li class="missed" data-hits="0" data-linenumber="101">
5930
+
5931
+
5932
+ <code class="ruby"> end</code>
5933
+ </li>
5934
+
5935
+ <li class="missed" data-hits="0" data-linenumber="102">
5936
+
5937
+
5938
+ <code class="ruby"></code>
5939
+ </li>
5940
+
5941
+ <li class="missed" data-hits="0" data-linenumber="103">
5942
+
5943
+
5944
+ <code class="ruby"> private</code>
5945
+ </li>
5946
+
5947
+ <li class="missed" data-hits="0" data-linenumber="104">
5948
+
5949
+
5950
+ <code class="ruby"> def process_command(raw_command, socket)</code>
5951
+ </li>
5952
+
5953
+ <li class="missed" data-hits="0" data-linenumber="105">
5954
+
5955
+
5956
+ <code class="ruby"> case raw_command</code>
5957
+ </li>
5958
+
5959
+ <li class="missed" data-hits="0" data-linenumber="106">
5960
+
5961
+
5962
+ <code class="ruby"> when &quot;PGREP009b&quot; # Get time</code>
5963
+ </li>
5964
+
5965
+ <li class="missed" data-hits="0" data-linenumber="107">
5966
+
5967
+
5968
+ <code class="ruby"> response = &#39;REP008b&#39; + get_timeclock_time</code>
5969
+ </li>
5970
+
5971
+ <li class="missed" data-hits="0" data-linenumber="108">
5972
+
5973
+
5974
+ <code class="ruby"> when &quot;PGREP016A&quot; # Set time</code>
5975
+ </li>
5976
+
5977
+ <li class="missed" data-hits="0" data-linenumber="109">
5978
+
5979
+
5980
+ <code class="ruby"> payload = read_from_socket_with_timeout(socket, 7)</code>
5981
+ </li>
5982
+
5983
+ <li class="missed" data-hits="0" data-linenumber="110">
5984
+
5985
+
5986
+ <code class="ruby"> response = &#39;REP008A&#39; + payload</code>
5987
+ </li>
5988
+
5989
+ <li class="missed" data-hits="0" data-linenumber="111">
5990
+
5991
+
5992
+ <code class="ruby"> set_timeclock_time(payload)</code>
5993
+ </li>
5994
+
5995
+ <li class="missed" data-hits="0" data-linenumber="112">
5996
+
5997
+
5998
+ <code class="ruby"> when &quot;PGREP009Z&quot;</code>
5999
+ </li>
6000
+
6001
+ <li class="missed" data-hits="0" data-linenumber="113">
6002
+
6003
+
6004
+ <code class="ruby"> response = &#39;REP2359&#39; + @data.afd.header.export + &quot;\r\n&quot;</code>
6005
+ </li>
6006
+
6007
+ <li class="missed" data-hits="0" data-linenumber="114">
6008
+
6009
+
6010
+ <code class="ruby"> @keep_connected = false</code>
6011
+ </li>
6012
+
6013
+ <li class="missed" data-hits="0" data-linenumber="115">
6014
+
6015
+
6016
+ <code class="ruby"> when &quot;PGREP0289&quot;</code>
6017
+ </li>
6018
+
6019
+ <li class="missed" data-hits="0" data-linenumber="116">
6020
+
6021
+
6022
+ <code class="ruby"> @afd_read_start_id = read_from_socket_with_timeout(socket, 9).to_i</code>
6023
+ </li>
6024
+
6025
+ <li class="missed" data-hits="0" data-linenumber="117">
6026
+
6027
+
6028
+ <code class="ruby"> @afd_read_end_id = read_from_socket_with_timeout(socket, 9).to_i</code>
6029
+ </li>
6030
+
6031
+ <li class="missed" data-hits="0" data-linenumber="118">
6032
+
6033
+
6034
+ <code class="ruby"> @afd_read_current_id = nil</code>
6035
+ </li>
6036
+
6037
+ <li class="missed" data-hits="0" data-linenumber="119">
6038
+
6039
+
6040
+ <code class="ruby"> @afd_read_finished = false</code>
6041
+ </li>
6042
+
6043
+ <li class="missed" data-hits="0" data-linenumber="120">
6044
+
6045
+
6046
+ <code class="ruby"> response = &quot;REP0029[&quot;</code>
6047
+ </li>
6048
+
6049
+ <li class="missed" data-hits="0" data-linenumber="121">
6050
+
6051
+
6052
+ <code class="ruby"> when &quot;PGREP009,&quot;</code>
6053
+ </li>
6054
+
6055
+ <li class="missed" data-hits="0" data-linenumber="122">
6056
+
6057
+
6058
+ <code class="ruby"> if @afd_read_finished</code>
6059
+ </li>
6060
+
6061
+ <li class="missed" data-hits="0" data-linenumber="123">
6062
+
6063
+
6064
+ <code class="ruby"> response = &quot;REP0029]&quot;</code>
6065
+ </li>
6066
+
6067
+ <li class="missed" data-hits="0" data-linenumber="124">
6068
+
6069
+
6070
+ <code class="ruby"> @keep_connected = false</code>
6071
+ </li>
6072
+
6073
+ <li class="missed" data-hits="0" data-linenumber="125">
6074
+
6075
+
6076
+ <code class="ruby"> else</code>
6077
+ </li>
6078
+
6079
+ <li class="missed" data-hits="0" data-linenumber="126">
6080
+
6081
+
6082
+ <code class="ruby"> if @afd_read_current_id.nil?</code>
6083
+ </li>
6084
+
6085
+ <li class="missed" data-hits="0" data-linenumber="127">
6086
+
6087
+
6088
+ <code class="ruby"> @afd_read_current_id = @afd_read_start_id</code>
6089
+ </li>
6090
+
6091
+ <li class="missed" data-hits="0" data-linenumber="128">
6092
+
6093
+
6094
+ <code class="ruby"> response = &#39;REP3029&#39;</code>
6095
+ </li>
6096
+
6097
+ <li class="missed" data-hits="0" data-linenumber="129">
6098
+
6099
+
6100
+ <code class="ruby"> elsif @afd_read_current_id == @afd_read_end_id or @afd_read_current_id &gt;= @data.afd.records.size</code>
6101
+ </li>
6102
+
6103
+ <li class="missed" data-hits="0" data-linenumber="130">
6104
+
6105
+
6106
+ <code class="ruby"> response = &#39;REP0909&#39;</code>
6107
+ </li>
6108
+
6109
+ <li class="missed" data-hits="0" data-linenumber="131">
6110
+
6111
+
6112
+ <code class="ruby"> @afd_read_finished = true</code>
6113
+ </li>
6114
+
6115
+ <li class="missed" data-hits="0" data-linenumber="132">
6116
+
6117
+
6118
+ <code class="ruby"> else</code>
6119
+ </li>
6120
+
6121
+ <li class="missed" data-hits="0" data-linenumber="133">
6122
+
6123
+
6124
+ <code class="ruby"> response = &#39;REP0379&#39;</code>
6125
+ </li>
6126
+
6127
+ <li class="missed" data-hits="0" data-linenumber="134">
6128
+
6129
+
6130
+ <code class="ruby"> end</code>
6131
+ </li>
6132
+
6133
+ <li class="missed" data-hits="0" data-linenumber="135">
6134
+
6135
+
6136
+ <code class="ruby"> afd_records = ([@data.afd.header] + @data.afd.records)</code>
6137
+ </li>
6138
+
6139
+ <li class="missed" data-hits="0" data-linenumber="136">
6140
+
6141
+
6142
+ <code class="ruby"> response += afd_records[@afd_read_current_id].export + &quot;\r\n&quot;</code>
6143
+ </li>
6144
+
6145
+ <li class="missed" data-hits="0" data-linenumber="137">
6146
+
6147
+
6148
+ <code class="ruby"> end</code>
6149
+ </li>
6150
+
6151
+ <li class="missed" data-hits="0" data-linenumber="138">
6152
+
6153
+
6154
+ <code class="ruby"> @afd_read_current_id += 1</code>
6155
+ </li>
6156
+
6157
+ <li class="missed" data-hits="0" data-linenumber="139">
6158
+
6159
+
6160
+ <code class="ruby"> when &quot;PGREP075h&quot;</code>
6161
+ </li>
6162
+
6163
+ <li class="missed" data-hits="0" data-linenumber="140">
6164
+
6165
+
6166
+ <code class="ruby"> payload = read_from_socket_with_timeout(socket, 66)</code>
6167
+ </li>
6168
+
6169
+ <li class="missed" data-hits="0" data-linenumber="141">
6170
+
6171
+
6172
+ <code class="ruby"> raw_registration, raw_pis, raw_name = payload.scan(/.(.{6})(.{6})(.+)/).flatten</code>
6173
+ </li>
6174
+
6175
+ <li class="missed" data-hits="0" data-linenumber="142">
6176
+
6177
+
6178
+ <code class="ruby"> registration = convert_bytes_to_string(raw_registration)</code>
6179
+ </li>
6180
+
6181
+ <li class="missed" data-hits="0" data-linenumber="143">
6182
+
6183
+
6184
+ <code class="ruby"> pis = convert_bytes_to_string(raw_pis)</code>
6185
+ </li>
6186
+
6187
+ <li class="missed" data-hits="0" data-linenumber="144">
6188
+
6189
+
6190
+ <code class="ruby"> name = raw_name.strip</code>
6191
+ </li>
6192
+
6193
+ <li class="missed" data-hits="0" data-linenumber="145">
6194
+
6195
+
6196
+ <code class="ruby"> @data.employees &lt;&lt; {name: name, pis: pis, registration: registration}</code>
6197
+ </li>
6198
+
6199
+ <li class="missed" data-hits="0" data-linenumber="146">
6200
+
6201
+
6202
+ <code class="ruby"> response = &quot;REP003h1\0&quot;</code>
6203
+ </li>
6204
+
6205
+ <li class="missed" data-hits="0" data-linenumber="147">
6206
+
6207
+
6208
+ <code class="ruby"> when &quot;PGREP016j&quot;</code>
6209
+ </li>
6210
+
6211
+ <li class="missed" data-hits="0" data-linenumber="148">
6212
+
6213
+
6214
+ <code class="ruby"> payload = read_from_socket_with_timeout(socket, 7)</code>
6215
+ </li>
6216
+
6217
+ <li class="missed" data-hits="0" data-linenumber="149">
6218
+
6219
+
6220
+ <code class="ruby"> raw_registration = payload.scan(/.(.{6})/).flatten[0]</code>
6221
+ </li>
6222
+
6223
+ <li class="missed" data-hits="0" data-linenumber="150">
6224
+
6225
+
6226
+ <code class="ruby"> registration = convert_bytes_to_string(raw_registration)</code>
6227
+ </li>
6228
+
6229
+ <li class="missed" data-hits="0" data-linenumber="151">
6230
+
6231
+
6232
+ <code class="ruby"> @data.employees.delete_if{|employee| employee[:registration] == registration}</code>
6233
+ </li>
6234
+
6235
+ <li class="missed" data-hits="0" data-linenumber="152">
6236
+
6237
+
6238
+ <code class="ruby"> response = &quot;REP003j1\0&quot;</code>
6239
+ </li>
6240
+
6241
+ <li class="missed" data-hits="0" data-linenumber="153">
6242
+
6243
+
6244
+ <code class="ruby"> when &#39;PGREP010h&#39;, &#39;PGREP010j&#39;</code>
6245
+ </li>
6246
+
6247
+ <li class="missed" data-hits="0" data-linenumber="154">
6248
+
6249
+
6250
+ <code class="ruby"> # Don&#39;t care for the result of these comands, just disconnect when</code>
6251
+ </li>
6252
+
6253
+ <li class="missed" data-hits="0" data-linenumber="155">
6254
+
6255
+
6256
+ <code class="ruby"> # possible.</code>
6257
+ </li>
6258
+
6259
+ <li class="missed" data-hits="0" data-linenumber="156">
6260
+
6261
+
6262
+ <code class="ruby"> @keep_connected = false</code>
6263
+ </li>
6264
+
6265
+ <li class="missed" data-hits="0" data-linenumber="157">
6266
+
6267
+
6268
+ <code class="ruby"> response = &quot;&quot;</code>
6269
+ </li>
6270
+
6271
+ <li class="missed" data-hits="0" data-linenumber="158">
6272
+
6273
+
6274
+ <code class="ruby"> else</code>
6275
+ </li>
6276
+
6277
+ <li class="missed" data-hits="0" data-linenumber="159">
6278
+
6279
+
6280
+ <code class="ruby"> raise StandardError.new(&quot;Unknown command \&quot;#{raw_command}\&quot;!&quot;)</code>
6281
+ </li>
6282
+
6283
+ <li class="missed" data-hits="0" data-linenumber="160">
6284
+
6285
+
6286
+ <code class="ruby"> end</code>
6287
+ </li>
6288
+
6289
+ <li class="missed" data-hits="0" data-linenumber="161">
6290
+
6291
+
6292
+ <code class="ruby"> response</code>
6293
+ </li>
6294
+
6295
+ <li class="missed" data-hits="0" data-linenumber="162">
6296
+
6297
+
6298
+ <code class="ruby"> end</code>
6299
+ </li>
6300
+
6301
+ <li class="missed" data-hits="0" data-linenumber="163">
6302
+
6303
+
6304
+ <code class="ruby"></code>
6305
+ </li>
6306
+
6307
+ <li class="missed" data-hits="0" data-linenumber="164">
6308
+
6309
+
6310
+ <code class="ruby"> def read_from_socket_with_timeout(socket, bytes_to_be_read, timeout_value=5)</code>
6311
+ </li>
6312
+
6313
+ <li class="missed" data-hits="0" data-linenumber="165">
6314
+
6315
+
6316
+ <code class="ruby"> data_to_receive = nil</code>
6317
+ </li>
6318
+
6319
+ <li class="missed" data-hits="0" data-linenumber="166">
6320
+
6321
+
6322
+ <code class="ruby"> timeout_value = 600 if @first_connection # use a large timeout on first connection</code>
6323
+ </li>
6324
+
6325
+ <li class="missed" data-hits="0" data-linenumber="167">
6326
+
6327
+
6328
+ <code class="ruby"> timeout(timeout_value) { data_to_receive = socket.readpartial( bytes_to_be_read ) }</code>
6329
+ </li>
6330
+
6331
+ <li class="missed" data-hits="0" data-linenumber="168">
6332
+
6333
+
6334
+ <code class="ruby"> return data_to_receive</code>
6335
+ </li>
6336
+
6337
+ <li class="missed" data-hits="0" data-linenumber="169">
6338
+
6339
+
6340
+ <code class="ruby"> end</code>
6341
+ </li>
6342
+
6343
+ <li class="missed" data-hits="0" data-linenumber="170">
6344
+
6345
+
6346
+ <code class="ruby"></code>
6347
+ </li>
6348
+
6349
+ <li class="missed" data-hits="0" data-linenumber="171">
6350
+
6351
+
6352
+ <code class="ruby"> def get_timeclock_time(current_time=nil)</code>
6353
+ </li>
6354
+
6355
+ <li class="missed" data-hits="0" data-linenumber="172">
6356
+
6357
+
6358
+ <code class="ruby"> current_time ||= @data.time</code>
6359
+ </li>
6360
+
6361
+ <li class="missed" data-hits="0" data-linenumber="173">
6362
+
6363
+
6364
+ <code class="ruby"> CodinRep::TimeUtil.pack current_time</code>
6365
+ </li>
6366
+
6367
+ <li class="missed" data-hits="0" data-linenumber="174">
6368
+
6369
+
6370
+ <code class="ruby"> end</code>
6371
+ </li>
6372
+
6373
+ <li class="missed" data-hits="0" data-linenumber="175">
6374
+
6375
+
6376
+ <code class="ruby"></code>
6377
+ </li>
6378
+
6379
+ <li class="missed" data-hits="0" data-linenumber="176">
6380
+
6381
+
6382
+ <code class="ruby"> def set_timeclock_time(payload)</code>
6383
+ </li>
6384
+
6385
+ <li class="missed" data-hits="0" data-linenumber="177">
6386
+
6387
+
6388
+ <code class="ruby"> time = CodinRep::TimeUtil.unpack payload</code>
6389
+ </li>
6390
+
6391
+ <li class="missed" data-hits="0" data-linenumber="178">
6392
+
6393
+
6394
+ <code class="ruby"> @data.time = time</code>
6395
+ </li>
6396
+
6397
+ <li class="missed" data-hits="0" data-linenumber="179">
6398
+
6399
+
6400
+ <code class="ruby"> return time</code>
6401
+ </li>
6402
+
6403
+ <li class="missed" data-hits="0" data-linenumber="180">
6404
+
6405
+
6406
+ <code class="ruby"> end</code>
6407
+ </li>
6408
+
6409
+ <li class="missed" data-hits="0" data-linenumber="181">
6410
+
6411
+
6412
+ <code class="ruby"></code>
6413
+ </li>
6414
+
6415
+ <li class="missed" data-hits="0" data-linenumber="182">
6416
+
6417
+
6418
+ <code class="ruby"> def convert_bytes_to_string(bytes)</code>
6419
+ </li>
6420
+
6421
+ <li class="missed" data-hits="0" data-linenumber="183">
6422
+
6423
+
6424
+ <code class="ruby"> bytes.unpack(&#39;H*&#39;)[0]</code>
6425
+ </li>
6426
+
6427
+ <li class="missed" data-hits="0" data-linenumber="184">
6428
+
6429
+
6430
+ <code class="ruby"> end</code>
6431
+ </li>
6432
+
6433
+ <li class="missed" data-hits="0" data-linenumber="185">
6434
+
6435
+
6436
+ <code class="ruby"> end</code>
6437
+ </li>
6438
+
6439
+ <li class="missed" data-hits="0" data-linenumber="186">
6440
+
6441
+
6442
+ <code class="ruby">end</code>
6443
+ </li>
6444
+
6445
+ </ol>
6446
+ </pre>
6447
+ </div>
6448
+
5295
6449
  <div class="source_table" id="1fa9099a69ac9fedd79846842381b07491658c37">
5296
6450
  <div class="header">
5297
6451
  <h3>lib/codin_rep/set_time.rb</h3>
@@ -6143,7 +7297,7 @@
6143
7297
  <li class="covered" data-hits="1" data-linenumber="22">
6144
7298
  <span class="hits">1</span>
6145
7299
 
6146
- <code class="ruby"> VERSION = &quot;0.1.0&quot;.freeze</code>
7300
+ <code class="ruby"> VERSION = &quot;0.2.0&quot;.freeze</code>
6147
7301
  </li>
6148
7302
 
6149
7303
  <li class="never" data-hits="" data-linenumber="23">