Module: Inform::Taggable

Includes:
TagHelpers
Included in:
Object
Defined in:
lib/story_teller/inform/ephemeral/tag.rb

Overview

The Inform::Taggable module

Instance Method Summary collapse

Methods included from TagHelpers

#attributes, #has, #has?, #hasany?, #hasnt, #hasnt?

Instance Method Details

#nil_safe_tagsObject



217
218
219
220
221
222
223
224
# File 'lib/story_teller/inform/ephemeral/tag.rb', line 217

def nil_safe_tags
  attempt_twice do
    log.warn "The tags for #{self} is nil" if self.tags.nil?
    # TODO: FIXME
    # Perhaps try adding a semaphore lock here around tags
    self.tags.compact.map(&:to_s).map(&:intern)
  end || Array::Empty
end

#tag(*args) ⇒ Object

rubocop: disable Metrics/AbcSize



165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/story_teller/inform/ephemeral/tag.rb', line 165

def tag(*args)
  # TODO: Generalize workflag to system flags
  workflags.add(self.identity) if args.delete(:workflag)
  a = self.tag_names args
  (a - (self.nil_safe_tags & a)).each do |tag|
    if Inform::Tag.respond_to?(:find_or_create)
      add_tag(Inform::Tag.find_or_create(name: tag.to_s))
    else
      add_tag(tags.find { |tag| tag.name == tag.to_s } || Inform::Tag.new(tag.to_s))
    end
  end
  self.save_changes if self.respond_to?(:save_changes)
end

#tag_names(a) ⇒ Object



213
214
215
# File 'lib/story_teller/inform/ephemeral/tag.rb', line 213

def tag_names(a)
  a.flatten.map(&:to_s).map(&:intern)
end

#tagged_with?(tag) ⇒ Boolean

Returns:

  • (Boolean)


190
191
192
# File 'lib/story_teller/inform/ephemeral/tag.rb', line 190

def tagged_with?(tag)
  tagged_with_any? tag
end

#tagged_with_all?(*args) ⇒ Boolean

Returns:

  • (Boolean)


194
195
196
197
198
199
# File 'lib/story_teller/inform/ephemeral/tag.rb', line 194

def tagged_with_all?(*args)
  # TODO: Generalize workflag to system flags
  return workflags.include?(self.identity) if args.delete(:workflag)
  a = self.tag_names(args)
  (self.nil_safe_tags & a).length == a.length
end

#tagged_with_any?(*args) ⇒ Boolean

Returns:

  • (Boolean)


201
202
203
204
# File 'lib/story_teller/inform/ephemeral/tag.rb', line 201

def tagged_with_any?(*args)
  # TODO: Generalize workflag to system flags
  (args.delete(:workflag) && workflags.include?(self.identity)) || !self.tagged_with_none?(*tag_names(args))
end

#tagged_with_none?(*args) ⇒ Boolean

Returns:

  • (Boolean)


206
207
208
209
210
211
# File 'lib/story_teller/inform/ephemeral/tag.rb', line 206

def tagged_with_none?(*args)
  # TODO: Generalize workflag to system flags
  # puts "workflags: #{workflags}" if args.include?(:workflag)
  return false if args.delete(:workflag) && workflags.include?(self.identity)
  !nil_safe_tags.intersect?(tag_names(args))
end

#untag(*args) ⇒ Object Also known as: tag!

rubocop: enable Metrics/AbcSize



180
181
182
183
184
185
186
187
# File 'lib/story_teller/inform/ephemeral/tag.rb', line 180

def untag(*args)
  # TODO: Generalize workflag to system flags
  workflags.delete(self.identity) if args.delete(:workflag)
  (self.nil_safe_tags & tag_names(args)).each do |tag|
    remove_tag Inform::Tag.find(name: tag.to_s)
  end
  self.save_changes if self.respond_to?(:save_changes)
end