frecon 1.3.1 → 1.3.2
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 +4 -4
- data/Gemfile +1 -1
- data/Rakefile +2 -2
- data/lib/frecon/base/bson.rb +1 -1
- data/lib/frecon/base/environment.rb +10 -10
- data/lib/frecon/base/variables.rb +2 -2
- data/lib/frecon/base.rb +4 -4
- data/lib/frecon/console.rb +4 -4
- data/lib/frecon/controller.rb +9 -9
- data/lib/frecon/controllers/competitions_controller.rb +2 -2
- data/lib/frecon/controllers/dump_controller.rb +5 -5
- data/lib/frecon/controllers/matches_controller.rb +2 -2
- data/lib/frecon/controllers/participations_controller.rb +2 -2
- data/lib/frecon/controllers/records_controller.rb +2 -2
- data/lib/frecon/controllers/robots_controller.rb +2 -2
- data/lib/frecon/controllers/teams_controller.rb +2 -2
- data/lib/frecon/controllers.rb +10 -10
- data/lib/frecon/database.rb +9 -9
- data/lib/frecon/match_number.rb +33 -33
- data/lib/frecon/model.rb +8 -8
- data/lib/frecon/models/competition.rb +6 -6
- data/lib/frecon/models/match.rb +7 -7
- data/lib/frecon/models/participation.rb +6 -6
- data/lib/frecon/models/record.rb +7 -7
- data/lib/frecon/models/robot.rb +6 -6
- data/lib/frecon/models/team.rb +6 -6
- data/lib/frecon/models.rb +6 -6
- data/lib/frecon/mongoid/criteria.rb +7 -7
- data/lib/frecon/position.rb +13 -13
- data/lib/frecon/request_error.rb +1 -1
- data/lib/frecon/routes.rb +20 -20
- data/lib/frecon/scraper.rb +8 -8
- data/lib/frecon/scrapers.rb +1 -1
- data/lib/frecon/server.rb +8 -8
- data/lib/frecon.rb +15 -15
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca8d8f19739e084e910a26abb0aced06a7d9d27b
|
4
|
+
data.tar.gz: fe2a74382f77dcc3c2b22b9c86b33ae41f521e63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b63c78b3b9994ed34d297d73b8aa7608da1394d9b96a0876c6f6f87b26d8f061beb7f0885c91da46a1c56f26348dffd9b620f424418d71fd50b38a3b7d92ee8
|
7
|
+
data.tar.gz: e06dea7ca098a75ef22c12b6ad0982e02f6575a83e46da6cf2cb387a2c46f47e4a642b3a2ad95b2a576f9a3afb32981e98ea431c1e6dc6027a6ea7c3bff41cef
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'yard'
|
2
2
|
|
3
3
|
YARD::Config.load_plugin('tomdoc')
|
4
4
|
YARD::Config.load_plugin('mongoid')
|
@@ -14,7 +14,7 @@ namespace :docs do
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
require
|
17
|
+
require 'rspec/core/rake_task'
|
18
18
|
|
19
19
|
RSpec::Core::RakeTask.new(:spec)
|
20
20
|
|
data/lib/frecon/base/bson.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'yaml'
|
2
2
|
|
3
3
|
module FReCon
|
4
4
|
|
@@ -8,7 +8,7 @@ module FReCon
|
|
8
8
|
|
9
9
|
# Public: The configuration Hash for the server-related configuration.
|
10
10
|
#
|
11
|
-
# Keys will typically include
|
11
|
+
# Keys will typically include 'port', 'host', etc.
|
12
12
|
attr_accessor :server
|
13
13
|
|
14
14
|
# Public: The configuration Hash for the console-related configuration.
|
@@ -16,7 +16,7 @@ module FReCon
|
|
16
16
|
|
17
17
|
# Public: The configuration Hash for the database-related configuration.
|
18
18
|
#
|
19
|
-
# Keys will typically include
|
19
|
+
# Keys will typically include 'mongoid', which should be a Hash
|
20
20
|
# representation of a valid mongoid.yml file.
|
21
21
|
attr_accessor :database
|
22
22
|
|
@@ -68,11 +68,11 @@ module FReCon
|
|
68
68
|
configuration.merge(system || {})
|
69
69
|
configuration.merge(user || {})
|
70
70
|
|
71
|
-
# Grab out the
|
71
|
+
# Grab out the 'server', 'console', and 'database' values from the
|
72
72
|
# configuration and store those in the appropriate instance variables.
|
73
|
-
@server = configuration[
|
74
|
-
@console = configuration[
|
75
|
-
@database = configuration[
|
73
|
+
@server = configuration['server'] || {}
|
74
|
+
@console = configuration['console'] || {}
|
75
|
+
@database = configuration['database'] || {}
|
76
76
|
|
77
77
|
configuration
|
78
78
|
end
|
@@ -110,7 +110,7 @@ module FReCon
|
|
110
110
|
|
111
111
|
# Public: Generate the filename for the defaults configuration file.
|
112
112
|
def default_configuration_filename
|
113
|
-
File.expand_path(File.join(File.dirname(__FILE__),
|
113
|
+
File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'config', 'default.yml'))
|
114
114
|
end
|
115
115
|
|
116
116
|
# Public: Generate the filename for the system configuration file.
|
@@ -139,7 +139,7 @@ module FReCon
|
|
139
139
|
end
|
140
140
|
|
141
141
|
# Public: Validate a value for @variable.
|
142
|
-
#
|
142
|
+
#
|
143
143
|
# Checks the value for @variable against a list of valid environments.
|
144
144
|
def validate_symbol(symbol)
|
145
145
|
raise ArgumentError, "Environment variable is not one of #{self.valid_environments}" unless
|
@@ -155,7 +155,7 @@ module FReCon
|
|
155
155
|
|
156
156
|
# Public: Return a Hash representing the default server settings.
|
157
157
|
def server_defaults
|
158
|
-
{
|
158
|
+
{'host' => 'localhost', 'port' => 4567}
|
159
159
|
end
|
160
160
|
|
161
161
|
# Public: Return a Hash representing the default console settings.
|
@@ -7,12 +7,12 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'frecon/base/environment'
|
11
11
|
|
12
12
|
# Public: The FReCon API module.
|
13
13
|
module FReCon
|
14
14
|
# Public: A String representing the current version of FReCon.
|
15
|
-
VERSION =
|
15
|
+
VERSION = '1.3.2'
|
16
16
|
|
17
17
|
# Public: An Environment representing the system execution environment.
|
18
18
|
ENVIRONMENT = Environment.new(:development)
|
data/lib/frecon/base.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
10
|
+
require 'frecon/base/bson'
|
11
|
+
require 'frecon/base/object'
|
12
|
+
require 'frecon/base/environment'
|
13
|
+
require 'frecon/base/variables'
|
data/lib/frecon/console.rb
CHANGED
@@ -7,9 +7,9 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
10
|
+
require 'frecon/base/variables'
|
11
|
+
require 'frecon/database'
|
12
|
+
require 'frecon/server'
|
13
13
|
|
14
14
|
module FReCon
|
15
15
|
# Public: The wrapper system for a pry console.
|
@@ -20,7 +20,7 @@ module FReCon
|
|
20
20
|
def self.start
|
21
21
|
Database.setup!
|
22
22
|
|
23
|
-
require
|
23
|
+
require 'pry'
|
24
24
|
|
25
25
|
FReCon.pry
|
26
26
|
end
|
data/lib/frecon/controller.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'frecon/base'
|
11
11
|
|
12
12
|
module FReCon
|
13
13
|
# Public: A base class to represent a controller.
|
@@ -16,18 +16,18 @@ module FReCon
|
|
16
16
|
#
|
17
17
|
# Returns a Symbol that is the Model name.
|
18
18
|
def self.model_name
|
19
|
-
# Removes the namespace
|
19
|
+
# Removes the namespace 'FReCon::' and 'Controller' from
|
20
20
|
# the class name, then singularizes the result.
|
21
|
-
self.name.gsub(/FReCon::|Controller\Z/,
|
21
|
+
self.name.gsub(/FReCon::|Controller\Z/, '').singularize
|
22
22
|
end
|
23
23
|
|
24
24
|
# Public: Converts the class's name to a Model.
|
25
25
|
#
|
26
26
|
# Returns the Model's class.
|
27
27
|
def self.model
|
28
|
-
# Removes the trailing
|
28
|
+
# Removes the trailing 'Controller' from the class name,
|
29
29
|
# singularizes the result, and turns it into the class.
|
30
|
-
self.name.gsub(/Controller\Z/,
|
30
|
+
self.name.gsub(/Controller\Z/, '').singularize.constantize
|
31
31
|
end
|
32
32
|
|
33
33
|
# Public: Find a model.
|
@@ -37,7 +37,7 @@ module FReCon
|
|
37
37
|
#
|
38
38
|
# Returns either the found model value or nil.
|
39
39
|
def self.find_model(params)
|
40
|
-
model.find params.delete(
|
40
|
+
model.find params.delete('id')
|
41
41
|
end
|
42
42
|
|
43
43
|
# Public: Generate a could-not-find message.
|
@@ -47,7 +47,7 @@ module FReCon
|
|
47
47
|
# model - The model that the search was performed upon.
|
48
48
|
#
|
49
49
|
# Returns a String containing the error message.
|
50
|
-
def self.could_not_find(value, attribute =
|
50
|
+
def self.could_not_find(value, attribute = 'id', model = model_name.downcase)
|
51
51
|
"Could not find #{model} of #{attribute} #{value}!"
|
52
52
|
end
|
53
53
|
|
@@ -220,8 +220,8 @@ module FReCon
|
|
220
220
|
if params.empty?
|
221
221
|
@models = model.all
|
222
222
|
else
|
223
|
-
params.delete(
|
224
|
-
params.delete(
|
223
|
+
params.delete('splat')
|
224
|
+
params.delete('captures')
|
225
225
|
|
226
226
|
@models = model.all.psv_filter(params)
|
227
227
|
end
|
@@ -7,8 +7,8 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
10
|
+
require 'json'
|
11
|
+
require 'frecon/models/competition'
|
12
12
|
|
13
13
|
module FReCon
|
14
14
|
# Public: The Competitions controller.
|
@@ -7,8 +7,8 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
10
|
+
require 'json'
|
11
|
+
require 'frecon/models'
|
12
12
|
|
13
13
|
module FReCon
|
14
14
|
# Public: The Dump controller.
|
@@ -21,7 +21,7 @@ module FReCon
|
|
21
21
|
|
22
22
|
ordered_descendants = Model.descendants.sort_by do |model|
|
23
23
|
id_fields = model.fields.keys.select do |attribute|
|
24
|
-
attribute.ends_with?(
|
24
|
+
attribute.ends_with?('_id') && attribute != '_id'
|
25
25
|
end
|
26
26
|
|
27
27
|
[id_fields.count, dump_compliant_name(model)]
|
@@ -39,11 +39,11 @@ module FReCon
|
|
39
39
|
# Examples
|
40
40
|
#
|
41
41
|
# DumpController.dump_compliant_name(FReCon::Team)
|
42
|
-
# # =>
|
42
|
+
# # => 'teams'
|
43
43
|
#
|
44
44
|
# Returns a dump-compliant string.
|
45
45
|
def self.dump_compliant_name(model)
|
46
|
-
model.name.gsub(/FReCon::/,
|
46
|
+
model.name.gsub(/FReCon::/, '').downcase.pluralize
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -7,8 +7,8 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
10
|
+
require 'json'
|
11
|
+
require 'frecon/models/participation'
|
12
12
|
|
13
13
|
module FReCon
|
14
14
|
# Public: The Participations controller.
|
data/lib/frecon/controllers.rb
CHANGED
@@ -7,15 +7,15 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
10
|
+
require 'json'
|
11
|
+
require 'frecon/request_error'
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'frecon/controller'
|
14
14
|
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
15
|
+
require 'frecon/controllers/competitions_controller'
|
16
|
+
require 'frecon/controllers/dump_controller'
|
17
|
+
require 'frecon/controllers/matches_controller'
|
18
|
+
require 'frecon/controllers/participations_controller'
|
19
|
+
require 'frecon/controllers/records_controller'
|
20
|
+
require 'frecon/controllers/robots_controller'
|
21
|
+
require 'frecon/controllers/teams_controller'
|
data/lib/frecon/database.rb
CHANGED
@@ -7,26 +7,26 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'logger'
|
11
11
|
|
12
|
-
require
|
12
|
+
require 'frecon/base/variables'
|
13
13
|
|
14
|
-
require
|
15
|
-
require
|
14
|
+
require 'mongoid'
|
15
|
+
require 'frecon/mongoid/criteria'
|
16
16
|
|
17
|
-
require
|
18
|
-
require
|
17
|
+
require 'tempfile'
|
18
|
+
require 'yaml'
|
19
19
|
|
20
|
-
require
|
20
|
+
require 'frecon/models'
|
21
21
|
|
22
22
|
module FReCon
|
23
23
|
# Public: A system to set up the database.
|
24
24
|
class Database
|
25
25
|
# Public: Set up the database.
|
26
26
|
def self.setup!
|
27
|
-
Mongoid.load!(File.join(File.dirname(__FILE__),
|
27
|
+
Mongoid.load!(File.join(File.dirname(__FILE__), 'mongoid.yml'), FReCon::ENVIRONMENT.variable)
|
28
28
|
|
29
|
-
if FReCon::ENVIRONMENT.console[
|
29
|
+
if FReCon::ENVIRONMENT.console['level']
|
30
30
|
Mongoid.logger.level = Logger::DEBUG
|
31
31
|
Mongoid.logger = Logger.new($stdout)
|
32
32
|
|
data/lib/frecon/match_number.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'frecon/base'
|
11
11
|
|
12
12
|
module FReCon
|
13
13
|
# Public: A wrapper to handle converting match numbers and storing them.
|
@@ -111,17 +111,17 @@ module FReCon
|
|
111
111
|
# Match `args' against the regular expression, described below.
|
112
112
|
#
|
113
113
|
# This regular expression matches all values where the first group of
|
114
|
-
# characters is one of either [
|
115
|
-
# parsed as the
|
116
|
-
# group of digits, which is parsed as the
|
114
|
+
# characters is one of either [ 'p', 'q', 'qf', 'sf', 'f' ], which is
|
115
|
+
# parsed as the 'type' of the match. This is followed by an 'm' and a
|
116
|
+
# group of digits, which is parsed as the 'number' of the match.
|
117
117
|
#
|
118
|
-
# In addition, one can specify a
|
118
|
+
# In addition, one can specify a 'round number' following the first group
|
119
119
|
# of characters such as in eliminations and finals. Often times, there
|
120
|
-
# are multiple so-called
|
120
|
+
# are multiple so-called 'rounds' in eliminations, and so the system will
|
121
121
|
# optionally capture that round.
|
122
122
|
#
|
123
|
-
# Also, one can specify a
|
124
|
-
# this is done by appending
|
123
|
+
# Also, one can specify a 'replay number' following the match number.
|
124
|
+
# this is done by appending 'r' and a group of digits which is the replay
|
125
125
|
# number.
|
126
126
|
#
|
127
127
|
# Below are listed the match groups and what they are:
|
@@ -136,44 +136,44 @@ module FReCon
|
|
136
136
|
match_data = args.match(/(p|q|qf|sf|f)([\d]+)?m([\d]+)(r)?([\d]+)?/i)
|
137
137
|
|
138
138
|
# Whine if we don't have a match (string is incorrectly formatted)
|
139
|
-
raise ArgumentError,
|
139
|
+
raise ArgumentError, 'string is improperly formatted' unless match_data
|
140
140
|
|
141
141
|
# Check and set required stuff first, everything else later.
|
142
142
|
|
143
143
|
# Whine if we don't have a match type
|
144
|
-
raise ArgumentError,
|
144
|
+
raise ArgumentError, 'match type must be supplied' unless match_data[1]
|
145
145
|
|
146
146
|
# Parse the match type string
|
147
147
|
@type = case match_data[1].downcase
|
148
|
-
when
|
148
|
+
when 'p'
|
149
149
|
:practice
|
150
|
-
when
|
150
|
+
when 'q'
|
151
151
|
:qualification
|
152
|
-
when
|
152
|
+
when 'qf'
|
153
153
|
:quarterfinal
|
154
|
-
when
|
154
|
+
when 'sf'
|
155
155
|
:semifinal
|
156
|
-
when
|
156
|
+
when 'f'
|
157
157
|
:final
|
158
158
|
else
|
159
|
-
raise ArgumentError,
|
159
|
+
raise ArgumentError, 'match type must be in [\'p\', \'q\', \'qf\', \'sf\', \'f\']'
|
160
160
|
end
|
161
161
|
|
162
162
|
# Whine if we don't have a match number
|
163
|
-
raise ArgumentError,
|
163
|
+
raise ArgumentError, 'match number must be supplied' unless match_data[3]
|
164
164
|
|
165
165
|
# Parse the match number
|
166
166
|
@number = match_data[3].to_i
|
167
|
-
raise ArgumentError,
|
167
|
+
raise ArgumentError, 'match number must be greater than 0' unless @number > 0
|
168
168
|
|
169
169
|
# Parse the round number, if it is present
|
170
170
|
if match_data[2]
|
171
171
|
@round = match_data[2].to_i
|
172
|
-
raise ArgumentError,
|
172
|
+
raise ArgumentError, 'round number must be greater than 0' unless @round > 0
|
173
173
|
end
|
174
174
|
|
175
175
|
# Parse replay match group, store replay number if present.
|
176
|
-
@replay_number = match_data[5].to_i if match_data[4] ==
|
176
|
+
@replay_number = match_data[5].to_i if match_data[4] == 'r'
|
177
177
|
elsif args.is_a?(Hash)
|
178
178
|
# type (Symbol or String)
|
179
179
|
# number (Integer)
|
@@ -183,31 +183,31 @@ module FReCon
|
|
183
183
|
# Convert keys to symbols if needed.
|
184
184
|
args = Hash[args.map { |key, value| [key.to_sym, value] }]
|
185
185
|
|
186
|
-
raise TypeError,
|
186
|
+
raise TypeError, 'type must be a Symbol or String' unless args[:type].is_a?(Symbol) || args[:type].is_a?(String)
|
187
187
|
raise ArgumentError, "type must be in #{POSSIBLE_TYPES.inspect}" unless POSSIBLE_TYPES.include?(args[:type].to_sym)
|
188
188
|
|
189
189
|
@type = args[:type].to_sym
|
190
190
|
|
191
|
-
raise TypeError,
|
192
|
-
raise ArgumentError,
|
191
|
+
raise TypeError, 'match number must be an Integer' unless args[:number].is_an?(Integer)
|
192
|
+
raise ArgumentError, 'match number must be greater than 0' unless args[:number] > 0
|
193
193
|
|
194
194
|
@number = args[:number]
|
195
195
|
|
196
196
|
if args[:round]
|
197
|
-
raise TypeError,
|
198
|
-
raise ArgumentError,
|
197
|
+
raise TypeError, 'round number must be an Integer' unless args[:round].is_an?(Integer)
|
198
|
+
raise ArgumentError, 'round number must be greater than 0' unless args[:round] > 0
|
199
199
|
|
200
200
|
@round = args[:round]
|
201
201
|
end
|
202
202
|
|
203
203
|
if args[:replay_number]
|
204
|
-
raise TypeError,
|
205
|
-
raise ArgumentError,
|
204
|
+
raise TypeError, 'replay number must be an Integer' unless args[:replay_number].is_an?(Integer)
|
205
|
+
raise ArgumentError, 'replay number must be greater than 0' unless args[:replay_number] > 0
|
206
206
|
|
207
207
|
@replay_number = args[:replay_number]
|
208
208
|
end
|
209
209
|
else
|
210
|
-
raise TypeError,
|
210
|
+
raise TypeError, 'argument must be a String or Hash'
|
211
211
|
end
|
212
212
|
end
|
213
213
|
|
@@ -217,15 +217,15 @@ module FReCon
|
|
217
217
|
def to_s
|
218
218
|
type_string = case @type
|
219
219
|
when :practice
|
220
|
-
|
220
|
+
'p'
|
221
221
|
when :qualification
|
222
|
-
|
222
|
+
'q'
|
223
223
|
when :quarterfinal
|
224
|
-
|
224
|
+
'qf'
|
225
225
|
when :semifinal
|
226
|
-
|
226
|
+
'sf'
|
227
227
|
when :final
|
228
|
-
|
228
|
+
'f'
|
229
229
|
end
|
230
230
|
match_string = "m#{@number}"
|
231
231
|
replay_string = "r#{@replay_number}" if replay?
|
data/lib/frecon/model.rb
CHANGED
@@ -7,8 +7,8 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
10
|
+
require 'mongoid'
|
11
|
+
require 'frecon/mongoid/criteria'
|
12
12
|
|
13
13
|
module FReCon
|
14
14
|
# Public: A base class designed to assist with creating MongoDB Models
|
@@ -45,7 +45,7 @@ module FReCon
|
|
45
45
|
# Examples
|
46
46
|
#
|
47
47
|
# # (Taken from the Team model)
|
48
|
-
# register_routable_relation :matches,
|
48
|
+
# register_routable_relation :matches, 'matches'
|
49
49
|
#
|
50
50
|
# Returns the result of pushing an object to class's attributes
|
51
51
|
# class variable.
|
@@ -82,18 +82,18 @@ module FReCon
|
|
82
82
|
#
|
83
83
|
# Returns the associated Controller if it exists, else nil.
|
84
84
|
def self.controller
|
85
|
-
(self.name.pluralize +
|
85
|
+
(self.name.pluralize + 'Controller').constantize
|
86
86
|
end
|
87
87
|
|
88
88
|
# Public: Validate that no invalid relations exist within this Model
|
89
89
|
def no_invalid_relations
|
90
|
-
# Get all of the belongs_to fields (ends with
|
90
|
+
# Get all of the belongs_to fields (ends with '_id' and not '_id' because that is the id).
|
91
91
|
attributes.keys.select do |attribute|
|
92
|
-
attribute.end_with?(
|
92
|
+
attribute.end_with?('_id') && attribute != '_id'
|
93
93
|
end.each do |relation|
|
94
94
|
# Get the model for the belongs_to association.
|
95
|
-
model =
|
96
|
-
errors.add(relation.to_sym,
|
95
|
+
model = 'FReCon::'.concat(relation.gsub(/_id\Z/, '').capitalize).constantize
|
96
|
+
errors.add(relation.to_sym, 'is invalid') if relation_invalid?(model, send(relation))
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'frecon/model'
|
11
11
|
|
12
12
|
module FReCon
|
13
13
|
# Public: The Competition model.
|
@@ -36,10 +36,10 @@ module FReCon
|
|
36
36
|
Team.in id: robots.map(&:team_id)
|
37
37
|
end
|
38
38
|
|
39
|
-
register_routable_relation :matches,
|
40
|
-
register_routable_relation :participations,
|
41
|
-
register_routable_relation :records,
|
42
|
-
register_routable_relation :robots,
|
43
|
-
register_routable_relation :teams,
|
39
|
+
register_routable_relation :matches, 'matches'
|
40
|
+
register_routable_relation :participations, 'participations'
|
41
|
+
register_routable_relation :records, 'records'
|
42
|
+
register_routable_relation :robots, 'robots'
|
43
|
+
register_routable_relation :teams, 'teams'
|
44
44
|
end
|
45
45
|
end
|
data/lib/frecon/models/match.rb
CHANGED
@@ -7,8 +7,8 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
10
|
+
require 'frecon/model'
|
11
|
+
require 'frecon/match_number'
|
12
12
|
|
13
13
|
module FReCon
|
14
14
|
# Public: The Match model.
|
@@ -38,10 +38,10 @@ module FReCon
|
|
38
38
|
Team.in id: robots.map(&:team_id)
|
39
39
|
end
|
40
40
|
|
41
|
-
register_routable_relation :competition,
|
42
|
-
register_routable_relation :records,
|
43
|
-
register_routable_relation :participations,
|
44
|
-
register_routable_relation :robots,
|
45
|
-
register_routable_relation :teams,
|
41
|
+
register_routable_relation :competition, 'competition'
|
42
|
+
register_routable_relation :records, 'records'
|
43
|
+
register_routable_relation :participations, 'participations'
|
44
|
+
register_routable_relation :robots, 'robots'
|
45
|
+
register_routable_relation :teams, 'teams'
|
46
46
|
end
|
47
47
|
end
|
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'frecon/model'
|
11
11
|
|
12
12
|
module FReCon
|
13
13
|
# Public: The Participation model.
|
@@ -28,10 +28,10 @@ module FReCon
|
|
28
28
|
competition.matches
|
29
29
|
end
|
30
30
|
|
31
|
-
register_routable_relation :robot,
|
32
|
-
register_routable_relation :team,
|
33
|
-
register_routable_relation :competition,
|
34
|
-
register_routable_relation :matches,
|
35
|
-
register_routable_relation :records,
|
31
|
+
register_routable_relation :robot, 'robot'
|
32
|
+
register_routable_relation :team, 'team'
|
33
|
+
register_routable_relation :competition, 'competition'
|
34
|
+
register_routable_relation :matches, 'matches'
|
35
|
+
register_routable_relation :records, 'records'
|
36
36
|
end
|
37
37
|
end
|
data/lib/frecon/models/record.rb
CHANGED
@@ -7,8 +7,8 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
10
|
+
require 'frecon/model'
|
11
|
+
require 'frecon/position'
|
12
12
|
|
13
13
|
module FReCon
|
14
14
|
# Public: The Record model.
|
@@ -36,10 +36,10 @@ module FReCon
|
|
36
36
|
participation.robot.team
|
37
37
|
end
|
38
38
|
|
39
|
-
register_routable_relation :match,
|
40
|
-
register_routable_relation :competition,
|
41
|
-
register_routable_relation :participation,
|
42
|
-
register_routable_relation :robot,
|
43
|
-
register_routable_relation :team,
|
39
|
+
register_routable_relation :match, 'match'
|
40
|
+
register_routable_relation :competition, 'competition'
|
41
|
+
register_routable_relation :participation, 'participation'
|
42
|
+
register_routable_relation :robot, 'robot'
|
43
|
+
register_routable_relation :team, 'team'
|
44
44
|
end
|
45
45
|
end
|
data/lib/frecon/models/robot.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'frecon/model'
|
11
11
|
|
12
12
|
module FReCon
|
13
13
|
# Public: The Robot model.
|
@@ -35,10 +35,10 @@ module FReCon
|
|
35
35
|
Match.in id: records.map(&:match_id).uniq
|
36
36
|
end
|
37
37
|
|
38
|
-
register_routable_relation :team,
|
39
|
-
register_routable_relation :participations,
|
40
|
-
register_routable_relation :competitions,
|
41
|
-
register_routable_relation :records,
|
42
|
-
register_routable_relation :matches,
|
38
|
+
register_routable_relation :team, 'team'
|
39
|
+
register_routable_relation :participations, 'participations'
|
40
|
+
register_routable_relation :competitions, 'competitions'
|
41
|
+
register_routable_relation :records, 'records'
|
42
|
+
register_routable_relation :matches, 'matches'
|
43
43
|
end
|
44
44
|
end
|
data/lib/frecon/models/team.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'frecon/model'
|
11
11
|
|
12
12
|
module FReCon
|
13
13
|
# Public: The Team model.
|
@@ -51,11 +51,11 @@ module FReCon
|
|
51
51
|
Match.in competition_id: competitions.map(&:id)
|
52
52
|
end
|
53
53
|
|
54
|
-
register_routable_relation :robots,
|
55
|
-
register_routable_relation :participations,
|
56
|
-
register_routable_relation :competitions,
|
57
|
-
register_routable_relation :records,
|
58
|
-
register_routable_relation :matches,
|
54
|
+
register_routable_relation :robots, 'robots'
|
55
|
+
register_routable_relation :participations, 'participations'
|
56
|
+
register_routable_relation :competitions, 'competitions'
|
57
|
+
register_routable_relation :records, 'records'
|
58
|
+
register_routable_relation :matches, 'matches'
|
59
59
|
|
60
60
|
# alias_method works by default solely on instance
|
61
61
|
# methods, so change context to the metaclass of
|
data/lib/frecon/models.rb
CHANGED
@@ -7,9 +7,9 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
10
|
+
require 'frecon/models/competition'
|
11
|
+
require 'frecon/models/match'
|
12
|
+
require 'frecon/models/participation'
|
13
|
+
require 'frecon/models/record'
|
14
|
+
require 'frecon/models/robot'
|
15
|
+
require 'frecon/models/team'
|
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'mongoid'
|
11
11
|
|
12
12
|
# Public: An extension for the Mongoid module.
|
13
13
|
module Mongoid
|
@@ -17,7 +17,7 @@ module Mongoid
|
|
17
17
|
# Public: Filter by given PSV parameters.
|
18
18
|
#
|
19
19
|
# PSV is an introduced system that can be used within query strings to
|
20
|
-
# narrow a query. Since HTTP query strings can use
|
20
|
+
# narrow a query. Since HTTP query strings can use '+' to act as spaces
|
21
21
|
# within a key-value pair, one can use these pluses to define nested
|
22
22
|
# query parameters when querying the database as in an indexing or
|
23
23
|
# showing request.
|
@@ -26,12 +26,12 @@ module Mongoid
|
|
26
26
|
#
|
27
27
|
# Examples
|
28
28
|
#
|
29
|
-
# Record.all.psv_filter({
|
29
|
+
# Record.all.psv_filter({'participation robot team number' => '2503'})
|
30
30
|
# => #<Mongoid::Criteria ...>
|
31
31
|
#
|
32
32
|
# # Since each instance of Record has a :team shortcut method,
|
33
33
|
# # we can just filter it like so.
|
34
|
-
# Record.all.psv_filter({
|
34
|
+
# Record.all.psv_filter({'team number' => '2503'})
|
35
35
|
# => #<Mongoid::Criteria ...>
|
36
36
|
#
|
37
37
|
# Returns a filtered version of self.
|
@@ -55,20 +55,20 @@ module Mongoid
|
|
55
55
|
|
56
56
|
# Create a comparison hash to be used to compare <attribute> to
|
57
57
|
# <expected value>.
|
58
|
-
if comparison_value.length == 0 || comparison_value ==
|
58
|
+
if comparison_value.length == 0 || comparison_value == '__nil__'
|
59
59
|
comparison_hash = {comparison_key => nil}
|
60
60
|
else
|
61
61
|
comparison_hash = {comparison_key => comparison_value}
|
62
62
|
end
|
63
63
|
|
64
64
|
# Each of the subsequent keys should be a model name. Generate a string
|
65
|
-
# corresponding to the
|
65
|
+
# corresponding to the '<model>' + '_id' for use as the comparison key,
|
66
66
|
# and find the model class by generating a constant.
|
67
67
|
#
|
68
68
|
# Then, nest a comparison around the current comparison hash.
|
69
69
|
psv_keys.each do |model|
|
70
70
|
model_id = (model.to_s + '_id').to_sym
|
71
|
-
model_class = (
|
71
|
+
model_class = ('FReCon::' + model.to_s.capitalize).constantize
|
72
72
|
|
73
73
|
comparison_hash = {model_id => model_class.in(comparison_hash).map(&:id)}
|
74
74
|
end
|
data/lib/frecon/position.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'frecon/base'
|
11
11
|
|
12
12
|
module FReCon
|
13
13
|
# Public: A wrapper to handle converting team positions and storing them.
|
@@ -102,7 +102,7 @@ module FReCon
|
|
102
102
|
# Match `string' against the regular expression, described below.
|
103
103
|
#
|
104
104
|
# This regular expression matches all values for `string' where
|
105
|
-
# the first letter is either
|
105
|
+
# the first letter is either 'r' or 'b' (case-insensitive due to /i
|
106
106
|
# at the end of the regular expression) and the last one-or-more
|
107
107
|
# characters in the string are digits 0-9. Anything between those two
|
108
108
|
# that is either a letter or an underscore is not retained, but
|
@@ -110,8 +110,8 @@ module FReCon
|
|
110
110
|
# will not match.
|
111
111
|
#
|
112
112
|
# You can use any words you like if you have more than just
|
113
|
-
#
|
114
|
-
# as
|
113
|
+
# 'r<n>' or 'b<n>', for example 'red_2' matches just the same
|
114
|
+
# as 'r2', or, just for fun, just the same as 'royal______2'.
|
115
115
|
#
|
116
116
|
# This behavior may change in the future.
|
117
117
|
match_data = args[0].match(/^([rb])[a-z\_]*([0-9]+)/i)
|
@@ -120,29 +120,29 @@ module FReCon
|
|
120
120
|
# string that was matched, hence the indices that start
|
121
121
|
# at one.
|
122
122
|
|
123
|
-
raise ArgumentError,
|
123
|
+
raise ArgumentError, 'string is improperly formatted' unless match_data
|
124
124
|
|
125
125
|
@alliance = case match_data[1].downcase
|
126
|
-
when
|
126
|
+
when 'b'
|
127
127
|
:blue
|
128
|
-
when
|
128
|
+
when 'r'
|
129
129
|
:red
|
130
130
|
else
|
131
|
-
raise ArgumentError, "alliance character must be in [
|
131
|
+
raise ArgumentError, "alliance character must be in ['b', 'r']"
|
132
132
|
end
|
133
133
|
|
134
134
|
position_number = match_data[2].to_i
|
135
|
-
raise ArgumentError,
|
135
|
+
raise ArgumentError, 'position number must be in [1, 2, 3]' unless [1, 2, 3].include?(position_number)
|
136
136
|
|
137
137
|
@number = position_number
|
138
138
|
elsif args.length == 2
|
139
|
-
raise TypeError,
|
140
|
-
raise ArgumentError,
|
139
|
+
raise TypeError, 'alliance must be a Symbol or String' unless args[0].is_a?(Symbol) || args[0].is_a?(String)
|
140
|
+
raise ArgumentError, 'alliance must be in [:blue, :red]' unless [:blue, :red].include?(args[0].to_sym)
|
141
141
|
|
142
142
|
@alliance = args[0].to_sym
|
143
143
|
|
144
|
-
raise TypeError,
|
145
|
-
raise ArgumentError,
|
144
|
+
raise TypeError, 'second argument must be an Integer' unless args[1].is_an?(Integer)
|
145
|
+
raise ArgumentError, 'second argument must be in [1, 2, 3]' unless [1, 2, 3].include?(args[1])
|
146
146
|
|
147
147
|
@number = args[1]
|
148
148
|
else
|
data/lib/frecon/request_error.rb
CHANGED
data/lib/frecon/routes.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'frecon/controllers'
|
11
11
|
|
12
12
|
module FReCon
|
13
13
|
# Public: A module containing all of the routes.
|
@@ -74,13 +74,13 @@ module FReCon
|
|
74
74
|
begin
|
75
75
|
@model = controller.find_model(params)
|
76
76
|
|
77
|
-
params.delete(
|
77
|
+
params.delete('id')
|
78
78
|
|
79
79
|
result = @model.method(model_attribute_method[:method]).call
|
80
80
|
|
81
81
|
if result.is_a? Mongoid::Criteria
|
82
|
-
params.delete(
|
83
|
-
params.delete(
|
82
|
+
params.delete('splat')
|
83
|
+
params.delete('captures')
|
84
84
|
|
85
85
|
result.psv_filter(params).to_json
|
86
86
|
else
|
@@ -97,25 +97,25 @@ module FReCon
|
|
97
97
|
#
|
98
98
|
# base - The child that included this module (should be a Sinatra App)
|
99
99
|
def self.included(base)
|
100
|
-
resource_routes base,
|
101
|
-
resource_routes base,
|
102
|
-
resource_routes base,
|
103
|
-
resource_routes base,
|
104
|
-
resource_routes base,
|
105
|
-
resource_routes base,
|
106
|
-
|
107
|
-
attribute_routes base,
|
108
|
-
attribute_routes base,
|
109
|
-
attribute_routes base,
|
110
|
-
attribute_routes base,
|
111
|
-
attribute_routes base,
|
112
|
-
attribute_routes base,
|
100
|
+
resource_routes base, 'teams', TeamsController
|
101
|
+
resource_routes base, 'competitions', CompetitionsController
|
102
|
+
resource_routes base, 'matches', MatchesController
|
103
|
+
resource_routes base, 'records', RecordsController
|
104
|
+
resource_routes base, 'robots', RobotsController
|
105
|
+
resource_routes base, 'participations', ParticipationsController
|
106
|
+
|
107
|
+
attribute_routes base, 'teams', TeamsController
|
108
|
+
attribute_routes base, 'competitions', CompetitionsController
|
109
|
+
attribute_routes base, 'matches', MatchesController
|
110
|
+
attribute_routes base, 'records', RecordsController
|
111
|
+
attribute_routes base, 'robots', RobotsController
|
112
|
+
attribute_routes base, 'participations', ParticipationsController
|
113
113
|
|
114
114
|
base.before do
|
115
|
-
params.delete(
|
115
|
+
params.delete('_')
|
116
116
|
end
|
117
117
|
|
118
|
-
base.get
|
118
|
+
base.get '/dump' do
|
119
119
|
begin
|
120
120
|
DumpController.full params
|
121
121
|
rescue RequestError => e
|
@@ -123,7 +123,7 @@ module FReCon
|
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
-
if ENV[
|
126
|
+
if ENV['PRINT_ROUTES']
|
127
127
|
base.routes.each do |verb, routes|
|
128
128
|
puts "#{verb}:"
|
129
129
|
|
data/lib/frecon/scraper.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'httparty'
|
11
11
|
|
12
12
|
module FReCon
|
13
13
|
# The default scraper scrapes other FReCon instances.
|
@@ -24,9 +24,9 @@ module FReCon
|
|
24
24
|
data = JSON.parse(data)
|
25
25
|
|
26
26
|
if context[:type] == :single && data.empty?
|
27
|
-
return [404,
|
27
|
+
return [404, 'Could not find a model with that query.']
|
28
28
|
elsif
|
29
|
-
puts
|
29
|
+
puts 'Just a heads up: you are importing an empty array of data.'
|
30
30
|
end
|
31
31
|
|
32
32
|
# Here we want `context` to tell us what model we are making.
|
@@ -38,7 +38,7 @@ module FReCon
|
|
38
38
|
statuses = data.map do |key, value|
|
39
39
|
begin
|
40
40
|
unless value.empty?
|
41
|
-
model = (
|
41
|
+
model = ('FReCon::' + key.singularize.capitalize).constantize
|
42
42
|
result = model.controller.create(nil, nil, value)
|
43
43
|
result.first == 201 ? result.first : JSON.parse(result.last)
|
44
44
|
end
|
@@ -56,12 +56,12 @@ module FReCon
|
|
56
56
|
# If two arguments are passed, will import the models that match
|
57
57
|
# the query params.
|
58
58
|
def get(model = nil, query = {})
|
59
|
-
# Turns something like
|
60
|
-
model = (
|
59
|
+
# Turns something like 'team' into Team.
|
60
|
+
model = ('FReCon::' + model.capitalize).constantize if model.is_a?(String)
|
61
61
|
|
62
62
|
# The route name for the model branch.
|
63
|
-
route_name = model.name.gsub(/FReCon::/,
|
64
|
-
|
63
|
+
route_name = model.name.gsub(/FReCon::/, '').downcase.pluralize if model
|
64
|
+
|
65
65
|
if !model && query.empty?
|
66
66
|
type = :dump
|
67
67
|
data = HTTParty.get("http://#{@base_uri}/dump")
|
data/lib/frecon/scrapers.rb
CHANGED
data/lib/frecon/server.rb
CHANGED
@@ -7,12 +7,12 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'sinatra/base'
|
11
11
|
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
12
|
+
require 'frecon/base/variables'
|
13
|
+
require 'frecon/database'
|
14
|
+
require 'frecon/routes'
|
15
|
+
require 'frecon/controllers'
|
16
16
|
|
17
17
|
module FReCon
|
18
18
|
# Public: The Sinatra web server.
|
@@ -20,7 +20,7 @@ module FReCon
|
|
20
20
|
include Routes
|
21
21
|
|
22
22
|
before do
|
23
|
-
content_type
|
23
|
+
content_type 'application/json'
|
24
24
|
end
|
25
25
|
|
26
26
|
# Public: Start the Server.
|
@@ -40,8 +40,8 @@ module FReCon
|
|
40
40
|
def self.setup!
|
41
41
|
# Set the Thin and Sinatra options.
|
42
42
|
set :server, %w[thin HTTP webrick]
|
43
|
-
set :bind, FReCon::ENVIRONMENT.server[
|
44
|
-
set :port, FReCon::ENVIRONMENT.server[
|
43
|
+
set :bind, FReCon::ENVIRONMENT.server['host']
|
44
|
+
set :port, FReCon::ENVIRONMENT.server['port']
|
45
45
|
set :environment, FReCon::ENVIRONMENT.variable.to_s
|
46
46
|
|
47
47
|
# Set up the database.
|
data/lib/frecon.rb
CHANGED
@@ -7,22 +7,22 @@
|
|
7
7
|
# license with this program. If not, please see
|
8
8
|
# <http://opensource.org/licenses/MIT>.
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'mongoid'
|
11
11
|
|
12
|
-
require
|
12
|
+
require 'frecon/base'
|
13
13
|
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
14
|
+
require 'frecon/controller'
|
15
|
+
require 'frecon/controllers'
|
16
|
+
require 'frecon/model'
|
17
|
+
require 'frecon/models'
|
18
|
+
require 'frecon/scraper'
|
19
|
+
require 'frecon/scrapers'
|
20
20
|
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
21
|
+
require 'frecon/match_number'
|
22
|
+
require 'frecon/position'
|
23
|
+
require 'frecon/request_error'
|
24
|
+
require 'frecon/routes'
|
25
25
|
|
26
|
-
require
|
27
|
-
require
|
28
|
-
require
|
26
|
+
require 'frecon/database'
|
27
|
+
require 'frecon/server'
|
28
|
+
require 'frecon/console'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: frecon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Craig
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2015-12-
|
16
|
+
date: 2015-12-08 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: sinatra
|