hydra-tutorial 0.1.3 → 0.2.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 (33) hide show
  1. data/.gitignore +2 -0
  2. data/README.md +92 -22
  3. data/bin/hydra-tutorial +4 -2
  4. data/development_notes.txt +476 -0
  5. data/hydra-tutorial.gemspec +9 -11
  6. data/{templates → old_tutorial/templates}/application/dataset_hydra_mods_om.rb +0 -0
  7. data/{templates → old_tutorial/templates}/application/dataset_hydra_om.rb +0 -0
  8. data/{templates → old_tutorial/templates}/application/datasets_controller.rb +0 -0
  9. data/{or_templates/adding_our_models → old_tutorial/templates/application}/mods_desc_metadata.rb +0 -0
  10. data/{templates → old_tutorial/templates}/building_a_basic_rails_app/dataset_af_om.rb +0 -0
  11. data/{templates → old_tutorial/templates}/building_a_basic_rails_app/dataset_simple_om.rb +0 -0
  12. data/{or_templates → old_tutorial/templates}/building_a_basic_rails_app/fedora.yml +0 -0
  13. data/{templates → old_tutorial/templates}/building_a_basic_rails_app/om_record.rb +0 -0
  14. data/{or_templates → old_tutorial/templates}/building_a_basic_rails_app/solr.yml +0 -0
  15. data/old_tutorial/tutorial.thor +493 -0
  16. data/{or_templates/sprinkle_some_styling → templates}/_add_assets_links.html.erb +0 -0
  17. data/{or_templates/add_file_upload/_form.html.erb → templates/_form.add_file_upload.html.erb} +0 -0
  18. data/{or_templates/wiring_it_into_rails/_form.html.erb → templates/_form.wiring_it_into_rails.html.erb} +0 -0
  19. data/{or_templates/adding_our_models → templates}/basic_af_model.rb +0 -0
  20. data/{or_templates/adding_our_models → templates}/basic_mods_model.rb +0 -0
  21. data/{or_templates/adding_our_models → templates}/basic_om_model.rb +0 -0
  22. data/{or_templates/add_tests → templates}/ci.rake +0 -0
  23. data/{or_templates/add_tests → templates}/ci_with_coverage.rake +0 -0
  24. data/templates/{building_a_basic_rails_app/fedora.yml → fedora.yml} +0 -0
  25. data/{or_templates/add_tests → templates}/integration_spec.rb +0 -0
  26. data/templates/{application/mods_desc_metadata.rb → mods_desc_metadata.rb} +0 -0
  27. data/{or_templates → templates}/records_controller.rb +0 -0
  28. data/{or_templates/add_tests → templates}/records_controller_spec.rb +0 -0
  29. data/{or_templates/wiring_it_into_rails → templates}/show.html.erb +0 -0
  30. data/templates/{building_a_basic_rails_app/solr.yml → solr.yml} +0 -0
  31. data/tutorial.thor +806 -341
  32. metadata +32 -30
  33. data/open-repositories-tutorial.thor +0 -888
data/.gitignore CHANGED
@@ -2,3 +2,5 @@ hydra_tutorial_app
2
2
  jetty
3
3
  pkg
4
4
  Gemfile.lock
5
+ .rvmrc
6
+ .hydra-tutorial-progress
data/README.md CHANGED
@@ -2,34 +2,104 @@
2
2
 
3
3
  The tutorial will:
4
4
 
5
- * installs basic application prerequisites
6
- * generate a new rails application
7
- * walks through building a Hydra model:
8
- * first, as a AF::Base object with an XML datastream
9
- * then, with a simple OM terminology for a basic, contrived schema
10
- * finally, with a simple MODS-based terminology
11
- * wire the model into Rails using standard Rails scaffolding
12
- * adding blacklight and hydra-head gems for object discovery
13
- * add a basic rspec/capybara test
14
-
15
- Throughout the process, there's a number of prompts to poke around the
16
- rails console and/or in a browser. At the end of the tutorial, you have
17
- a working Hydra Head for adding MODS-based metadata records. In the next
18
- release, I'll try to wire in file uploads, collections, etc.
5
+ * Install all Hydra / Rails application prerequisites.
6
+ * Generate a new rails application.
7
+ * Walk through building a Hydra model:
8
+ * First, as an ActiveFedora::Base object with an XML datastream.
9
+ * Then, with a simple OM terminology for a basic, contrived schema
10
+ * Finally, with a simple MODS-based terminology.
11
+ * Wire the model into Rails using standard Rails scaffolding.
12
+ * Add blacklight and hydra-head gems for object discovery.
13
+ * Add some basic Rspec and Capybara tests.
14
+
15
+ At the end of the tutorial, you will have a working Hydra Head for adding
16
+ MODS-based metadata records.
17
+
18
+ Throughout the process, there are several prompts to poke around the Rails
19
+ console and/or in a browser. In addition, Git is used to help you track changes
20
+ in the code from one step of the tutorial to the next.
21
+
22
+ In subsequent releases of the tutorial, we will try to wire in file uploads,
23
+ collections, more complete test example, etc.
19
24
 
20
25
  ## Pre-requisites
21
- * ruby v 1.8.7 or higher
22
- * java 1.5 or higher (in order to run solr under a java servlet container)
23
- * [[RVM|https://rvm.beginrescueend.com/rvm/install/]] (recommended)
24
26
 
25
- ## Using
27
+ This tutorial depends on the following:
28
+
29
+ * A Unix-like operating system.
30
+ * Ruby 1.8.7 or higher (but 1.9 is recommended).
31
+ * Java 1.5 or higher (to run Solr under a Java servlet container).
32
+ * [RVM](https://rvm.beginrescueend.com/rvm/install/) (recommended).
33
+ * Git (recommended).
34
+
35
+ ActiveFedora, Hydra, and Rails require some gems that compile binaries and
36
+ rely on installed system libraries like libxml, libxslt, and sqlite. If
37
+ these aren't installed, the tutorial *will not function properly*. If
38
+ something seems wrong, try running `bundle install` directly inside the
39
+ tutorial directory, and watch the output carefully.
40
+
41
+ ## Setup
42
+
43
+ Install rvm to get Ruby:
44
+
26
45
  ```bash
27
- <INSTALL RUBY, e.g.:
28
46
  $ curl -L https://get.rvm.io | bash -s stable --ruby
29
- $ rvm install 1.9.3
30
- (See https://rvm.io/rvm/install/ )
31
- >
47
+ $ rvm install 1.9.3 # (See https://rvm.io/rvm/install/ )
48
+ ```
49
+
50
+ Consider using a hydra-specific gemset.
51
+
52
+ ```bash
53
+ $ rvm use 1.9.3@hydra-tutorial --create
54
+ ```
55
+
56
+ Install the hydra-tutorial gem:
57
+
58
+ ```bash
32
59
  $ gem install hydra-tutorial
60
+ ```
61
+
62
+ ## Running the tutorial
63
+
64
+ Run the tutorial one step at a time -- specifically, run the next step
65
+ in the tutorial:
66
+
67
+ ```bash
33
68
  $ hydra-tutorial
34
69
  ```
35
70
 
71
+ Run all remaining steps in the tutorial:
72
+
73
+ ```bash
74
+ $ hydra-tutorial --run-all
75
+ ```
76
+
77
+ Reset the tutorial back to the beginning:
78
+
79
+ ```bash
80
+ $ hydra-tutorial --reset
81
+ $ rm -rf hydra_tutorial_app # Or rename the directory.
82
+ ```
83
+
84
+ Other options relevant to users:
85
+
86
+ --no-git # Do not create Git commits for each tutorial step.
87
+ --diff # Run git diff: previous vs. current code.
88
+ --app FOO # Set the name of the Rails application subdirectory.
89
+ # The default is hydra_tutorial_app.
90
+
91
+ ## Known issues
92
+
93
+ If the tutorial bombs with the `execJs: 'Could not find a JavaScript runtime'`
94
+ error, you may need to install a Javascript runtime such as
95
+ [node.js](https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager).
96
+
97
+
98
+ ## Developer notes
99
+
100
+ You can run the entire tutorial non-interactively from the root of the Git
101
+ project checkout:
102
+
103
+ ```bash
104
+ $ bin/hydra-tutorial --run-all --quick
105
+ ```
@@ -1,4 +1,6 @@
1
- #!/usr/bin/env ruby
1
+ #! /usr/bin/env ruby
2
2
 
3
- exec File.expand_path(File.join(File.dirname(__FILE__), '..', 'open-repositories-tutorial.thor')), *ARGV
3
+ # Invokes the tutorial's main() task.
4
4
 
5
+ tutorial = File.join(File.dirname(__FILE__), '..', 'tutorial.thor')
6
+ exec(tutorial, 'main', *ARGV)
@@ -0,0 +1,476 @@
1
+ TODO:
2
+ - Incorporate enhancements from notes.txt info tutorial.
3
+
4
+ - Improve README.
5
+ - Remove monkey-patch to hydra-head.
6
+ - Write method to extract long messages from the tutorial code.
7
+ - Support the --pop option.
8
+ - Implement a --help option.
9
+ - Support control over verbosity, and tie it to :capture declarations.
10
+ - Improve tutorial unit tests.
11
+ - Improve the views in the tutorial.
12
+ - Write unit tests for the tutorial script itself.
13
+ - Write an integration test for the entire tutorial.
14
+
15
+
16
+ ====================================================================
17
+
18
+ # Install a version of Ruby.
19
+
20
+ # Install RVM.
21
+
22
+ # Install Ruby 1.9.
23
+
24
+ # Create a gemset
25
+ rvm use --rvmrc --create 1.9.3@hydra_walkthrough
26
+
27
+ # See current gems.
28
+ gem list
29
+
30
+ # Install bundler and Rails.
31
+ gem install bundler rails
32
+
33
+ # See the effect.
34
+ gem list
35
+
36
+ # Initialize a new Rails application.
37
+ rails new hydra_walkthrough
38
+
39
+ # Put the .rvmrc file in our project directory.
40
+ mv .rvmrc hydra_walkthrough
41
+
42
+ # Get a copy of the resources directory.
43
+ ...
44
+
45
+ # Get a copy the hydra-jetty project.
46
+ git clone git://github.com/projecthydra/hydra-jetty.git
47
+
48
+ # Put a copy of it into our Rails project.
49
+ cp -r hydra-jetty hydra_walkthrough/jetty
50
+
51
+ # Check out the initial Rails app.
52
+ cd hydra_walkthrough
53
+
54
+ # Add to .gitignore
55
+ jetty
56
+ .rvmrc
57
+ Gemfile.lock
58
+
59
+ # Git.
60
+ git init
61
+ git add .
62
+ git commit -m 'Initial commit'
63
+
64
+ # Run the Rails server in a second terminal window.
65
+ rails server
66
+ open http://localhost:3000
67
+
68
+ # Check before we add some gems.
69
+ rake -T
70
+
71
+ # Add some lines to Gemfile.
72
+ # In the :assets block.
73
+ gem 'execjs'
74
+ gem 'therubyracer', :platforms => :ruby
75
+
76
+ # In the :development block.
77
+ gem 'jettywrapper'
78
+ gem 'debugger'
79
+
80
+ # Git.
81
+ git add .
82
+ git commit -m 'Added some gems: execjs, therubyracer, jettywrapper, debugger'
83
+
84
+ # Set up SOLR and Fedora config files.
85
+ cp ../resources/solr.yml config
86
+ cp ../resources/fedora.yml config
87
+
88
+ # Git.
89
+ git add -A
90
+ git commit -m 'Created SOLR and Fedora config files'
91
+
92
+ # Bundle.
93
+ bundle install
94
+
95
+ # Check after: note the jetty tasks.
96
+ rake -T
97
+
98
+ # Start the Jetty server that will run Fedora and SOLR.
99
+ rake jetty:start
100
+
101
+ # Check them out.
102
+ open http://localhost:8983/fedora/
103
+ open http://localhost:8983/solr/development/admin/
104
+
105
+ # More Gemile.
106
+ gem 'active-fedora'
107
+ gem 'om'
108
+
109
+ # Bundle.
110
+ bundle install
111
+
112
+ # Git.
113
+ git add .
114
+ git commit -m 'Added active-fedora and OM gems'
115
+
116
+ # Create a basic model.
117
+ cp ../resources/basic_af_model.rb app/models/record.rb
118
+
119
+ # Git.
120
+ git add -A
121
+ git commit -m 'Created a basic Record model with a descMetadata datastream'
122
+
123
+ # Check it out.
124
+ rails console
125
+
126
+ ## CREATE
127
+ > obj = Record.new
128
+ > xml = '<xyz><foo>ABC</foo><foo>DEF</foo><bar>123</bar></xyz>'
129
+ > obj.descMetadata.content = xml
130
+ > obj.save
131
+
132
+ > pid = obj.pid
133
+
134
+ ## RETRIEVE
135
+ > obj = Record.find(pid)
136
+ > ds = obj.descMetadata
137
+ > puts ds.content
138
+
139
+ ## UPDATE
140
+ > doc = ds.ng_xml
141
+ > elements = doc.xpath '//foo'
142
+ > elements.each { |e| puts e }
143
+ > exit
144
+
145
+ # Check it out in the browser.
146
+ open http://localhost:8983/fedora/objects/
147
+ -> click search
148
+ -> click the hyperlink of the object's PID (eg, 'changeme:1')
149
+ -> click hyperlink to view the object's datastreams list
150
+ -> click hyperlink to view the content of the descMetadata datastream
151
+
152
+ # Back in the Rails console:
153
+
154
+ rails console
155
+
156
+ ## DELETE
157
+ > obj = Record.find('changeme:1')
158
+ > obj.delete
159
+ > exit
160
+
161
+ # Check it out in the browser.
162
+ # And click search button.
163
+ open http://localhost:8983/fedora/objects/
164
+
165
+ # Enhance our datastream.
166
+ cp ../resources/basic_om_model.rb app/models/record.rb
167
+
168
+ # Git.
169
+ git commit -am 'Added an OM terminology'
170
+
171
+ # Check it out.
172
+ rails console
173
+
174
+ > obj = Record.new
175
+ > obj.descMetadata.title = "My object title"
176
+ > obj.save
177
+ > puts obj.descMetadata.content
178
+ > obj.delete
179
+ > exit
180
+
181
+ # Modify record.rb
182
+ # Add this after the has_metadata call.
183
+
184
+ delegate :title, :to => 'descMetadata'
185
+
186
+ # Git.
187
+ git commit -am 'Added delegate() to the model'
188
+
189
+ # Check it out.
190
+ rails console
191
+
192
+ > obj = Record.new
193
+ > obj.title = "My object title"
194
+ > obj.save
195
+ > puts obj.descMetadata.content
196
+ > puts obj.title.inspect
197
+ > obj.delete
198
+ > exit
199
+
200
+ # Use delegate_to().
201
+ # Replace the delete() line.
202
+
203
+ delegate_to 'descMetadata', [:title, :author, :url, :description], :unique => true
204
+
205
+ # Git.
206
+ git commit -am 'Switched to delegate_to()'
207
+
208
+ # Check it out.
209
+ rails console
210
+
211
+ > obj = Record.new
212
+ > obj.title = "Some title"
213
+ > obj.title
214
+ > obj.author = 'Some author'
215
+ > obj.save
216
+ > puts obj.descMetadata.contnet
217
+ > puts obj.descMetadata.content
218
+ > obj.delete
219
+ > exit
220
+
221
+ # Enhance our model.
222
+ # This example is too complicated.
223
+ # Also, it undoes the delegate_to().
224
+ cp ../resources/basic_mods_model.rb app/models/record.rb
225
+ cp ../resources/mods_desc_metadata.rb app/models/mods_desc_metadata.rb
226
+
227
+ # Git.
228
+ git add -A
229
+ git commit -m 'Added a more extensive OM example'
230
+
231
+ # Check it out.
232
+ rails console
233
+
234
+ > obj = Record.new
235
+ > obj.title = "My object title"
236
+ > obj.save
237
+ > puts obj.descMetadata.content
238
+ > obj.delete
239
+ > exit
240
+
241
+ # Initialize a controller and views for our Record model.
242
+ rails generate scaffold_controller Record --no-helper --skip-test-framework
243
+
244
+ # Git.
245
+ git add -A
246
+ git commit -m 'Added a basic controller and views for the Record model'
247
+
248
+ # Check files that were created.
249
+ app/controlers/records_controller.rb
250
+ app/views/records/
251
+
252
+ # Modify config/routes.rb
253
+ resources :records
254
+
255
+ # Git.
256
+ git commit -am 'Set up resourceful routing for the Record model'
257
+
258
+ # Put some files in place.
259
+ cp ../resources/_form.html.erb app/views/records/_form.html.erb
260
+ cp ../resources/show.html.erb app/views/records/show.html.erb
261
+
262
+ # Git.
263
+ git commit -am 'Fleshed out the edit form and show page'
264
+
265
+ # Try it out.
266
+ # Delete links are not working.
267
+ # Keywords are not being saved.
268
+ # The view has multiple problems and is not in synce with the model.
269
+ open http://localhost:3000/records/new
270
+
271
+ # More Gemile.
272
+ gem 'blacklight'
273
+ gem 'hydra-head'
274
+ gem 'devise'
275
+
276
+ # Git.
277
+ git commit -am 'Added blacklight, hydra-head, and devise'
278
+
279
+ # Bundle.
280
+ bundle install
281
+
282
+ # Remove some files.
283
+ rm public/index.html
284
+ rm config/solr.yml
285
+
286
+ # Set up devise.
287
+ rails generate blacklight --devise
288
+
289
+ # Git.
290
+ git add -A
291
+ git commit -m 'Set up devise'
292
+
293
+ # Remove some files.
294
+ rm config/solr.yml
295
+ rm app/controllers/catalog_controller.rb
296
+
297
+ # Set up a User model for hydra-head.
298
+ rails generate hydra:head User
299
+
300
+ # Do some stuff.
301
+ rake db:migrate
302
+ rake db:test:prepare
303
+ rake jetty:stop
304
+ rake hydra:jetty:config
305
+ rake jetty:start
306
+
307
+ # Git.
308
+ git add -A
309
+ git commit -m 'Set up User model under hydra-head'
310
+
311
+ # Various edits:
312
+
313
+ # app/controllers/records_controller.rb
314
+ include Hydra::AssetsControllerHelper
315
+ include Hydra::AccessControlsEnforcement
316
+ before_filter :enforce_access_controls
317
+
318
+ # app/controllers/records_controller.rb
319
+ # In create(), after @record is set.
320
+ apply_depositor_metadata(@record)
321
+
322
+ # app/models/record.rb
323
+ include Hydra::ModelMixins::CommonMetadata
324
+ include Hydra::ModelMethods
325
+
326
+ # app/models/solr_document.rb
327
+ # After other includes.
328
+ include Hydra::Solr::Document
329
+
330
+ # app/assets/javascripts/application.js
331
+ # At end of file.
332
+ Blacklight.do_search_context_behavior = function() { }
333
+
334
+ # Git.
335
+ git commit -am 'Included hydra-head into our model, controller, etc.'
336
+
337
+ # Check it out.
338
+ # Needed to edit hydra-head: _user_util_links.html.erb
339
+ open http://localhost:3000/records/new
340
+ -> Click sign up.
341
+ -> Enter any email and password.
342
+
343
+ # Add some gems for testing.
344
+ # In the :test group (and :development group?)
345
+ gem 'rspec'
346
+ gem 'rspec-rails'
347
+
348
+ # Git.
349
+ git commit -am 'Added rspec gem'
350
+
351
+ # Bundle
352
+ bundle install
353
+
354
+ # Set up rspec.
355
+ rails generate rspec:install
356
+
357
+ # Git.
358
+ git add -A
359
+ git commit -m 'Initialized rspec directory'
360
+
361
+ # Create a test.
362
+ # This test should do something real.
363
+ mkdir spec/controllers
364
+ cp ../resources/records_controller_spec.rb spec/controllers/records_controller_spec.rb
365
+
366
+ # Git.
367
+ git add -A
368
+ git commit -m 'Create a placeholder test'
369
+
370
+ # Run the test
371
+ rspec
372
+
373
+ # Add some gems for testing.
374
+ # In the :test group (and :development group?)
375
+ gem 'capybara'
376
+
377
+ # Bundle
378
+ bundle install
379
+
380
+ # Git.
381
+ git commit -am 'Added capybara gem'
382
+
383
+ # Create a test.
384
+ mkdir spec/integration
385
+ cp ../resources/integration_spec.rb spec/integration/integration_spec.rb
386
+
387
+ # Git.
388
+ git add -A
389
+ git commit -m 'Created a few integration tests'
390
+
391
+ # Run the tests
392
+ rspec
393
+
394
+ # Create a ci rake task.
395
+ cp ../resources/ci.rake lib/tasks/ci.rake
396
+
397
+ # Git.
398
+ git add -A
399
+ git commit -m 'Created a ci rake task'
400
+
401
+ # Run it.
402
+ rake jetty:stop
403
+ rake ci
404
+ rake jetty:start
405
+
406
+ # Add a gem for test coverage.
407
+ # In the :test group (and :development group?)
408
+ gem 'simplecov'
409
+
410
+ # Bundle
411
+ bundle install
412
+
413
+ # Git.
414
+ git commit -am 'Added simplecov gem'
415
+
416
+ # ci.rake
417
+ # After Rails.env is set.
418
+ ENV['COVERAGE'] ||= 'true'
419
+
420
+ # spec/spec_helper.rb
421
+ # After ENV['RAILS_ENV'] is set.
422
+ if ENV['COVERAGE'] == "true"
423
+ require 'simplecov'
424
+ SimpleCov.start do
425
+ add_filter "config/"
426
+ add_filter "spec/"
427
+ end
428
+ end
429
+
430
+ # Add to .gitignore
431
+ coverage
432
+
433
+ # Git
434
+ git commit -am 'Set up test coverage'
435
+
436
+ # Run it.
437
+ rake jetty:stop
438
+ rake ci
439
+ rake jetty:start
440
+
441
+ # Check test coverage
442
+ open coverage/index.html
443
+
444
+ # app/models/record.rb
445
+ # After has_metadata
446
+ has_file_datastream :name => 'content', :type => ActiveFedora::Datastream
447
+
448
+ # app/controllers/records_controller.rb
449
+ include Hydra::Controller::UploadBehavior
450
+
451
+ # app/controllers/records_controller.rb
452
+ # After: apply_depositor_metadata().
453
+ @record.label = params[:record][:title] # this is a bad hack to work around an AF bug
454
+ add_posted_blob_to_asset(@record, params[:filedata]) if params.has_key?(:filedata)
455
+
456
+ # app/views/records/_form.html.erb
457
+ # Delete first line. Use this instead:
458
+ <%= form_for(@record, :html => { :multipart => true } ) do |f| -%>
459
+ <h2>File</h2>
460
+ <%= file_field_tag "filedata" %>
461
+
462
+ # Get stuff.
463
+ cp ../resources/_add_assets_links.html.erb app/views/_add_assets_links.html.erb
464
+
465
+ # Git.
466
+ git add -A
467
+ git commit -m 'Add some styling and link to new Record in the header of the layout'
468
+
469
+ # Run the app.
470
+ rake jetty:stop
471
+ rake jetty:start
472
+ rails server
473
+
474
+ # Wrap up.
475
+ Shut down rails server (CTRL-C)
476
+ rake jetty:stop