fortitude 0.0.5 → 0.0.6

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +20 -20
  3. data/CHANGES.md +19 -0
  4. data/CONTRIBUTORS.md +2 -0
  5. data/fortitude.gemspec +1 -0
  6. data/lib/fortitude/rails/railtie.rb +27 -75
  7. data/lib/fortitude/rails/rendering_methods.rb +77 -0
  8. data/lib/fortitude/tags/tags_module.rb +1 -0
  9. data/lib/fortitude/tilt/fortitude_template.rb +3 -1
  10. data/lib/fortitude/version.rb +1 -1
  11. data/lib/fortitude/widget/modules_and_subclasses.rb +2 -0
  12. data/spec/helpers/fortitude_rails_helpers.rb +19 -0
  13. data/spec/helpers/global_helper.rb +4 -2
  14. data/spec/rails/capture_system_spec.rb +1 -1
  15. data/spec/rails/development_mode_system_spec.rb +100 -6
  16. data/spec/rails/mailer_system_spec.rb +31 -0
  17. data/spec/rails/rendering_system_spec.rb +3 -3
  18. data/spec/rails/templates/development_mode_system_spec/app/controllers/development_mode_system_spec_controller.rb +16 -0
  19. data/spec/rails/templates/development_mode_system_spec/app/controllers/replaced_controller.rb +5 -0
  20. data/spec/rails/templates/development_mode_system_spec/app/mailers/development_mode_mailer.rb +17 -0
  21. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_mailer/mailer_formatting_test.rb +7 -0
  22. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_mailer/mailer_layout_test.rb +5 -0
  23. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_mailer/mailer_view_test.rb +5 -0
  24. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/mailer_formatting_test.rb +5 -0
  25. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/mailer_layout_test.rb +5 -0
  26. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/mailer_view_test.rb +5 -0
  27. data/spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/reload_widget_with_html_extension.html.rb +8 -0
  28. data/spec/rails/templates/development_mode_system_spec/app/views/layouts/mail_layout.rb +7 -0
  29. data/spec/rails/templates/development_mode_system_spec/app/views/replaced/reload_widget.rb +7 -0
  30. data/spec/rails/templates/development_mode_system_spec/app/views/shared/some_module.rb +5 -0
  31. data/spec/rails/templates/development_mode_system_spec/config/environments/development.rb +39 -0
  32. data/spec/rails/templates/mailer_system_spec/app/controllers/mailer_system_spec_controller.rb +17 -0
  33. data/spec/rails/templates/mailer_system_spec/app/mailers/basic_mailer.rb +25 -0
  34. data/spec/rails/templates/mailer_system_spec/app/views/basic_mailer/basic_mail.rb +5 -0
  35. data/spec/rails/templates/mailer_system_spec/app/views/basic_mailer/mail_with_erb_layout_and_fortitude_view.rb +5 -0
  36. data/spec/rails/templates/mailer_system_spec/app/views/basic_mailer/mail_with_fortitude_layout.rb +5 -0
  37. data/spec/rails/templates/mailer_system_spec/app/views/basic_mailer/mail_with_fortitude_layout_and_erb_view.html.erb +1 -0
  38. data/spec/rails/templates/mailer_system_spec/app/views/layouts/erb_layout.html.erb +1 -0
  39. data/spec/rails/templates/mailer_system_spec/app/views/layouts/fortitude_layout.rb +8 -0
  40. data/spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail.rb +5 -0
  41. data/spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail_with_erb_layout_and_fortitude_view.rb +5 -0
  42. data/spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail_with_fortitude_layout.rb +5 -0
  43. data/spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail_with_fortitude_layout_and_erb_view.rb +5 -0
  44. data/spec/rails/templates/mailer_system_spec/config/environments/production.rb +84 -0
  45. data/spec/rails/templates/rendering_system_spec/app/views/layouts/application.html.erb +1 -1
  46. data/spec/rails/templates/rules_system_spec/app/views/layouts/fortitude_layout_with_p.rb +1 -1
  47. data/spec/system/tilt_system_spec.rb +15 -0
  48. metadata +73 -16
  49. data/spec/helpers/rails_helpers.rb +0 -85
  50. data/spec/helpers/rails_server.rb +0 -390
  51. data/spec/rails/templates/base/app/controllers/application_controller.rb +0 -15
  52. data/spec/rails/templates/base/app/controllers/working_controller.rb +0 -5
  53. data/spec/rails/templates/base/app/views/layouts/application.html.erb +0 -11
  54. data/spec/rails/templates/base/config/routes.rb +0 -4
  55. data/spec/rails/templates/base/config/secrets.yml +0 -22
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fortitude
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Geweke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-24 00:00:00.000000000 Z
11
+ date: 2014-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '2.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: oop_rails_server
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 0.0.3
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 0.0.3
111
125
  description: 'Views Are Code: use all the power of Ruby to build views in your own
112
126
  language.'
113
127
  email:
@@ -163,6 +177,7 @@ files:
163
177
  - lib/fortitude/rails/helpers.rb
164
178
  - lib/fortitude/rails/railtie.rb
165
179
  - lib/fortitude/rails/renderer.rb
180
+ - lib/fortitude/rails/rendering_methods.rb
166
181
  - lib/fortitude/rails/template_handler.rb
167
182
  - lib/fortitude/rails/widget_methods.rb
168
183
  - lib/fortitude/rails/yielded_object_outputter.rb
@@ -210,9 +225,8 @@ files:
210
225
  - lib/fortitude/widgets/xhtml10_transitional.rb
211
226
  - lib/fortitude/widgets/xhtml11.rb
212
227
  - lib/fortitude_jruby_native_ext.jar
228
+ - spec/helpers/fortitude_rails_helpers.rb
213
229
  - spec/helpers/global_helper.rb
214
- - spec/helpers/rails_helpers.rb
215
- - spec/helpers/rails_server.rb
216
230
  - spec/helpers/system_helpers.rb
217
231
  - spec/rails/basic_rails_system_spec.rb
218
232
  - spec/rails/capture_system_spec.rb
@@ -228,16 +242,12 @@ files:
228
242
  - spec/rails/helpers_unrefined_system_spec.rb
229
243
  - spec/rails/layouts_system_spec.rb
230
244
  - spec/rails/localization_system_spec.rb
245
+ - spec/rails/mailer_system_spec.rb
231
246
  - spec/rails/production_mode_system_spec.rb
232
247
  - spec/rails/rendering_context_system_spec.rb
233
248
  - spec/rails/rendering_system_spec.rb
234
249
  - spec/rails/rules_system_spec.rb
235
250
  - spec/rails/static_method_system_spec.rb
236
- - spec/rails/templates/base/app/controllers/application_controller.rb
237
- - spec/rails/templates/base/app/controllers/working_controller.rb
238
- - spec/rails/templates/base/app/views/layouts/application.html.erb
239
- - spec/rails/templates/base/config/routes.rb
240
- - spec/rails/templates/base/config/secrets.yml
241
251
  - spec/rails/templates/basic_rails_system_spec/app/controllers/basic_rails_system_spec_controller.rb
242
252
  - spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_one.rb
243
253
  - spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_three.rb
@@ -320,8 +330,21 @@ files:
320
330
  - spec/rails/templates/default_layout_system_spec/app/views/default_layout_system_spec/widget_with_widget_default_layout.rb
321
331
  - spec/rails/templates/default_layout_system_spec/app/views/layouts/application.rb
322
332
  - spec/rails/templates/development_mode_system_spec/app/controllers/development_mode_system_spec_controller.rb
333
+ - spec/rails/templates/development_mode_system_spec/app/controllers/replaced_controller.rb
334
+ - spec/rails/templates/development_mode_system_spec/app/mailers/development_mode_mailer.rb
335
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_mailer/mailer_formatting_test.rb
336
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_mailer/mailer_layout_test.rb
337
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_mailer/mailer_view_test.rb
338
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/mailer_formatting_test.rb
339
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/mailer_layout_test.rb
340
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/mailer_view_test.rb
323
341
  - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/reload_widget.rb
342
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/reload_widget_with_html_extension.html.rb
324
343
  - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/sample_output.rb
344
+ - spec/rails/templates/development_mode_system_spec/app/views/layouts/mail_layout.rb
345
+ - spec/rails/templates/development_mode_system_spec/app/views/replaced/reload_widget.rb
346
+ - spec/rails/templates/development_mode_system_spec/app/views/shared/some_module.rb
347
+ - spec/rails/templates/development_mode_system_spec/config/environments/development.rb
325
348
  - spec/rails/templates/erb_integration_system_spec/app/controllers/erb_integration_system_spec_controller.rb
326
349
  - spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_erb_partial_from_widget_partial.html.erb
327
350
  - spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_fortitude_partial_with_underscore_partial.rb
@@ -392,6 +415,19 @@ files:
392
415
  - spec/rails/templates/localization_system_spec/config/locales/en.yml
393
416
  - spec/rails/templates/localization_system_spec/config/locales/fr.yml
394
417
  - spec/rails/templates/localization_system_spec/config/locales/pt.yml
418
+ - spec/rails/templates/mailer_system_spec/app/controllers/mailer_system_spec_controller.rb
419
+ - spec/rails/templates/mailer_system_spec/app/mailers/basic_mailer.rb
420
+ - spec/rails/templates/mailer_system_spec/app/views/basic_mailer/basic_mail.rb
421
+ - spec/rails/templates/mailer_system_spec/app/views/basic_mailer/mail_with_erb_layout_and_fortitude_view.rb
422
+ - spec/rails/templates/mailer_system_spec/app/views/basic_mailer/mail_with_fortitude_layout.rb
423
+ - spec/rails/templates/mailer_system_spec/app/views/basic_mailer/mail_with_fortitude_layout_and_erb_view.html.erb
424
+ - spec/rails/templates/mailer_system_spec/app/views/layouts/erb_layout.html.erb
425
+ - spec/rails/templates/mailer_system_spec/app/views/layouts/fortitude_layout.rb
426
+ - spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail.rb
427
+ - spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail_with_erb_layout_and_fortitude_view.rb
428
+ - spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail_with_fortitude_layout.rb
429
+ - spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail_with_fortitude_layout_and_erb_view.rb
430
+ - spec/rails/templates/mailer_system_spec/config/environments/production.rb
395
431
  - spec/rails/templates/production_mode_system_spec/app/controllers/production_mode_system_spec_controller.rb
396
432
  - spec/rails/templates/production_mode_system_spec/app/views/production_mode_system_spec/sample_output.rb
397
433
  - spec/rails/templates/rendering_context_system_spec/app/controllers/rendering_context_system_spec_controller.rb
@@ -514,9 +550,8 @@ signing_key:
514
550
  specification_version: 4
515
551
  summary: 'Views Are Code: use all the power of Ruby to build views in your own language.'
516
552
  test_files:
553
+ - spec/helpers/fortitude_rails_helpers.rb
517
554
  - spec/helpers/global_helper.rb
518
- - spec/helpers/rails_helpers.rb
519
- - spec/helpers/rails_server.rb
520
555
  - spec/helpers/system_helpers.rb
521
556
  - spec/rails/basic_rails_system_spec.rb
522
557
  - spec/rails/capture_system_spec.rb
@@ -532,16 +567,12 @@ test_files:
532
567
  - spec/rails/helpers_unrefined_system_spec.rb
533
568
  - spec/rails/layouts_system_spec.rb
534
569
  - spec/rails/localization_system_spec.rb
570
+ - spec/rails/mailer_system_spec.rb
535
571
  - spec/rails/production_mode_system_spec.rb
536
572
  - spec/rails/rendering_context_system_spec.rb
537
573
  - spec/rails/rendering_system_spec.rb
538
574
  - spec/rails/rules_system_spec.rb
539
575
  - spec/rails/static_method_system_spec.rb
540
- - spec/rails/templates/base/app/controllers/application_controller.rb
541
- - spec/rails/templates/base/app/controllers/working_controller.rb
542
- - spec/rails/templates/base/app/views/layouts/application.html.erb
543
- - spec/rails/templates/base/config/routes.rb
544
- - spec/rails/templates/base/config/secrets.yml
545
576
  - spec/rails/templates/basic_rails_system_spec/app/controllers/basic_rails_system_spec_controller.rb
546
577
  - spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_one.rb
547
578
  - spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_three.rb
@@ -624,8 +655,21 @@ test_files:
624
655
  - spec/rails/templates/default_layout_system_spec/app/views/default_layout_system_spec/widget_with_widget_default_layout.rb
625
656
  - spec/rails/templates/default_layout_system_spec/app/views/layouts/application.rb
626
657
  - spec/rails/templates/development_mode_system_spec/app/controllers/development_mode_system_spec_controller.rb
658
+ - spec/rails/templates/development_mode_system_spec/app/controllers/replaced_controller.rb
659
+ - spec/rails/templates/development_mode_system_spec/app/mailers/development_mode_mailer.rb
660
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_mailer/mailer_formatting_test.rb
661
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_mailer/mailer_layout_test.rb
662
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_mailer/mailer_view_test.rb
663
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/mailer_formatting_test.rb
664
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/mailer_layout_test.rb
665
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/mailer_view_test.rb
627
666
  - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/reload_widget.rb
667
+ - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/reload_widget_with_html_extension.html.rb
628
668
  - spec/rails/templates/development_mode_system_spec/app/views/development_mode_system_spec/sample_output.rb
669
+ - spec/rails/templates/development_mode_system_spec/app/views/layouts/mail_layout.rb
670
+ - spec/rails/templates/development_mode_system_spec/app/views/replaced/reload_widget.rb
671
+ - spec/rails/templates/development_mode_system_spec/app/views/shared/some_module.rb
672
+ - spec/rails/templates/development_mode_system_spec/config/environments/development.rb
629
673
  - spec/rails/templates/erb_integration_system_spec/app/controllers/erb_integration_system_spec_controller.rb
630
674
  - spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_erb_partial_from_widget_partial.html.erb
631
675
  - spec/rails/templates/erb_integration_system_spec/app/views/erb_integration_system_spec/_fortitude_partial_with_underscore_partial.rb
@@ -696,6 +740,19 @@ test_files:
696
740
  - spec/rails/templates/localization_system_spec/config/locales/en.yml
697
741
  - spec/rails/templates/localization_system_spec/config/locales/fr.yml
698
742
  - spec/rails/templates/localization_system_spec/config/locales/pt.yml
743
+ - spec/rails/templates/mailer_system_spec/app/controllers/mailer_system_spec_controller.rb
744
+ - spec/rails/templates/mailer_system_spec/app/mailers/basic_mailer.rb
745
+ - spec/rails/templates/mailer_system_spec/app/views/basic_mailer/basic_mail.rb
746
+ - spec/rails/templates/mailer_system_spec/app/views/basic_mailer/mail_with_erb_layout_and_fortitude_view.rb
747
+ - spec/rails/templates/mailer_system_spec/app/views/basic_mailer/mail_with_fortitude_layout.rb
748
+ - spec/rails/templates/mailer_system_spec/app/views/basic_mailer/mail_with_fortitude_layout_and_erb_view.html.erb
749
+ - spec/rails/templates/mailer_system_spec/app/views/layouts/erb_layout.html.erb
750
+ - spec/rails/templates/mailer_system_spec/app/views/layouts/fortitude_layout.rb
751
+ - spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail.rb
752
+ - spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail_with_erb_layout_and_fortitude_view.rb
753
+ - spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail_with_fortitude_layout.rb
754
+ - spec/rails/templates/mailer_system_spec/app/views/mailer_system_spec/send_mail_with_fortitude_layout_and_erb_view.rb
755
+ - spec/rails/templates/mailer_system_spec/config/environments/production.rb
699
756
  - spec/rails/templates/production_mode_system_spec/app/controllers/production_mode_system_spec_controller.rb
700
757
  - spec/rails/templates/production_mode_system_spec/app/views/production_mode_system_spec/sample_output.rb
701
758
  - spec/rails/templates/rendering_context_system_spec/app/controllers/rendering_context_system_spec_controller.rb
@@ -1,85 +0,0 @@
1
- require 'active_support'
2
- require 'json'
3
- require 'helpers/rails_server'
4
-
5
- module RailsHelpers
6
- extend ActiveSupport::Concern
7
-
8
- attr_reader :rails_server
9
-
10
- def rails_template_name
11
- @rails_template_name || raise("No Rails template name!")
12
- end
13
-
14
- def full_path(subpath)
15
- "#{rails_template_name}/#{subpath}"
16
- end
17
-
18
- def get(subpath, options = { })
19
- @rails_server.get(full_path(subpath), options)
20
- end
21
-
22
- def get_response(subpath, options = { })
23
- @rails_server.get_response(full_path(subpath), options)
24
- end
25
-
26
- def get_success(subpath, options = { })
27
- data = get(subpath, options)
28
- data.should match(/rails_spec_application/i) unless options[:no_layout]
29
- data
30
- end
31
-
32
- def expect_match(subpath, *args)
33
- options = args.extract_options!
34
- regexes = args
35
-
36
- data = get_success(subpath, options)
37
- regexes.each do |regex|
38
- data.should match(regex)
39
- end
40
-
41
- data
42
- end
43
-
44
- def expect_exception(subpath, class_name, message)
45
- data = get(subpath)
46
-
47
- json = begin
48
- JSON.parse(data)
49
- rescue => e
50
- raise %{Expected a JSON response from '#{subpath}' (because we expected an exception),
51
- but we couldn't parse it as JSON; when we tried, we got:
52
-
53
- (#{e.class.name}) #{e.message}
54
-
55
- The data is:
56
-
57
- #{data.inspect}}
58
- end
59
-
60
- json['exception'].should be
61
- json['exception']['class'].should == class_name.to_s
62
- json['exception']['message'].should match(message)
63
- end
64
-
65
- module ClassMethods
66
- def rails_template_name
67
- @rails_template_name || raise("No Rails template name!")
68
- end
69
-
70
- def uses_rails_with_template(template_name, options = { })
71
- before :all do
72
- @rails_template_name = template_name
73
-
74
- templates = [ 'base', template_name ].map { |t| "rails/templates/#{t}" }
75
-
76
- @rails_server = Spec::Helpers::RailsServer.new(template_name, templates, options)
77
- @rails_server.start!
78
- end
79
-
80
- after :all do
81
- @rails_server.stop!
82
- end
83
- end
84
- end
85
- end
@@ -1,390 +0,0 @@
1
- require 'fileutils'
2
- require 'find'
3
- require 'net/http'
4
- require 'uri'
5
-
6
- module Spec
7
- module Helpers
8
- class RailsServer
9
- class CommandFailedError < StandardError
10
- attr_reader :directory, :command, :result, :output
11
-
12
- def initialize(directory, command, result, output)
13
- @directory = directory
14
- @command = command
15
- @result = result
16
- @output = output
17
-
18
- super(%{Command failed: in directory '#{directory}', we tried to run:
19
- % #{command}
20
- but got result: #{result.inspect}
21
- and output:
22
- #{output}})
23
- end
24
- end
25
-
26
- class << self
27
- def run_bundle_install!(name)
28
- @bundle_installs_run ||= { }
29
-
30
- cmd = "bundle install"
31
- description = "running bundle install for #{name.inspect}"
32
-
33
- can_run_locally = @bundle_installs_run[name] || (ENV['FORTITUDE_SPECS_RAILS_GEMS_INSTALLED'] == 'true')
34
-
35
- if can_run_locally
36
- cmd << " --local"
37
- else
38
- description << " (WITHOUT --local flag)"
39
- say %{NOTE: We're running 'bundle install' without the --local flag, meaning it will
40
- go out and access rubygems.org for the lists of the latest gems. This is a slow operation.
41
- If you run multiple Rails specs at once, this will only happen once.
42
-
43
- However, this only actually needs to happen once, ever, for a given Rails version; if you set
44
- FORTITUDE_SPECS_RAILS_GEMS_INSTALLED=true (e.g.,
45
- FORTITUDE_SPECS_RAILS_GEMS_INSTALLED=true bundle exec rspec spec/rails/...),
46
- then we will skip this command and your spec will run much faster.}
47
- end
48
-
49
- # Sigh. Travis CI sometimes fails this with the following exception:
50
- #
51
- # Gem::RemoteFetcher::FetchError: Errno::ETIMEDOUT: Connection timed out - connect(2)
52
- #
53
- # So, we catch the command failure, look to see if this is the problem, and, if so, retry
54
- iterations = 0
55
- while true
56
- begin
57
- safe_system(cmd, description)
58
- break
59
- rescue CommandFailedError => cfe
60
- raise if (cfe.output !~ /Gem::RemoteFetcher::FetchError.*connect/i) || (iterations >= 5)
61
- say %{Got an exception trying to run 'bundle install'; sleeping and trying again (iteration #{iterations}):
62
-
63
- #{cfe.output}}
64
- # keep going
65
- end
66
-
67
- sleep 1
68
- iterations += 1
69
- end
70
-
71
- @bundle_installs_run[name] ||= true
72
- end
73
-
74
- def say(s, newline = true)
75
- if newline
76
- $stdout.puts s
77
- else
78
- $stdout << s
79
- end
80
- $stdout.flush
81
- end
82
-
83
- def safe_system(cmd, notice = nil, options = { })
84
- say("#{notice}...", false) if notice
85
-
86
- total_cmd = if options[:background]
87
- "#{cmd} 2>&1 &"
88
- else
89
- "#{cmd} 2>&1"
90
- end
91
-
92
- output = `#{total_cmd}`
93
- raise CommandFailedError.new(Dir.pwd, total_cmd, $?, output) unless $?.success?
94
- say "OK" if notice
95
-
96
- output
97
- end
98
- end
99
-
100
- attr_reader :rails_root
101
-
102
- def initialize(name, template_paths, options = { })
103
- @name = name || (raise ArgumentError, "Must specify a name")
104
- @rails_version = ENV['FORTITUDE_SPECS_RAILS_VERSION'] || options[:rails_version]
105
-
106
- @rails_root = File.expand_path(File.join(File.dirname(__FILE__), "../../tmp/spec/rails", rails_version.to_s, @name.to_s))
107
-
108
- @port = 20_000 + rand(10_000)
109
-
110
- @gem_root = File.expand_path(File.join(File.dirname(__FILE__), '../..'))
111
- @spec_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
112
- @template_paths = Array(template_paths).map { |t| File.expand_path(File.join(@spec_root, t)) }
113
-
114
- @options = options
115
- @server_pid = nil
116
- end
117
-
118
- def rails_version
119
- @rails_version || :default
120
- end
121
-
122
- def say(*args)
123
- self.class.say(*args)
124
- end
125
-
126
- def safe_system(*args)
127
- self.class.safe_system(*args)
128
- end
129
-
130
- def start!
131
- unless @server_pid
132
- do_start!
133
- end
134
- end
135
-
136
- def stop!
137
- if @server_pid
138
- stop_server!
139
- end
140
- end
141
-
142
- def get(path, options = { })
143
- get_response(path, options).body.strip
144
- end
145
-
146
- def uri_for(path)
147
- uri_string = "http://localhost:#{@port}/#{path}"
148
- URI.parse(uri_string)
149
- end
150
-
151
- def get_response(path, options = { })
152
- uri = uri_for(path)
153
- data = Net::HTTP.get_response(uri)
154
- unless data.code.to_s == '200' || options[:ignore_status_code]
155
- raise "'#{uri}' returned #{data.code.inspect}, not 200; body was: #{data.body.strip}"
156
- end
157
- data
158
- end
159
-
160
- private
161
- def rails_env
162
- (@options[:rails_env] || 'production').to_s
163
- end
164
-
165
- def do_start!
166
- Bundler.with_clean_env do
167
- with_rails_env do
168
- setup_directories!
169
-
170
- in_rails_root_parent do
171
- splat_bootstrap_gemfile!
172
- rails_new!
173
- update_gemfile!
174
- end
175
-
176
- in_rails_root do
177
- self.class.run_bundle_install!(:primary)
178
- splat_template_files!
179
- start_server!
180
- verify_server!
181
- end
182
- end
183
- end
184
- end
185
-
186
- def with_rails_env
187
- old_rails_env = ENV['RAILS_ENV']
188
- begin
189
- ENV['RAILS_ENV'] = rails_env
190
- yield
191
- ensure
192
- ENV['RAILS_ENV'] = old_rails_env
193
- end
194
- end
195
-
196
-
197
- def setup_directories!
198
- return if @directories_setup
199
-
200
- @template_paths.each do |template_path|
201
- raise Errno::ENOENT, "You must specify template paths that exist; this doesn't: '#{template_path}'" unless File.directory?(template_path)
202
- end
203
- FileUtils.rm_rf(@rails_root) if File.exist?(@rails_root)
204
- FileUtils.mkdir_p(@rails_root)
205
-
206
- @directories_setup = true
207
- end
208
-
209
- def in_rails_root(&block)
210
- Dir.chdir(@rails_root, &block)
211
- end
212
-
213
- def in_rails_root_parent(&block)
214
- Dir.chdir(File.dirname(@rails_root), &block)
215
- end
216
-
217
- def splat_bootstrap_gemfile!
218
- File.open("Gemfile", "w") do |f|
219
- rails_version_spec = if @rails_version then ", \"= #{@rails_version}\"" else "" end
220
- f << <<-EOS
221
- source 'https://rubygems.org'
222
-
223
- gem 'rails'#{rails_version_spec}
224
- EOS
225
- end
226
-
227
- self.class.run_bundle_install!(:bootstrap)
228
- end
229
-
230
- def rails_new!
231
- # This is a little trick to specify the exact version of Rails you want to create it with...
232
- # http://stackoverflow.com/questions/379141/specifying-rails-version-to-use-when-creating-a-new-application
233
- rails_version_spec = @rails_version ? "_#{@rails_version}_" : ""
234
- safe_system("bundle exec rails #{rails_version_spec} new #{File.basename(@rails_root)} -d sqlite3 -f -B", "creating a new Rails installation for '#{@name}'")
235
- end
236
-
237
- def update_gemfile!
238
- gemfile = File.join(@rails_root, 'Gemfile')
239
- gemfile_contents = File.read(gemfile)
240
- gemfile_contents << "\ngem 'fortitude', :path => '#{@gem_root}'\n"
241
-
242
- # Since Rails 3.0.20 was released, a new version of the I18n gem, 0.5.2, was released that moves a constant
243
- # into a different namespace. (See https://github.com/mislav/will_paginate/issues/347 for more details.)
244
- # So, if we're running Rails 3.0.x, we lock the 'i18n' gem to an earlier version.
245
- gemfile_contents << "\ngem 'i18n', '= 0.5.0'\n" if @rails_version && @rails_version =~ /^3\.0\./
246
-
247
- # Apparently execjs released a version 2.2.0 that will happily install on Ruby 1.8.7, but which contains some
248
- # new-style hash syntax. As a result, we pin the version backwards in this one specific case.
249
- gemfile_contents << "\ngem 'execjs', '~> 2.0.0'\n" if RUBY_VERSION =~ /^1\.8\./
250
-
251
- Array(@options[:additional_gemfile_lines] || [ ]).each do |gemfile_line|
252
- gemfile_contents << "\n#{gemfile_line}\n"
253
- end
254
-
255
- File.open(gemfile, 'w') { |f| f << gemfile_contents }
256
- end
257
-
258
- def with_env(new_env)
259
- old_env = { }
260
- new_env.keys.each { |k| old_env[k] = ENV[k] }
261
-
262
- begin
263
- set_env(new_env)
264
- yield
265
- ensure
266
- set_env(old_env)
267
- end
268
- end
269
-
270
- def set_env(new_env)
271
- new_env.each do |k,v|
272
- if v
273
- ENV[k] = v
274
- else
275
- ENV.delete(k)
276
- end
277
- end
278
- end
279
-
280
- def splat_template_files!
281
- @template_paths.each do |template_path|
282
- Find.find(template_path) do |file|
283
- next unless File.file?(file)
284
-
285
- if file[0..(template_path.length)] == "#{template_path}/"
286
- subpath = file[(template_path.length + 1)..-1]
287
- else
288
- raise "#{file} isn't under #{template_path}?!?"
289
- end
290
- dest_file = File.join(@rails_root, subpath)
291
-
292
- FileUtils.mkdir_p(File.dirname(dest_file))
293
- FileUtils.cp(file, dest_file)
294
- end
295
- end
296
- end
297
-
298
- def start_server!
299
- output = File.join(@rails_root, 'log', 'rails-server.out')
300
- cmd = "rails server -p #{@port} > '#{output}'"
301
- safe_system(cmd, "starting 'rails server' on port #{@port}", :background => true)
302
-
303
- server_pid_file = File.join(@rails_root, 'tmp', 'pids', 'server.pid')
304
-
305
- start_time = Time.now
306
- while Time.now < start_time + 15
307
- if File.exist?(server_pid_file)
308
- server_pid = File.read(server_pid_file).strip
309
- if server_pid =~ /^(\d{1,10})$/i
310
- @server_pid = Integer(server_pid)
311
- break
312
- end
313
- end
314
- sleep 0.1
315
- end
316
- end
317
-
318
- def verify_server!
319
- server_verify_url = "http://localhost:#{@port}/working/rails_is_working"
320
- uri = URI.parse(server_verify_url)
321
-
322
- data = nil
323
- start_time = Time.now
324
- while (! data)
325
- begin
326
- data = Net::HTTP.get_response(uri)
327
- rescue Errno::ECONNREFUSED, EOFError
328
- raise if Time.now > (start_time + 20)
329
- # keep waiting
330
- sleep 0.1
331
- end
332
- end
333
-
334
- unless data.code.to_s == '200'
335
- raise "'#{server_verify_url}' returned #{data.code.inspect}, not 200"
336
- end
337
- result = data.body.strip
338
-
339
- unless result =~ /^Rails\s+version\s*:\s*(\d+\.\d+\.\d+)$/
340
- raise "'#{server_verify_url}' returned: #{result.inspect}"
341
- end
342
- actual_version = $1
343
-
344
- if @rails_version && (actual_version != @rails_version)
345
- raise "We seem to have spawned the wrong version of Rails; wanted: #{@rails_version.inspect} but got: #{actual_version.inspect}"
346
- end
347
-
348
- say "Successfully spawned a server running Rails #{actual_version} on port #{@port}."
349
- end
350
-
351
- def is_alive?(pid)
352
- cmd = "ps -o pid #{pid}"
353
- results = `#{cmd}`
354
- results.split(/[\r\n]+/).each do |line|
355
- line = line.strip.downcase
356
- next if line == 'pid'
357
- if line =~ /^\d+$/i
358
- return true if Integer(line) == pid
359
- else
360
- raise "Unexpected output from '#{cmd}': #{results}"
361
- end
362
- end
363
-
364
- false
365
- end
366
-
367
- def stop_server!
368
- # We do this because under 1.8.7 SIGTERM doesn't seem to work, and it's actually fine to slaughter this
369
- # process mercilessly -- we don't need anything it has at this point, anyway.
370
- Process.kill("KILL", @server_pid)
371
-
372
- start_time = Time.now
373
-
374
- while true
375
- if is_alive?(@server_pid)
376
- raise "Unable to kill server at PID #{@server_pid}!" if (Time.now - start_time) > 20
377
- say "Waiting for server at PID #{@server_pid} to die."
378
- sleep 0.1
379
- else
380
- break
381
- end
382
- end
383
-
384
- say "Successfully terminated Rails server at PID #{@server_pid}."
385
-
386
- @server_pid = nil
387
- end
388
- end
389
- end
390
- end