Class: FReCon::Position

Inherits:
Object show all
Defined in:
lib/frecon/position.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Position

Returns a new instance of Position.



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/frecon/position.rb', line 62

def initialize(*args)
	if args.length == 1
		# Match `string' against the regular expression, described below.
		#
		# This regular expression matches all values for `string' where
		# the first letter is either "r" or "b" (case-insensitive due to /i
		# at the end of the regular expression) and the last one-or-more
		# characters in the string are digits 0-9. Anything between those two
		# that is either a letter or an underscore is not retained, but
		# if other characters exist (e.g. spaces as of right now) `string'
		# will not match.
		#
		# You can use any words you like if you have more than just
		# "r<n>" or "b<n>", for example "red_2" matches just the same
		# as "r2", or, just for fun, just the same as "royal______2".
		#
		# This behavior may change in the future.
		match_data = args[0].match(/^([rb])[a-z\_]*([0-9]+)/i)

		# Note: if matched at all, match_data[0] is the entire
		# string that was matched, hence the indices that start
		# at one.

		raise ArgumentError, "string is improperly formatted" unless match_data

		@alliance = case match_data[1].downcase
		            when "b"
			            :blue
		            when "r"
			            :red
		            else
			            raise ArgumentError, "alliance character must be in [\"b\", \"r\"]"
		            end

		position_number = match_data[2].to_i
		raise ArgumentError, "position number must be in [1, 2, 3]" unless [1, 2, 3].include?(position_number)

		@number = position_number
	elsif args.length == 2
		raise TypeError, "alliance must be a Symbol or String" unless args[0].is_a?(Symbol) || args[0].is_a?(String)
		raise ArgumentError, "alliance must be in [:blue, :red]" unless [:blue, :red].include?(args[0].to_sym)

		@alliance = args[0].to_sym

		raise TypeError, "second argument must be an Integer" unless args[1].is_an?(Integer)
		raise ArgumentError, "second argument must be in [1, 2, 3]" unless [1, 2, 3].include?(args[1])

		@number = args[1]
	else
		raise ArgumentError, "wrong number of arguments (#{args.length} for [1, 2])"
	end
end

Instance Attribute Details

#allianceObject (readonly)

Returns the value of attribute alliance.



14
15
16
# File 'lib/frecon/position.rb', line 14

def alliance
  @alliance
end

#numberObject (readonly)

Returns the value of attribute number.



14
15
16
# File 'lib/frecon/position.rb', line 14

def number
  @number
end

Class Method Details

.demongoize(object) ⇒ Object

MongoDB compatibility methods.

Raises:

  • (ArgumentError)


17
18
19
20
21
22
23
# File 'lib/frecon/position.rb', line 17

def self.demongoize(object)
	# `object' should *always* be a string (since MatchNumber#mongoize returns a
	# String which is what is stored in the database)
	raise ArgumentError, "`object' must be a String" unless object.is_a?(String)

	Position.new(object)
end

.evolve(object) ⇒ Object

Used for queries.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/frecon/position.rb', line 43

def self.evolve(object)
	case object
	when Position
		object.mongoize
	when String
		Position.new(object).mongoize
	when Hash
		# Convert keys to symbols if necessary.
		object = Hash[object.map { |key, value| [key.to_sym, value] }]
		Position.new(object[:alliance], object[:number]).mongoize
	else
		object
	end
end

.mongoize(object) ⇒ Object

Allows passing a String or Hash instead of a Position. i.e. record.position = “r3”



27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/frecon/position.rb', line 27

def self.mongoize(object)
	case object
	when Position
		object.mongoize
	when String
		Position.new(object).mongoize
	when Hash
		# Convert keys to symbols if necessary.
		object = Hash[object.map { |key, value| [key.to_sym, value] }]
		Position.new(object[:alliance], object[:number]).mongoize
	else
		object
	end
end

Instance Method Details

#is_blue?Boolean Also known as: was_blue?

Returns:

  • (Boolean)


119
120
121
# File 'lib/frecon/position.rb', line 119

def is_blue?
	@alliance == :blue
end

#is_red?Boolean Also known as: was_red?

Returns:

  • (Boolean)


123
124
125
# File 'lib/frecon/position.rb', line 123

def is_red?
	@alliance == :red
end

#mongoizeObject



58
59
60
# File 'lib/frecon/position.rb', line 58

def mongoize
	to_s
end

#to_sObject



115
116
117
# File 'lib/frecon/position.rb', line 115

def to_s
	"#{@alliance[0]}#{@number}"
end