needle_in_a_haystack 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0d636da24994074ca2e0d360e34eb2cbb71b18fd5a7af9b5940357069c2c99c
4
- data.tar.gz: 04c8d8ef066aede9ef052a1aa5a619959a3b40927d89699912e462a919ce91e5
3
+ metadata.gz: b329760e8ef018728c47465a1a0aacf1b83a3e89562f4a0e1ecfe703c01fc3e5
4
+ data.tar.gz: 2e6d30cdc898b73a9e05f7210b3dc3e5294bdb6bd844dbb7bbfeb5e02e0b4afc
5
5
  SHA512:
6
- metadata.gz: e46870a3a6ffa25cdd61dec219bbfcd520e27a991ad8e38ba63deb69082394226e50060dae345151cbc264590a9d88cf5337509d94694e942759fe9f96ec1a89
7
- data.tar.gz: f6ec23b578c01343a147493622f9f4e32d16dee03f92359b9fba0815dda00b04f2084b8391a96d0cc673380f452603d8811120d4652a69c1c7ad5a6c6b6b53bf
6
+ metadata.gz: 429d11b80631e4b7a9cac61ad46f2c6655f74e599240d52f970cf83ac92269918756417bd58f2e2bb30cb0bc88eecf667395a82826599478b977b6765c6db034
7
+ data.tar.gz: ea62403765551a28022f267fc3d829fe86d0a28cc2afd5f9b43e4c049f1bcd8d497e41cc67b382c860dded4723c87786d3a94d5b2ce5208815dbee8e85ae0a0d
@@ -0,0 +1,255 @@
1
+ site:
2
+ description: Een geografische locatie in de gebouwde omgeving
3
+ children:
4
+ building:
5
+ description: Een structuur op een site
6
+ children:
7
+ floor:
8
+ description: Een verdieping in een gebouw
9
+ children:
10
+ area:
11
+ description: Een driedimensionale ruimte in de gebouwde omgeving
12
+ children:
13
+ room:
14
+ description: Een afgesloten ruimte binnen een gebouw
15
+ bathRoom:
16
+ description: Een ruimte met sanitaire voorzieningen
17
+ kitchen:
18
+ description: Een ruimte voor het bereiden van voedsel
19
+ bedRoom:
20
+ description: Een slaapkamer
21
+ openSpace:
22
+ description: Een open ruimte binnen een gebouw
23
+ corridor:
24
+ description: Een gang die verschillende ruimtes verbindt
25
+ lobby:
26
+ description: Een ontvangstruimte of hal in een gebouw
27
+ office:
28
+ description: Een werkruimte binnen een gebouw
29
+ conferenceRoom:
30
+ description: Een vergaderruimte binnen een gebouw
31
+ storage:
32
+ description: Een opslagruimte binnen een gebouw
33
+ mechanicalRoom:
34
+ description: Een ruimte voor mechanische apparatuur en installaties
35
+ electricalRoom:
36
+ description: Een ruimte voor elektrische apparatuur en installaties
37
+
38
+ equip:
39
+ description: Apparatuur asset
40
+ children:
41
+ meter:
42
+ description: Meetapparaat voor verbruik
43
+ children:
44
+ elecMeter:
45
+ description: Elektriciteitsmeter
46
+ children:
47
+ smartMeter:
48
+ description: Slimme meter voor elektriciteit
49
+ intervalMeter:
50
+ description: Intervalmeter voor elektriciteit
51
+ meterbeheer:
52
+ description: Meterbeheer elektriciteitsmeter
53
+ fudura:
54
+ description: Fudura elektriciteitsmeter
55
+ gasMeter:
56
+ description: Gasmeter
57
+ children:
58
+ smartMeter:
59
+ description: Slimme meter voor gas
60
+ intervalMeter:
61
+ description: Intervalmeter voor gas
62
+ meterbeheer:
63
+ description: Meterbeheer gasmeter
64
+ fudura:
65
+ description: Fudura gasmeter
66
+ waterMeter:
67
+ description: Watermeter
68
+ climateMeter:
69
+ description: Klimaatmeter
70
+ children:
71
+ tempMeter:
72
+ description: Temperatuurmeter
73
+ co2Meter:
74
+ description: CO2-meter
75
+ humidityMeter:
76
+ description: Luchtvochtigheidsmeter
77
+ loraMeter:
78
+ description: LoRa klimaatmeter voor temperatuur, luchtvochtigheid en CO2
79
+
80
+ weatherStation:
81
+ description: Weerstation voor meteorologische gegevens
82
+ children:
83
+ onlineWeather:
84
+ description: Online weerstation via api of website
85
+ hvac:
86
+ description: Verwarming, ventilatie en airconditioning
87
+ children:
88
+ ahu:
89
+ description: Luchtbehandelingskast
90
+ vav:
91
+ description: Variable Air Volume box
92
+ fcu:
93
+ description: Fan Coil Unit
94
+ chiller:
95
+ description: Koelmachine
96
+ boiler:
97
+ description: Verwarmingsketel
98
+ heatPump:
99
+ description: Warmtepomp
100
+ lighting:
101
+ description: Verlichtingssystemen
102
+ children:
103
+ luminaire:
104
+ description: Armatuur
105
+ lightSensor:
106
+ description: Lichtsensor
107
+ occupancySensor:
108
+ description: Aanwezigheidssensor
109
+ security:
110
+ description: Beveiligingssystemen
111
+ children:
112
+ accessControl:
113
+ description: Toegangscontrolesysteem
114
+ cctv:
115
+ description: Camerabewakingssysteem
116
+
117
+ # Datapunten
118
+ point:
119
+ description: Datapunt zoals een sensor of actuator
120
+ children:
121
+ sensor:
122
+ description: Meetpunt
123
+ children:
124
+ temp:
125
+ description: Temperatuursensor
126
+ children:
127
+ tempIndoor:
128
+ description: Binnentemperatuursensor
129
+ tempOutdoor:
130
+ description: Buitentemperatuursensor
131
+ co2:
132
+ description: CO2-sensor
133
+ humidity:
134
+ description: Luchtvochtigheidssensor
135
+ pressure:
136
+ description: Druksensor
137
+ flow:
138
+ description: Stromingssensor
139
+ power:
140
+ description: Vermogenssensor
141
+ energy:
142
+ description: Energiesensor
143
+ occupancy:
144
+ description: Bezettingssensor
145
+ cmd:
146
+ description: Commandopunt
147
+ children:
148
+ onOff:
149
+ description: Aan/uit commando
150
+ setpoint:
151
+ description: Instelpunt
152
+ sp:
153
+ description: Setpoint
154
+ children:
155
+ tempSp:
156
+ description: Temperatuur setpoint
157
+ humiditySp:
158
+ description: Luchtvochtigheid setpoint
159
+ pressureSp:
160
+ description: Druk setpoint
161
+ status:
162
+ description: Statuspunt
163
+ children:
164
+ alarm:
165
+ description: Alarmpunt
166
+ fault:
167
+ description: Foutpunt
168
+
169
+ # Energiebronnen
170
+ substance:
171
+ description: Energiebron of medium
172
+ children:
173
+ elec:
174
+ description: Elektriciteit
175
+ gas:
176
+ description: Gas
177
+ water:
178
+ description: Water
179
+ steam:
180
+ description: Stoom
181
+ oil:
182
+ description: Olie
183
+
184
+ # Metingen en eenheden
185
+ measurement:
186
+ description: Meetbare eigenschappen
187
+ children:
188
+ temp:
189
+ description: Temperatuur
190
+ humidity:
191
+ description: Luchtvochtigheid
192
+ co2:
193
+ description: Koolstofdioxide concentratie
194
+ pressure:
195
+ description: Druk
196
+ flow:
197
+ description: Stroming
198
+ power:
199
+ description: Vermogen
200
+ energy:
201
+ description: Energie
202
+ voltage:
203
+ description: Spanning
204
+ current:
205
+ description: Stroom
206
+ frequency:
207
+ description: Frequentie
208
+ luminosity:
209
+ description: Lichtsterkte
210
+
211
+ # Tijdgerelateerde tags
212
+ occupied:
213
+ description: Bezettingsstatus
214
+ schedule:
215
+ description: Tijdschema
216
+ timezone:
217
+ description: Tijdzone
218
+
219
+ # Netwerkgerelateerde tags
220
+ network:
221
+ description: Netwerkgerelateerde informatie
222
+ children:
223
+ protocol:
224
+ description: Communicatieprotocol
225
+ children:
226
+ bacnet:
227
+ description: BACnet protocol
228
+ modbus:
229
+ description: Modbus protocol
230
+ knx:
231
+ description: KNX protocol
232
+ lonworks:
233
+ description: LonWorks protocol
234
+ ipAddr:
235
+ description: IP-adres
236
+ mac:
237
+ description: MAC-adres
238
+
239
+ # Metadata tags
240
+ id:
241
+ description: Unieke identifier
242
+ dis:
243
+ description: Weergavenaam
244
+ area:
245
+ description: Oppervlakte
246
+ vol:
247
+ description: Volume
248
+ manufacturer:
249
+ description: Fabrikant
250
+ model:
251
+ description: Model
252
+ serialNum:
253
+ description: Serienummer
254
+ installationDate:
255
+ description: Installatiedatum
@@ -1,9 +1,6 @@
1
- module Taggable
2
- extend ActiveSupport::Concern
3
-
4
- included do
5
- serialize :tags, JSON
6
- end
1
+ class Taggable < ApplicationRecord
2
+ has_many :haystack_taggings, as: :taggable, dependent: :destroy
3
+ has_many :haystack_tags, through: :haystack_taggings
7
4
 
8
5
  def add_haystack_marker(marker)
9
6
  self.tags ||= {}
@@ -16,7 +16,11 @@ class HaystackFactory < BaseFactory
16
16
 
17
17
  def find_or_create_tag(name, attributes = {})
18
18
  tag = HaystackTag.find_or_create_by(name: name)
19
- @tag_strategy.update_tag(tag, attributes)
19
+ if tag.persisted?
20
+ @tag_strategy.update_tag(tag, attributes)
21
+ else
22
+ tag.update(attributes)
23
+ end
20
24
  tag
21
25
  end
22
26
 
@@ -29,10 +33,7 @@ class HaystackFactory < BaseFactory
29
33
 
30
34
  Rails.logger.info("Created tag: #{tag.name}, Parent: #{parent_tag&.name}, Parent ID: #{parent_tag&.id}")
31
35
 
32
- if data["children"]
33
- Rails.logger.info("Processing children for tag: #{tag.name}")
34
- create_tags(data["children"], tag)
35
- end
36
+ create_tags(data["children"], tag) if data["children"]
36
37
  end
37
38
  end
38
39
  end
@@ -1,18 +1,24 @@
1
+ require "yaml"
2
+
1
3
  class HaystackTag < BaseTag
2
4
  belongs_to :parent_tag, class_name: "HaystackTag", optional: true
3
5
  has_many :children, class_name: "HaystackTag", foreign_key: "parent_tag_id", dependent: :destroy, inverse_of: :parent_tag
4
6
  has_many :haystack_taggings, dependent: :destroy
5
- has_many :taggables, through: :haystack_taggings, source: :taggable
7
+ has_many :taggables, through: :haystack_taggings, source: :taggable, source_type: "Taggable"
6
8
 
7
- validates :name, presence: true, uniqueness: true
9
+ validates :name, presence: true, uniqueness: { scope: :parent_tag_id, message: "Moet uniek zijn binnen dezelfde categorie" }
8
10
  validates :description, presence: true
9
11
  validate :prevent_circular_reference
12
+ validate :ensure_identity
13
+
14
+ CATEGORIES = YAML.load_file("lib/haystack_ontology.yml")
10
15
 
11
16
  def ancestors
12
17
  ancestors = []
13
18
  current = self
14
19
  while current.parent_tag
15
20
  break if ancestors.include?(current.parent_tag) # Voorkom oneindige lus
21
+
16
22
  ancestors << current.parent_tag
17
23
  current = current.parent_tag
18
24
  end
@@ -20,13 +26,13 @@ class HaystackTag < BaseTag
20
26
  end
21
27
 
22
28
  def full_path
23
- ancestors.reverse.map(&:name).join(" > ") + " > " + name
29
+ "#{ancestors.reverse.map(&:name).join(' > ')} > #{name}"
24
30
  end
25
31
 
26
32
  def self.find_by_path(path)
27
33
  keys = path.split(".")
28
34
  current = nil
29
- keys.each do |key|
35
+ keys.each do |key|
30
36
  current = current ? current.children.find_by(name: key) : find_by(name: key)
31
37
  return nil unless current
32
38
  end
@@ -53,11 +59,24 @@ class HaystackTag < BaseTag
53
59
  ancestors.size
54
60
  end
55
61
 
62
+ def category
63
+ ancestors.empty? ? name : parent_tag.category
64
+ end
65
+
56
66
  private
57
67
 
58
68
  def prevent_circular_reference
59
- if parent_tag == self || ancestors.include?(self)
60
- errors.add(:parent_tag, "kan geen circulaire referentie bevatten")
61
- end
69
+ return unless parent_tag == self || ancestors.include?(self)
70
+
71
+ errors.add(:parent_tag, "Kan geen circulaire referentie bevatten")
72
+ end
73
+
74
+ def ensure_identity
75
+ return if root? && name == category
76
+
77
+ return unless HaystackTag.where(name: name).any? { |tag| tag.category == category }
78
+
79
+ Rails.logger.error("Duplicate tag found: #{name} within category: #{category}")
80
+ errors.add(:name, "Moet uniek zijn binnen dezelfde categorie")
62
81
  end
63
82
  end
@@ -1 +1 @@
1
- VERSION = "1.0.5".freeze
1
+ VERSION = "1.0.6".freeze
@@ -7,12 +7,13 @@ require "needle_in_a_haystack/concerns/base_tag"
7
7
  require "needle_in_a_haystack/factories/base_factory"
8
8
 
9
9
  require "needle_in_a_haystack/models/haystack_ontology"
10
+ require "needle_in_a_haystack/concerns/taggable"
10
11
  require "needle_in_a_haystack/models/haystack_tag"
11
12
  require "needle_in_a_haystack/models/haystack_tagging"
12
13
  require "needle_in_a_haystack/factories/haystack_factory"
13
14
  require "needle_in_a_haystack/strategies/query_context"
14
15
  require "needle_in_a_haystack/strategies/query_strategy"
15
- require "needle_in_a_haystack/strategies/find_by_tag_strategy"
16
+ require "needle_in_a_haystack/strategies/find_by_tags_strategy"
16
17
  require "needle_in_a_haystack/strategies/find_point_by_tag_strategy"
17
18
  require "needle_in_a_haystack/strategies/find_points_with_multiple_tags_strategy"
18
19
  require "needle_in_a_haystack/strategies/tag_strategy"
@@ -1,5 +1,5 @@
1
1
  FactoryBot.define do
2
- factory :haystack_tag, class: "NeedleInAHaystack::HaystackTag" do
2
+ factory :haystack_tag, class: "HaystackTag" do
3
3
  sequence(:name) { |n| "Tag #{n}" }
4
4
  sequence(:description) { |n| "Description #{n}" }
5
5
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: needle_in_a_haystack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frans Verberne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-05 00:00:00.000000000 Z
11
+ date: 2024-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bcrypt_pbkdf
@@ -275,6 +275,7 @@ files:
275
275
  - config/initializers/redis.rb
276
276
  - config/initializers/wrap_parameters.rb
277
277
  - config/locales/en.yml
278
+ - lib/haystack_ontology.yml
278
279
  - lib/needle_in_a_haystack.rb
279
280
  - lib/needle_in_a_haystack/application_record.rb
280
281
  - lib/needle_in_a_haystack/concerns/base_tag.rb
@@ -288,7 +289,7 @@ files:
288
289
  - lib/needle_in_a_haystack/models/haystack_tag.rb
289
290
  - lib/needle_in_a_haystack/models/haystack_tagging.rb
290
291
  - lib/needle_in_a_haystack/strategies/default_tag_strategy.rb
291
- - lib/needle_in_a_haystack/strategies/find_by_tag_strategy.rb
292
+ - lib/needle_in_a_haystack/strategies/find_by_tags_strategy.rb
292
293
  - lib/needle_in_a_haystack/strategies/find_point_by_tag_strategy.rb
293
294
  - lib/needle_in_a_haystack/strategies/find_points_with_multiple_tags_strategy.rb
294
295
  - lib/needle_in_a_haystack/strategies/ontology_tag_strategy.rb
@@ -318,7 +319,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
318
319
  - !ruby/object:Gem::Version
319
320
  version: '0'
320
321
  requirements: []
321
- rubygems_version: 3.5.22
322
+ rubygems_version: 3.5.18
322
323
  signing_key:
323
324
  specification_version: 4
324
325
  summary: Models and dependencies shared across our projects.