tbd 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +3 -0
  3. data/.github/workflows/pull_request.yml +72 -0
  4. data/.gitignore +23 -0
  5. data/.rspec +3 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE.md +21 -0
  8. data/README.md +154 -0
  9. data/Rakefile +60 -0
  10. data/json/midrise.json +64 -0
  11. data/json/tbd_5ZoneNoHVAC.json +19 -0
  12. data/json/tbd_5ZoneNoHVAC_btap.json +91 -0
  13. data/json/tbd_seb_n2.json +41 -0
  14. data/json/tbd_seb_n4.json +57 -0
  15. data/json/tbd_warehouse10.json +24 -0
  16. data/json/tbd_warehouse5.json +37 -0
  17. data/lib/measures/tbd/LICENSE.md +21 -0
  18. data/lib/measures/tbd/README.md +136 -0
  19. data/lib/measures/tbd/README.md.erb +42 -0
  20. data/lib/measures/tbd/docs/.gitkeep +1 -0
  21. data/lib/measures/tbd/measure.rb +327 -0
  22. data/lib/measures/tbd/measure.xml +460 -0
  23. data/lib/measures/tbd/resources/geo.rb +714 -0
  24. data/lib/measures/tbd/resources/geometry.rb +351 -0
  25. data/lib/measures/tbd/resources/model.rb +1431 -0
  26. data/lib/measures/tbd/resources/oslog.rb +381 -0
  27. data/lib/measures/tbd/resources/psi.rb +2229 -0
  28. data/lib/measures/tbd/resources/tbd.rb +55 -0
  29. data/lib/measures/tbd/resources/transformation.rb +121 -0
  30. data/lib/measures/tbd/resources/ua.rb +986 -0
  31. data/lib/measures/tbd/resources/utils.rb +1636 -0
  32. data/lib/measures/tbd/resources/version.rb +3 -0
  33. data/lib/measures/tbd/tests/tbd_full_PSI.json +17 -0
  34. data/lib/measures/tbd/tests/tbd_tests.rb +222 -0
  35. data/lib/tbd/geo.rb +714 -0
  36. data/lib/tbd/psi.rb +2229 -0
  37. data/lib/tbd/ua.rb +986 -0
  38. data/lib/tbd/version.rb +25 -0
  39. data/lib/tbd.rb +93 -0
  40. data/sponsors/canada.png +0 -0
  41. data/sponsors/quebec.png +0 -0
  42. data/tbd.gemspec +43 -0
  43. data/tbd.schema.json +571 -0
  44. data/v291_MacOS.md +110 -0
  45. metadata +191 -0
@@ -0,0 +1,381 @@
1
+ # BSD 3-Clause License
2
+ #
3
+ # Copyright (c) 2022, Denis Bourgeois
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # 1. Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # 3. Neither the name of the copyright holder nor the names of its
17
+ # contributors may be used to endorse or promote products derived from
18
+ # this software without specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ module OSlg
32
+ DEBUG = 1
33
+ INFO = 2
34
+ WARN = 3
35
+ ERROR = 4
36
+ FATAL = 5
37
+
38
+ @@logs = []
39
+ @@level = INFO
40
+ @@status = 0
41
+
42
+ @@tag = []
43
+ @@tag[0 ] = ""
44
+ @@tag[DEBUG] = "DEBUG"
45
+ @@tag[INFO ] = "INFO"
46
+ @@tag[WARN ] = "WARNING"
47
+ @@tag[ERROR] = "ERROR"
48
+ @@tag[FATAL] = "FATAL"
49
+
50
+ @@msg = []
51
+ @@msg[0 ] = ""
52
+ @@msg[DEBUG] = "Debugging ..."
53
+ @@msg[INFO ] = "Success! No errors, no warnings"
54
+ @@msg[WARN ] = "Partial success, raised non-fatal warnings"
55
+ @@msg[ERROR] = "Partial success, encountered non-fatal errors"
56
+ @@msg[FATAL] = "Failure, triggered fatal errors"
57
+
58
+ ##
59
+ # Return log entries.
60
+ #
61
+ # @return [Array] current log entries
62
+ def logs
63
+ @@logs
64
+ end
65
+
66
+ ##
67
+ # Return current log level.
68
+ #
69
+ # @return [Integer] DEBUG, INFO, WARN, ERROR or FATAL
70
+ def level
71
+ @@level
72
+ end
73
+
74
+ ##
75
+ # Return current log status.
76
+ #
77
+ # @return [Integer] DEBUG, INFO, WARN, ERROR or FATAL
78
+ def status
79
+ @@status
80
+ end
81
+
82
+ ##
83
+ # Return whether current status is DEBUG
84
+ #
85
+ # @return [Bool] true if DEBUG
86
+ def debug?
87
+ @@status == DEBUG
88
+ end
89
+
90
+ ##
91
+ # Return whether current status is INFO
92
+ #
93
+ # @return [Bool] true if INFO
94
+ def info?
95
+ @@status == INFO
96
+ end
97
+
98
+ ##
99
+ # Return whether current status is WARN
100
+ #
101
+ # @return [Bool] true if WARN
102
+ def warn?
103
+ @@status == WARN
104
+ end
105
+
106
+ ##
107
+ # Return whether current status is ERROR
108
+ #
109
+ # @return [Bool] true if ERROR
110
+ def error?
111
+ @@status == ERROR
112
+ end
113
+
114
+ ##
115
+ # Return whether current status is FATAL
116
+ #
117
+ # @return [Bool] true if FATAL
118
+ def fatal?
119
+ @@status == FATAL
120
+ end
121
+
122
+ ##
123
+ # Return string equivalent of level
124
+ #
125
+ # @param level [Integer] DEBUG, INFO, WARN, ERROR or FATAL
126
+ #
127
+ # @return [String] "DEBUG", "INFO", "WARN", "ERROR" or "FATAL"
128
+ def tag(level)
129
+ return @@tag[level] if level >= DEBUG && level <= FATAL
130
+ ""
131
+ end
132
+
133
+ ##
134
+ # Return preset OSlg message linked to status.
135
+ #
136
+ # @param status [Integer] DEBUG, INFO, WARN, ERROR or FATAL
137
+ #
138
+ # @return [String] preset OSlg message
139
+ def msg(status)
140
+ return @@msg[status] if status >= DEBUG && status <= FATAL
141
+ ""
142
+ end
143
+
144
+ ##
145
+ # Set level.
146
+ #
147
+ # @param level [Integer] DEBUG, INFO, WARN, ERROR or FATAL
148
+ #
149
+ # @return [Integer] current level
150
+ def reset(level)
151
+ @@level = level if level >= DEBUG && level <= FATAL
152
+ end
153
+
154
+ ##
155
+ # Log new entry.
156
+ #
157
+ # @param level [Integer] DEBUG, INFO, WARN, ERROR or FATAL
158
+ # @param message [String] user-provided message
159
+ #
160
+ # @return [Integer] current status
161
+ def log(level = DEBUG, message = "")
162
+ if level >= DEBUG && level <= FATAL && level >= @@level
163
+ @@logs << {level: level, message: message}
164
+ @@status = level if level > @@status
165
+ end
166
+ @@status
167
+ end
168
+
169
+ ##
170
+ # Log template 'invalid object' message and return user-set object.
171
+ #
172
+ # @param id [String] invalid object identifier
173
+ # @param mth [String] calling method identifier
174
+ # @param ord [Integer] calling method argument order number of obj (optional)
175
+ # @param lvl [Integer] DEBUG, INFO, WARN, ERROR or FATAL (optional)
176
+ # @param res [Object] what to return (optional)
177
+ #
178
+ # @return [Object] return object if specified by user
179
+ # @return [Nil] nil if return object undefined
180
+ def invalid(id = "", mth = "", ord = 0, lvl = DEBUG, res = nil)
181
+ return res unless id.respond_to?(:to_s)
182
+ return res unless mth.respond_to?(:to_s)
183
+ return res unless ord.respond_to?(:to_i)
184
+ return res unless lvl.respond_to?(:to_i)
185
+
186
+ id = id.to_s.strip
187
+ mth = mth.to_s.strip
188
+ ord = ord.to_i
189
+ lvl = lvl.to_i
190
+
191
+ id = id[0...60] + " ..." if id.length > 60
192
+ return res if id.empty?
193
+
194
+ mth = mth[0...60] + " ..." if mth.length > 60
195
+ return res if mth.empty?
196
+
197
+ msg = "Invalid '#{id}' "
198
+ msg += "arg ##{ord} " if ord > 0
199
+ msg += "(#{mth})"
200
+ log(lvl, msg) if lvl >= DEBUG && lvl <= FATAL
201
+ res
202
+ end
203
+
204
+ ##
205
+ # Log template 'instance/class mismatch' message and return user-set object.
206
+ #
207
+ # @param id [String] mismatched object identifier
208
+ # @param obj [Object] object to validate
209
+ # @param cl [Class] target class
210
+ # @param mth [String] calling method identifier
211
+ # @param lvl [Integer] DEBUG, INFO, WARN, ERROR or FATAL (optional)
212
+ # @param res [Object] what to return (optional)
213
+ #
214
+ # @return [Object] return object if specified by user
215
+ # @return [Nil] nil if return object undefined
216
+ def mismatch(id = "", obj = nil, cl = nil, mth = "", lvl = DEBUG, res = nil)
217
+ return res unless id.respond_to?(:to_s)
218
+ return res unless cl.is_a?(Class)
219
+ return res if obj.is_a?(cl)
220
+ return res unless mth.respond_to?(:to_s)
221
+ return res unless lvl.respond_to?(:to_i)
222
+
223
+ mth = mth.to_s.strip
224
+ id = id.to_s.strip
225
+ lvl = lvl.to_i
226
+
227
+ id = id[0...60] + " ..." if id.length > 60
228
+ return res if id.empty?
229
+
230
+ mth = mth[0...60] + " ..." if mth.length > 60
231
+ return res if mth.empty?
232
+
233
+ msg = "'#{id}' #{obj.class}? expecting #{cl} (#{mth})"
234
+ log(lvl, msg) if lvl >= DEBUG && lvl <= FATAL
235
+ res
236
+ end
237
+
238
+ ##
239
+ # Log template 'missing hash key' message and return user-set object.
240
+ #
241
+ # @param id [String] Hash identifier
242
+ # @param hsh [Hash] hash to validate
243
+ # @param key [Object] missing key
244
+ # @param mth [String] calling method identifier
245
+ # @param lvl [Integer] DEBUG, INFO, WARN, ERROR or FATAL (optional)
246
+ # @param res [Object] what to return (optional)
247
+ #
248
+ # @return [Object] return object if specified by user
249
+ # @return [Nil] nil if return object undefined
250
+ def hashkey(id = "", hsh = {}, key = "", mth = "", lvl = DEBUG, res = nil)
251
+ return res unless id.respond_to?(:to_s)
252
+ return res unless hsh.is_a?(Hash)
253
+ return res if hsh.key?(key)
254
+ return res unless mth.respond_to?(:to_s)
255
+ return res unless lvl.respond_to?(:to_i)
256
+
257
+ id = id.to_s.strip
258
+ mth = mth.to_s.strip
259
+ lvl = lvl.to_i
260
+
261
+ id = id[0...60] + " ..." if id.length > 60
262
+ return res if id.empty?
263
+
264
+ mth = mth[0...60] + " ..." if mth.length > 60
265
+ return res if mth.empty?
266
+
267
+ msg = "Missing '#{key}' key in '#{id}' Hash (#{mth})"
268
+ log(lvl, msg) if lvl >= DEBUG && lvl <= FATAL
269
+ res
270
+ end
271
+
272
+ ##
273
+ # Log template 'empty (uninitialized)' message and return user-set object.
274
+ #
275
+ # @param id [String] empty object identifier
276
+ # @param mth [String] calling method identifier
277
+ # @param lvl [Integer] DEBUG, INFO, WARN, ERROR or FATAL (optional)
278
+ # @param res [Object] what to return (optional)
279
+ #
280
+ # @return [Object] return object if specified by user
281
+ # @return [Nil] nil if return object undefined
282
+ def empty(id = "", mth = "", lvl = DEBUG, res = nil)
283
+ return res unless id.respond_to?(:to_s)
284
+ return res unless mth.respond_to?(:to_s)
285
+ return res unless lvl.respond_to?(:to_i)
286
+
287
+ id = id.to_s.strip
288
+ mth = mth.to_s.strip
289
+ lvl = lvl.to_i
290
+
291
+ id = id[0...60] + " ..." if id.length > 60
292
+ return res if id.empty?
293
+
294
+ mth = mth[0...60] + " ..." if mth.length > 60
295
+ return res if mth.empty?
296
+
297
+ msg = "Empty '#{id}' (#{mth})"
298
+ log(lvl, msg) if lvl >= DEBUG && lvl <= FATAL
299
+ res
300
+ end
301
+
302
+ ##
303
+ # Log template 'near zero' message and return user-set object.
304
+ #
305
+ # @param id [String] zero object identifier
306
+ # @param mth [String] calling method identifier
307
+ # @param lvl [Integer] DEBUG, INFO, WARN, ERROR or FATAL (optional)
308
+ # @param res [Object] what to return (optional)
309
+ #
310
+ # @return [Object] return object if specified by user
311
+ # @return [Nil] nil if return object undefined
312
+ def zero(id = "", mth = "", lvl = DEBUG, res = nil)
313
+ return res unless id.respond_to?(:to_s)
314
+ return res unless mth.respond_to?(:to_s)
315
+ return res unless lvl.respond_to?(:to_i)
316
+
317
+ id = id.to_s.strip
318
+ mth = mth.to_s.strip
319
+ ord = ord.to_i
320
+ lvl = lvl.to_i
321
+
322
+ id = id[0...60] + " ..." if id.length > 60
323
+ return res if id.empty?
324
+
325
+ mth = mth[0...60] + " ..." if mth.length > 60
326
+ return res if mth.empty?
327
+
328
+ msg = "Zero '#{id}' (#{mth})"
329
+ log(lvl, msg) if lvl >= DEBUG && lvl <= FATAL
330
+ res
331
+ end
332
+
333
+ ##
334
+ # Log template 'negative' message and return user-set object.
335
+ #
336
+ # @param id [String] negative object identifier
337
+ # @param mth [String] calling method identifier
338
+ # @param lvl [Integer] DEBUG, INFO, WARN, ERROR or FATAL (optional)
339
+ # @param res [Object] what to return (optional)
340
+ #
341
+ # @return [Object] return object if specified by user
342
+ # @return [Nil] nil if return object undefined
343
+ def negative(id = "", mth = "", lvl = DEBUG, res = nil)
344
+ return res unless id.respond_to?(:to_s)
345
+ return res unless mth.respond_to?(:to_s)
346
+ return res unless lvl.respond_to?(:to_i)
347
+
348
+ id = id.to_s.strip
349
+ mth = mth.to_s.strip
350
+ ord = ord.to_i
351
+ lvl = lvl.to_i
352
+
353
+ id = id[0...60] + " ..." if id.length > 60
354
+ return res if id.empty?
355
+
356
+ mth = mth[0...60] + " ..." if mth.length > 60
357
+ return res if mth.empty?
358
+
359
+ msg = "Negative '#{id}' (#{mth})"
360
+ log(lvl, msg) if lvl >= DEBUG && lvl <= FATAL
361
+ res
362
+ end
363
+
364
+ ##
365
+ # Reset log status and entries.
366
+ #
367
+ # @return [Integer] current level
368
+ def clean!
369
+ @@status = 0
370
+ @@logs = []
371
+ @@level
372
+ end
373
+
374
+ ##
375
+ # Callback when other modules extend OSlg
376
+ #
377
+ # @param base [Object] instance or class object
378
+ def self.extended(base)
379
+ base.send(:include, self)
380
+ end
381
+ end