super_test_engine 0.0.6 → 0.1.0

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -21
  3. data/lib/super_test_engine.rb +1 -3
  4. data/lib/super_test_engine/copy_app_templates/controllers/favorite_things_controller.rb +50 -0
  5. data/lib/super_test_engine/copy_app_templates/controllers/members_controller.rb +57 -0
  6. data/lib/super_test_engine/copy_app_templates/controllers/ships_controller.rb +47 -0
  7. data/{db/migrate → lib/super_test_engine/copy_app_templates/migrations}/20190216224956_create_members.rb +0 -0
  8. data/lib/super_test_engine/copy_app_templates/migrations/20190803143320_create_ships.rb +11 -0
  9. data/lib/super_test_engine/copy_app_templates/migrations/20190806014121_add_ship_to_members.rb +5 -0
  10. data/lib/super_test_engine/copy_app_templates/migrations/20191126050453_create_favorite_things.rb +10 -0
  11. data/lib/super_test_engine/copy_app_templates/models/favorite_thing.rb +7 -0
  12. data/{app → lib/super_test_engine/copy_app_templates}/models/member.rb +10 -0
  13. data/lib/super_test_engine/copy_app_templates/models/ship.rb +3 -0
  14. data/lib/super_test_engine/copy_app_templates/routes.rb +11 -0
  15. data/lib/super_test_engine/copy_app_templates/seeds.rb +2 -0
  16. data/lib/super_test_engine/copy_app_templates/views/members/_favorite_things.html.erb +11 -0
  17. data/lib/super_test_engine/copy_app_templates/views/members/show.html.erb +11 -0
  18. data/lib/super_test_engine/fixtures/favorite_things.yml +9 -0
  19. data/{test → lib/super_test_engine}/fixtures/members.yml +56 -0
  20. data/lib/super_test_engine/fixtures/ships.yml +10 -0
  21. data/lib/super_test_engine/generate_copy_app.rb +49 -0
  22. data/lib/super_test_engine/generate_dummy.rb +98 -0
  23. data/lib/super_test_engine/starfleet_seeder.rb +50 -0
  24. data/super_test_engine.gemspec +23 -0
  25. metadata +47 -28
  26. data/MIT-LICENSE +0 -20
  27. data/Rakefile +0 -32
  28. data/app/controllers/admin/members_controller.rb +0 -9
  29. data/app/controllers/admin_controller.rb +0 -2
  30. data/app/dashboards/member_dashboard.rb +0 -81
  31. data/config/routes.rb +0 -5
  32. data/db/seeds.rb +0 -34
  33. data/lib/generators/super_test_engine/dummy/USAGE +0 -8
  34. data/lib/generators/super_test_engine/dummy/dummy_generator.rb +0 -108
  35. data/lib/generators/super_test_engine/dummy/templates/db_seeds.rb.tt +0 -1
  36. data/lib/super_test_engine/engine.rb +0 -9
  37. data/lib/super_test_engine/version.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c8180d8dd33f99eb0442bb67751b0722b11d453679df0852587ef0f74c5c9a7
4
- data.tar.gz: d3656c32d72e55007163f578c6c3d9671b81c98e20505f76bfd69215ef1ab55d
3
+ metadata.gz: c7d20e2c3646b4dee8144f92fa4f43ea042d0f03bce4a8111b3a081ba57cd067
4
+ data.tar.gz: a9ee55f386103ea4522409f6a16c564a6db2eb950a44b3e54a09a49913653e4e
5
5
  SHA512:
6
- metadata.gz: 63150cc18e312cd009bd9bb06f89512b621813fad701d16f33bb6bea3a8f6f6aa523c6e5656059cc45c428ad54e98427b9446ae672c840801040287db4d7708a
7
- data.tar.gz: 8956150cb78092261446188ba9434a001aa51a2a3f5c1ba6bc29f97983e09cd820253b6511c522167bc6a7956d60632189dc852d92474a8265b938a8e41289e6
6
+ metadata.gz: e00688f985b35865f04a61bf0bb7815dbf92ff603bb8e60f962d0cde6237dca9af1ba0551eafa189f86e64029f2c27ca03951da686f0c5a3ecd1babf258a6d65
7
+ data.tar.gz: 90fcf2eda947e9f281cdff7cd83234cbad475df837d13dd80f259d5dd87339fce01ae34c81aa1c8308c673724511f5e18956a6b321ccf9ec5845d09f9e04ee83
data/README.md CHANGED
@@ -1,28 +1,14 @@
1
1
  # SuperTestEngine
2
- Short description and motivation.
3
2
 
4
- ## Usage
5
- How to use my plugin.
3
+ Not an engine. Not just for tests.
6
4
 
7
- ## Installation
8
- Add this line to your application's Gemfile:
9
5
 
10
- ```ruby
11
- gem 'super_test_engine'
12
- ```
6
+ ## Example usage
13
7
 
14
- And then execute:
15
- ```bash
16
- $ bundle
17
8
  ```
18
-
19
- Or install it yourself as:
20
- ```bash
21
- $ gem install super_test_engine
9
+ env BUNDLE_GEMFILE="gemfiles/rails50_sprockets3.gemfile" bundle exec ruby super_test_engine/lib/super_test_engine/generate_copy_app.rb --destination=test/dummy50_sprockets3
10
+ env BUNDLE_GEMFILE="gemfiles/rails51_sprockets3.gemfile" bundle exec ruby super_test_engine/lib/super_test_engine/generate_copy_app.rb --destination=test/dummy51_sprockets3
11
+ env BUNDLE_GEMFILE="gemfiles/rails52_sprockets4.gemfile" bundle exec ruby super_test_engine/lib/super_test_engine/generate_copy_app.rb --destination=test/dummy52_sprockets4
12
+ env BUNDLE_GEMFILE="gemfiles/rails60_sprockets4.gemfile" bundle exec ruby super_test_engine/lib/super_test_engine/generate_copy_app.rb --destination=test/dummy60_sprockets4
13
+ env BUNDLE_GEMFILE="gemfiles/rails60_webpacker4.gemfile" bundle exec ruby super_test_engine/lib/super_test_engine/generate_copy_app.rb --destination=test/dummy60_webpacker4
22
14
  ```
23
-
24
- ## Contributing
25
- Contribution directions go here.
26
-
27
- ## License
28
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -1,5 +1,3 @@
1
- require "super_test_engine/engine"
2
-
3
1
  module SuperTestEngine
4
- # Your code goes here...
2
+ VERSION = "0.1.0"
5
3
  end
@@ -0,0 +1,50 @@
1
+ module Admin
2
+ class FavoriteThingsController < AdminController
3
+ private
4
+
5
+ def new_controls
6
+ Controls.new
7
+ end
8
+
9
+ class Controls
10
+ def title
11
+ FavoriteThing.name.pluralize
12
+ end
13
+
14
+ def model
15
+ FavoriteThing
16
+ end
17
+
18
+ def scope(action:)
19
+ FavoriteThing.all
20
+ end
21
+
22
+ def permitted_params(params, action:)
23
+ params.require(:favorite_thing).permit(:name, member_attributes: [:id, :name, :rank, :position, :ship_id])
24
+ end
25
+
26
+ def display_schema(action:)
27
+ Super::Schema.new(Super::Display::SchemaTypes.new) do |fields, type|
28
+ fields[:name] = type.dynamic(&:itself)
29
+ fields[:member] = type.dynamic { |member| "#{member.name} (member ##{member.id})" }
30
+ end
31
+ end
32
+
33
+ def form_schema(action:)
34
+ Super::Schema.new(Super::Form::SchemaTypes.new) do |fields, type|
35
+ fields[:name] = type.generic("form_field_text")
36
+
37
+ fields[:member_attributes] = type.belongs_to(:member) do
38
+ fields[:name] = type.generic("form_field_text")
39
+ fields[:rank] = type.generic("form_field_select", collection: Member.ranks.keys)
40
+ fields[:position] = type.generic("form_field_text")
41
+ fields[:ship_id] = type.generic(
42
+ "form_field_select",
43
+ collection: Ship.all.map { |s| ["#{s.name} (Ship ##{s.id})", s.id] },
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,57 @@
1
+ module Admin
2
+ class MembersController < AdminController
3
+ private
4
+
5
+ def new_controls
6
+ Controls.new
7
+ end
8
+
9
+ class Controls
10
+ def title
11
+ Member.name.pluralize
12
+ end
13
+
14
+ def model
15
+ Member
16
+ end
17
+
18
+ def scope(action:)
19
+ Member.all
20
+ end
21
+
22
+ def permitted_params(params, action:)
23
+ params.require(:member).permit(:name, :rank, :position, :ship_id, favorite_things_attributes: [:id, :name, :_destroy])
24
+ end
25
+
26
+ def display_schema(action:)
27
+ Super::Schema.new(Super::Display::SchemaTypes.new) do |fields, type|
28
+ fields[:name] = type.dynamic(&:itself)
29
+ fields[:rank] = type.dynamic(&:itself)
30
+ fields[:position] = type.dynamic(&:itself)
31
+ fields[:ship] = type.dynamic { |ship| "#{ship.name} (Ship ##{ship.id})" }
32
+ fields[:created_at] = type.dynamic(&:iso8601)
33
+ if action.show?
34
+ fields[:updated_at] = type.dynamic(&:iso8601)
35
+ end
36
+ end
37
+ end
38
+
39
+ def form_schema(action:)
40
+ Super::Schema.new(Super::Form::SchemaTypes.new) do |fields, type|
41
+ fields[:name] = type.generic("form_field_text")
42
+ fields[:rank] = type.generic("form_field_select", collection: Member.ranks.keys)
43
+ fields[:position] = type.generic("form_field_text")
44
+ fields[:ship_id] = type.generic(
45
+ "form_field_select",
46
+ collection: Ship.all.map { |s| ["#{s.name} (Ship ##{s.id})", s.id] },
47
+ )
48
+
49
+ fields[:favorite_things_attributes] = type.has_many(:favorite_things) do
50
+ fields[:name] = type.generic("form_field_text")
51
+ fields[:_destroy] = type._destroy
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,47 @@
1
+ module Admin
2
+ class ShipsController < AdminController
3
+ private
4
+
5
+ def new_controls
6
+ Controls.new
7
+ end
8
+
9
+ class Controls
10
+ def title
11
+ Ship.name.pluralize
12
+ end
13
+
14
+ def model
15
+ Ship
16
+ end
17
+
18
+ def scope(action:)
19
+ Ship.all
20
+ end
21
+
22
+ def permitted_params(params, action:)
23
+ params.require(:ship).permit(:name, :registry, :class_name)
24
+ end
25
+
26
+ def display_schema(action:)
27
+ Super::Schema.new(Super::Display::SchemaTypes.new) do |fields, type|
28
+ fields[:name] = type.dynamic(&:itself)
29
+ fields[:registry] = type.dynamic(&:itself)
30
+ fields[:class_name] = type.dynamic(&:itself)
31
+ if action.show?
32
+ fields[:created_at] = type.dynamic(&:iso8601)
33
+ fields[:updated_at] = type.dynamic(&:iso8601)
34
+ end
35
+ end
36
+ end
37
+
38
+ def form_schema(action:)
39
+ Super::Schema.new(Super::Form::SchemaTypes.new) do |fields, type|
40
+ fields[:name] = type.generic("form_field_text")
41
+ fields[:registry] = type.generic("form_field_text")
42
+ fields[:class_name] = type.generic("form_field_text")
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,11 @@
1
+ class CreateShips < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :ships do |t|
4
+ t.string :name
5
+ t.string :registry
6
+ t.string :class_name
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class AddShipToMembers < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_reference :members, :ship, foreign_key: true
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ class CreateFavoriteThings < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :favorite_things do |t|
4
+ t.references :member, null: false, foreign_key: true
5
+ t.text :name
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ class FavoriteThing < ApplicationRecord
2
+ belongs_to :member
3
+
4
+ validates :name, presence: true
5
+
6
+ accepts_nested_attributes_for :member
7
+ end
@@ -9,6 +9,16 @@ class Member < ApplicationRecord
9
9
  nco: "NCO",
10
10
  }
11
11
 
12
+ belongs_to :ship
13
+ has_many :favorite_things, dependent: :delete_all
14
+
15
+ accepts_nested_attributes_for(
16
+ :favorite_things,
17
+ allow_destroy: true,
18
+ reject_if: -> (record) { record[:name].blank? }
19
+ )
20
+
12
21
  validates :name, presence: true
13
22
  validates :rank, presence: true
23
+ validates :position, presence: true
14
24
  end
@@ -0,0 +1,3 @@
1
+ class Ship < ApplicationRecord
2
+ has_many :members
3
+ end
@@ -0,0 +1,11 @@
1
+ Rails.application.routes.draw do
2
+ namespace :admin do
3
+ resources :members
4
+ resources :ships
5
+ resources :favorite_things
6
+
7
+ root to: redirect("admin/members", status: 302)
8
+ end
9
+
10
+ root to: redirect("admin/members", status: 302)
11
+ end
@@ -0,0 +1,2 @@
1
+ require "super_test_engine/starfleet_seeder"
2
+ StarfleetSeeder.seed
@@ -0,0 +1,11 @@
1
+ <% if @resource.favorite_things.any? %>
2
+ <%= render(Super::Panel.new) do %>
3
+ <h1 class="text-xl">Favorite Things</h1>
4
+
5
+ <ul class="list-disc list-outside mt-4">
6
+ <% @resource.favorite_things.each do |favorite_thing| %>
7
+ <li class="ml-6"><%= favorite_thing.name %></li>
8
+ <% end %>
9
+ </ul>
10
+ <% end %>
11
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <%= render(
2
+ Super::Layout.new(
3
+ mains: [
4
+ Super::Panel.new(
5
+ Super::Partial.new("resource_header"),
6
+ Super::Partial.new("show")
7
+ ),
8
+ Super::Partial.new("favorite_things")
9
+ ]
10
+ )
11
+ ) %>
@@ -0,0 +1,9 @@
1
+ # Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
2
+
3
+ tea:
4
+ member: picard
5
+ name: Tea, earl grey, hot
6
+
7
+ spot:
8
+ member: data
9
+ name: Spot
@@ -3,278 +3,334 @@ picard:
3
3
  name: Jean-Luc Picard
4
4
  rank: Captain
5
5
  position: Commanding Officer
6
+ ship: uss_enterprise_d
6
7
 
7
8
  riker:
8
9
  name: William T. Riker
9
10
  rank: Commander
10
11
  position: First Officer
12
+ ship: uss_enterprise_d
11
13
 
12
14
  data:
13
15
  name: Data
14
16
  rank: Lieutenant Commander
15
17
  position: Second Officer
18
+ ship: uss_enterprise_d
16
19
 
17
20
  crusher:
18
21
  name: Beverly Crusher
19
22
  rank: Commander
20
23
  position: Chief Medical Officer
24
+ ship: uss_enterprise_d
21
25
 
22
26
  worf:
23
27
  name: Worf
24
28
  rank: Lieutenant Commander
25
29
  position: Chief of Security
30
+ ship: uss_enterprise_d
26
31
 
27
32
  la_forge:
28
33
  name: Geordi La Forge
29
34
  rank: Lieutenant Commander
30
35
  position: Chief Engineering Officer
36
+ ship: uss_enterprise_d
31
37
 
32
38
  troi:
33
39
  name: Deanna Troi
34
40
  rank: Commander
35
41
  position: Counselor
42
+ ship: uss_enterprise_d
36
43
 
37
44
  tasha:
38
45
  name: Natasha Yar
39
46
  rank: Lieutenant
40
47
  position: Chief of Security
48
+ ship: uss_enterprise_d
41
49
 
42
50
  miles:
43
51
  name: Miles O'Brien
44
52
  rank: NCO
45
53
  position: Transporter Chief
54
+ ship: uss_enterprise_d
46
55
 
47
56
  guinan:
48
57
  name: Guinan
49
58
  rank: NCO
50
59
  position: Bartender
60
+ ship: uss_enterprise_d
51
61
 
52
62
  sepulveda:
53
63
  name: Fernando Sepulveda
54
64
  rank: Lieutenant
55
65
  position: Ops engineer
66
+ ship: uss_enterprise_d
56
67
 
57
68
  jaxa:
58
69
  name: Sito Jaxa
59
70
  rank: Ensign
60
71
  position: Security officer
72
+ ship: uss_enterprise_d
61
73
 
62
74
  calloway:
63
75
  name: Maddy Calloway
64
76
  rank: Ensign
65
77
  position: Medical technician
78
+ ship: uss_enterprise_d
66
79
 
67
80
  mayter:
68
81
  name: Van Mayter
69
82
  rank: NCO
70
83
  position: Engineer
84
+ ship: uss_enterprise_d
71
85
 
72
86
  sutter:
73
87
  name: Daniel Sutter
74
88
  rank: Ensign
75
89
  position: Engineer
90
+ ship: uss_enterprise_d
76
91
 
77
92
  bernard:
78
93
  name: Harry Bernard, Sr.
79
94
  rank: Lieutenant
80
95
  position: Oceanographer
96
+ ship: uss_enterprise_d
81
97
 
82
98
  dangelo:
83
99
  name: Dick D'Angelo
84
100
  rank: Lieutenant
85
101
  position: Ops Engineer
102
+ ship: uss_enterprise_d
86
103
 
87
104
  ogawa:
88
105
  name: Alyssa Ogawa
89
106
  rank: Lieutenant
90
107
  position: Nurse
108
+ ship: uss_enterprise_d
91
109
 
92
110
  nesterowicz:
93
111
  name: John Nesterowicz
94
112
  rank: Lieutenant
95
113
  position: WarpField Tech 2
114
+ ship: uss_enterprise_d
96
115
 
97
116
  keiko:
98
117
  name: Keiko O'Brien
99
118
  rank: NCO
100
119
  position: Botanist
120
+ ship: uss_enterprise_d
101
121
 
102
122
  anaya:
103
123
  name: April Anaya
104
124
  rank: Ensign
105
125
  position: Flight controller
126
+ ship: uss_enterprise_d
106
127
 
107
128
  ziff:
108
129
  name: Anaanda Ziff
109
130
  rank: Lieutenant
110
131
  position: Specialist
132
+ ship: uss_enterprise_d
111
133
 
112
134
  tarses:
113
135
  name: Simon Tarses
114
136
  rank: NCO
115
137
  position: Medical technician
138
+ ship: uss_enterprise_d
116
139
 
117
140
  wallace:
118
141
  name: Darien Wallace
119
142
  rank: Lieutenant
120
143
  position: Crewmember
144
+ ship: uss_enterprise_d
121
145
 
122
146
  giddings:
123
147
  name: Diana Giddings
124
148
  rank: Lieutenant
125
149
  position: Junior engineer
150
+ ship: uss_enterprise_d
126
151
 
127
152
  pulaski:
128
153
  name: Katherine Pulaski
129
154
  rank: Commander
130
155
  position: Medical officer
156
+ ship: uss_enterprise_d
131
157
 
132
158
  dumont:
133
159
  name: Suzanne Dumont
134
160
  rank: Ensign
135
161
  position: Crewmember
162
+ ship: uss_enterprise_d
136
163
 
137
164
  tsu:
138
165
  name: Lian T'Su
139
166
  rank: Ensign
140
167
  position: Operations officer
168
+ ship: uss_enterprise_d
141
169
 
142
170
  lynch:
143
171
  name: Leland T. Lynch
144
172
  rank: Lieutenant Commander
145
173
  position: Chief engineer
174
+ ship: uss_enterprise_d
146
175
 
147
176
  dsora:
148
177
  name: Jenna D'Sora
149
178
  rank: Lieutenant Junior Grade
150
179
  position: Security officer
180
+ ship: uss_enterprise_d
151
181
 
152
182
  macdougal:
153
183
  name: Sarah MacDougal
154
184
  rank: Lieutenant Commander
155
185
  position: Chief engineer
186
+ ship: uss_enterprise_d
156
187
 
157
188
  shimoda:
158
189
  name: Jim Shimoda
159
190
  rank: NCO
160
191
  position: Assistant chief engineer
192
+ ship: uss_enterprise_d
161
193
 
162
194
  solis:
163
195
  name: Orfil Solis
164
196
  rank: Lieutenant Junior Grade
165
197
  position: Flight controller
198
+ ship: uss_enterprise_d
166
199
 
167
200
  rhodes:
168
201
  name: Sandra Rhodes
169
202
  rank: Lieutenant
170
203
  position: Security officer
204
+ ship: uss_enterprise_d
171
205
 
172
206
  fratis:
173
207
  name: Jeffrey Fratis
174
208
  rank: Lieutenant
175
209
  position: Crewmember
210
+ ship: uss_enterprise_d
176
211
 
177
212
  mees:
178
213
  name: Jim Mees
179
214
  rank: Lieutenant Commander
180
215
  position: Crewmember
216
+ ship: uss_enterprise_d
181
217
 
182
218
  hubbell:
183
219
  name: Maggie Hubbell
184
220
  rank: Ensign
185
221
  position: Transporter chief
222
+ ship: uss_enterprise_d
186
223
 
187
224
  rager:
188
225
  name: Sariel Rager
189
226
  rank: Ensign
190
227
  position: Helmsman
228
+ ship: uss_enterprise_d
191
229
 
192
230
  robinson:
193
231
  name: B.G. Robinson
194
232
  rank: Lieutenant
195
233
  position: Transporter chief
234
+ ship: uss_enterprise_d
196
235
 
197
236
  allenby:
198
237
  name: Tess Allenby
199
238
  rank: Ensign
200
239
  position: Flight controller
240
+ ship: uss_enterprise_d
201
241
 
202
242
  brooks:
203
243
  name: Janet Brooks
204
244
  rank: Ensign
205
245
  position: Crewmember
246
+ ship: uss_enterprise_d
206
247
 
207
248
  foster:
208
249
  name: Don Foster, Jr.
209
250
  rank: Lieutenant
210
251
  position: WarpField Tech 1
252
+ ship: uss_enterprise_d
211
253
 
212
254
  lefler:
213
255
  name: Robin Lefler
214
256
  rank: Ensign
215
257
  position: Mission Specialist
258
+ ship: uss_enterprise_d
216
259
 
217
260
  lavelle:
218
261
  name: Sam Lavelle
219
262
  rank: Lieutenant Junior Grade
220
263
  position: Operations officer
264
+ ship: uss_enterprise_d
221
265
 
222
266
  prieto:
223
267
  name: Ben Prieto
224
268
  rank: Lieutenant
225
269
  position: Shuttlecraft Pilot
270
+ ship: uss_enterprise_d
226
271
 
227
272
  pacelli:
228
273
  name: Alfonse Pacelli
229
274
  rank: Ensign
230
275
  position: Specialist
276
+ ship: uss_enterprise_d
231
277
 
232
278
  aster:
233
279
  name: Marla Aster
234
280
  rank: Lieutenant
235
281
  position: Archaeologist
282
+ ship: uss_enterprise_d
236
283
 
237
284
  barclay:
238
285
  name: Reginald Barclay
239
286
  rank: Lieutenant
240
287
  position: Systems diagnostic engineer
288
+ ship: uss_enterprise_d
241
289
 
242
290
  salvatore:
243
291
  name: Bruno Salvatore
244
292
  rank: Ensign
245
293
  position: Specialist in biomechanical research
294
+ ship: uss_enterprise_d
246
295
 
247
296
  juarez:
248
297
  name: Francisca Juarez
249
298
  rank: Lieutenant
250
299
  position: Crewmember
300
+ ship: uss_enterprise_d
251
301
 
252
302
  finks:
253
303
  name: Wilbur Finks
254
304
  rank: Lieutenant
255
305
  position: Safety officer
306
+ ship: uss_enterprise_d
256
307
 
257
308
  larson:
258
309
  name: Linda Larson
259
310
  rank: Lieutenant Junior Grade
260
311
  position: Engineer
312
+ ship: uss_enterprise_d
261
313
 
262
314
  gomez:
263
315
  name: Sonya Gomez
264
316
  rank: Ensign
265
317
  position: Engineer
318
+ ship: uss_enterprise_d
266
319
 
267
320
  hagler:
268
321
  name: Edward Hagler
269
322
  rank: Lieutenant
270
323
  position: Crewmember
324
+ ship: uss_enterprise_d
271
325
 
272
326
  lin:
273
327
  name: Peter Lin
274
328
  rank: Ensign
275
329
  position: Flight controller
330
+ ship: uss_enterprise_d
276
331
 
277
332
  kwan:
278
333
  name: Daniel Kwan
279
334
  rank: Lieutenant Junior Grade
280
335
  position: Specialist
336
+ ship: uss_enterprise_d