worth_saving 0.0.9

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 (115) hide show
  1. checksums.yaml +15 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +90 -0
  4. data/Rakefile +29 -0
  5. data/app/assets/javascripts/worth_saving/application.js +15 -0
  6. data/app/assets/stylesheets/worth_saving/application.css +13 -0
  7. data/app/controllers/worth_saving/application_controller.rb +4 -0
  8. data/app/controllers/worth_saving/drafts_controller.rb +51 -0
  9. data/app/helpers/worth_saving/application_helper.rb +4 -0
  10. data/app/models/worth_saving/draft.rb +47 -0
  11. data/app/views/layouts/worth_saving/application.html.erb +14 -0
  12. data/config/routes.rb +3 -0
  13. data/db/migrate/20130911055236_create_worth_saving_drafts.rb +16 -0
  14. data/lib/tasks/worth_saving_tasks.rake +4 -0
  15. data/lib/worth_saving.rb +12 -0
  16. data/lib/worth_saving/action_view_ext.rb +11 -0
  17. data/lib/worth_saving/active_record_ext.rb +39 -0
  18. data/lib/worth_saving/engine.rb +15 -0
  19. data/lib/worth_saving/form.rb +15 -0
  20. data/lib/worth_saving/form/base.rb +21 -0
  21. data/lib/worth_saving/form/record.rb +53 -0
  22. data/lib/worth_saving/form/rendering.rb +100 -0
  23. data/lib/worth_saving/form_builder.rb +57 -0
  24. data/lib/worth_saving/info.rb +102 -0
  25. data/lib/worth_saving/version.rb +3 -0
  26. data/spec/app/controllers/drafts_controller_spec.rb +13 -0
  27. data/spec/app/models/worth_saving/draft_spec.rb +156 -0
  28. data/spec/dummy/README.rdoc +261 -0
  29. data/spec/dummy/Rakefile +7 -0
  30. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  31. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  32. data/spec/dummy/app/controllers/application_controller.rb +24 -0
  33. data/spec/dummy/app/controllers/login_controller.rb +11 -0
  34. data/spec/dummy/app/controllers/pages_controller.rb +48 -0
  35. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  36. data/spec/dummy/app/models/page.rb +12 -0
  37. data/spec/dummy/app/models/subpage.rb +7 -0
  38. data/spec/dummy/app/models/user.rb +4 -0
  39. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  40. data/spec/dummy/app/views/pages/form.html.slim +53 -0
  41. data/spec/dummy/config.ru +4 -0
  42. data/spec/dummy/config/application.rb +66 -0
  43. data/spec/dummy/config/boot.rb +10 -0
  44. data/spec/dummy/config/database.yml +25 -0
  45. data/spec/dummy/config/environment.rb +5 -0
  46. data/spec/dummy/config/environments/development.rb +37 -0
  47. data/spec/dummy/config/environments/production.rb +67 -0
  48. data/spec/dummy/config/environments/test.rb +37 -0
  49. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  50. data/spec/dummy/config/initializers/inflections.rb +15 -0
  51. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  52. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  53. data/spec/dummy/config/initializers/session_store.rb +8 -0
  54. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  55. data/spec/dummy/config/locales/en.yml +5 -0
  56. data/spec/dummy/config/routes.rb +8 -0
  57. data/spec/dummy/db/development.sqlite3 +0 -0
  58. data/spec/dummy/db/migrate/20130911060226_create_worth_saving_drafts.worth_saving.rb +17 -0
  59. data/spec/dummy/db/migrate/20130912071319_create_users.rb +9 -0
  60. data/spec/dummy/db/migrate/20130912071446_create_pages.rb +9 -0
  61. data/spec/dummy/db/migrate/20130912145831_create_subpages.rb +10 -0
  62. data/spec/dummy/db/migrate/20130913060709_add_columns_to_subpages.rb +5 -0
  63. data/spec/dummy/db/migrate/20130913060847_add_columns_to_pages.rb +7 -0
  64. data/spec/dummy/db/schema.rb +52 -0
  65. data/spec/dummy/db/test.sqlite3 +0 -0
  66. data/spec/dummy/log/development.log +17536 -0
  67. data/spec/dummy/log/test.log +76256 -0
  68. data/spec/dummy/public/404.html +26 -0
  69. data/spec/dummy/public/422.html +26 -0
  70. data/spec/dummy/public/500.html +25 -0
  71. data/spec/dummy/public/favicon.ico +0 -0
  72. data/spec/dummy/script/rails +6 -0
  73. data/spec/dummy/tmp/cache/assets/CA6/7A0/sprockets%2Ff6723fb0918cb134f62480f155a0b364 +0 -0
  74. data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  75. data/spec/dummy/tmp/cache/assets/CF8/AF0/sprockets%2F228f63c526665cc53d670799eece3b98 +0 -0
  76. data/spec/dummy/tmp/cache/assets/D09/190/sprockets%2F993fae97313ed7d42322c85e60b02bb1 +0 -0
  77. data/spec/dummy/tmp/cache/assets/D1C/CE0/sprockets%2F9a5f4484900982bd33f792ca06e7f5ea +0 -0
  78. data/spec/dummy/tmp/cache/assets/D31/620/sprockets%2F01f101ae68348ed1bb4e46d7f452a73a +0 -0
  79. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  80. data/spec/dummy/tmp/cache/assets/D3C/300/sprockets%2Ffb893496ed88af814fa985858f60ee66 +0 -0
  81. data/spec/dummy/tmp/cache/assets/D43/EB0/sprockets%2F43d74a38cb4f14de5087ea7f871ac166 +0 -0
  82. data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  83. data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  84. data/spec/dummy/tmp/cache/assets/D97/C50/sprockets%2F74b5c193fc06fb3cb3c4ac12ac7589a7 +0 -0
  85. data/spec/dummy/tmp/cache/assets/D9E/470/sprockets%2F36bde6f05aa955c51ab2cd97b59e742a +0 -0
  86. data/spec/dummy/tmp/cache/assets/DCF/000/sprockets%2Fcfbeb9f4e8b3b7d1ac752d93c64017d3 +0 -0
  87. data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  88. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  89. data/spec/dummy/tmp/cache/assets/test/sprockets/01f101ae68348ed1bb4e46d7f452a73a +0 -0
  90. data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  91. data/spec/dummy/tmp/cache/assets/test/sprockets/228f63c526665cc53d670799eece3b98 +0 -0
  92. data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  93. data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  94. data/spec/dummy/tmp/cache/assets/test/sprockets/36bde6f05aa955c51ab2cd97b59e742a +0 -0
  95. data/spec/dummy/tmp/cache/assets/test/sprockets/43d74a38cb4f14de5087ea7f871ac166 +0 -0
  96. data/spec/dummy/tmp/cache/assets/test/sprockets/74b5c193fc06fb3cb3c4ac12ac7589a7 +0 -0
  97. data/spec/dummy/tmp/cache/assets/test/sprockets/993fae97313ed7d42322c85e60b02bb1 +0 -0
  98. data/spec/dummy/tmp/cache/assets/test/sprockets/9a5f4484900982bd33f792ca06e7f5ea +0 -0
  99. data/spec/dummy/tmp/cache/assets/test/sprockets/cfbeb9f4e8b3b7d1ac752d93c64017d3 +0 -0
  100. data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  101. data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  102. data/spec/dummy/tmp/cache/assets/test/sprockets/f6723fb0918cb134f62480f155a0b364 +0 -0
  103. data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  104. data/spec/dummy/tmp/cache/assets/test/sprockets/fb893496ed88af814fa985858f60ee66 +0 -0
  105. data/spec/factories.rb +28 -0
  106. data/spec/features/worth_saving_features_spec.rb +60 -0
  107. data/spec/lib/active_record_ext_spec.rb +291 -0
  108. data/spec/lib/info_spec.rb +29 -0
  109. data/spec/spec_helper.rb +37 -0
  110. data/spec/support/features.rb +8 -0
  111. data/spec/support/features/helpers.rb +96 -0
  112. data/vendor/assets/javascripts/worth_saving.js +10 -0
  113. data/vendor/assets/javascripts/worth_saving/form.js +64 -0
  114. data/vendor/assets/stylesheets/worth_saving.css +18 -0
  115. metadata +424 -0
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe WorthSaving::Info do
4
+ describe '.attribute_whitelisting_required?' do
5
+ subject { WorthSaving::Info.attribute_whitelisting_required? }
6
+
7
+ context 'when using Rails3' do
8
+ before { Rails.should_receive(:version).and_return '3.x.x' }
9
+ it { should eq true }
10
+ end
11
+
12
+ context 'when using Rails4 and including ProtectedAttribute gem' do
13
+ before do
14
+ stub_const 'ProtectedAttributes', Class
15
+ Rails.should_receive(:version).and_return '4.x.x'
16
+ end
17
+
18
+ it { should eq true }
19
+ end
20
+
21
+ context 'when using Rails4 and not including ProtectedAttribute gem' do
22
+ before do
23
+ Rails.should_receive(:version).and_return '4.x.x'
24
+ end
25
+
26
+ it { should eq false }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ require 'pry'
2
+ require 'with_model'
3
+
4
+ ENV['RAILS_ENV'] ||= 'test'
5
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
6
+ require 'rspec/rails'
7
+ require 'rspec/autorun'
8
+ require 'factory_girl_rails'
9
+ require 'support/features'
10
+ require 'database_cleaner'
11
+ require 'coveralls'
12
+ Coveralls.wear!
13
+
14
+ Rails.backtrace_cleaner.remove_silencers!
15
+
16
+ # Load support files
17
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
18
+
19
+ RSpec.configure do |config|
20
+ config.before(:suite) do
21
+ DatabaseCleaner.strategy = :truncation
22
+ end
23
+
24
+ config.after(:each) do
25
+ DatabaseCleaner.clean
26
+ end
27
+
28
+ config.mock_with :rspec
29
+
30
+ config.use_transactional_fixtures = false
31
+
32
+ config.infer_base_class_for_anonymous_controllers = false
33
+
34
+ config.order = "random"
35
+
36
+ config.extend WithModel
37
+ end
@@ -0,0 +1,8 @@
1
+ require 'support/features/helpers'
2
+
3
+ module Features
4
+ end
5
+
6
+ RSpec.configure do |config|
7
+ config.include Features::Helpers, type: :feature
8
+ end
@@ -0,0 +1,96 @@
1
+ module Features
2
+ module Helpers
3
+ class FormInput < Struct.new(:label, :dom_id, :value); end
4
+
5
+ def create_reasonable_browswer_size
6
+ page.driver.browser.manage.window.resize_to(1000, 800)
7
+ end
8
+
9
+ def login(user)
10
+ visit login_path(user)
11
+ create_reasonable_browswer_size
12
+ end
13
+
14
+ def logout
15
+ visit logout_path
16
+ create_reasonable_browswer_size
17
+ end
18
+
19
+ def given_user(*names)
20
+ names.map do |name|
21
+ FactoryGirl.create :user, name: name
22
+ end
23
+ end
24
+
25
+ def fill_in_form(opts = {})
26
+ form_factory(opts).each do |input|
27
+ case input.label
28
+ when 'Approved'
29
+ input.value ? check('Approved') : uncheck('Approved')
30
+ when 'Page type'
31
+ choose input.value
32
+ when 'Position'
33
+ select input.value
34
+ else
35
+ fill_in input.label, with: input.value
36
+ end
37
+ end
38
+ end
39
+
40
+ def verify_form(opts = {}, recovered = false)
41
+ recovered = recovered ? 'recovered_' : ''
42
+ form_factory(opts).each do |input|
43
+ case input.label
44
+ when 'Approved'
45
+ input.value ?
46
+ expect(page.find("##{recovered}page_approved")).to(be_checked) :
47
+ expect(page.find("##{recovered}page_approved")).not_to(be_checked)
48
+ when 'Page type'
49
+ if input.value == 'Front'
50
+ expect(page.find("##{recovered}page_page_type_front")).to(be_checked)
51
+ expect(page.find("##{recovered}page_page_type_inner")).not_to(be_checked)
52
+ else
53
+ expect(page.find("##{recovered}page_page_type_front")).not_to(be_checked)
54
+ expect(page.find("##{recovered}page_page_type_inner")).to(be_checked)
55
+ end
56
+ when 'Position'
57
+ expect(page.find("##{recovered}page_position").value).to eq input.value
58
+ else
59
+ expect(page.find("##{recovered}#{input.dom_id}").value).to eq input.value
60
+ end
61
+ end
62
+ end
63
+
64
+ def verify_blank_form(recovered = false)
65
+ recovered = recovered ? 'recovered_' : ''
66
+ expect(page.find("##{recovered}page_title").value).to eq ''
67
+ expect(page.find("##{recovered}page_content").value).to eq ''
68
+ expect(page.find("##{recovered}page_subpages_attributes_0_subtitle").value).to eq ''
69
+ expect(page.find("##{recovered}page_subpages_attributes_0_content").value).to eq ''
70
+ expect(page.find("##{recovered}page_position").value).to eq ''
71
+ expect(page.find("##{recovered}page_approved")).not_to be_checked
72
+ expect(page.find("##{recovered}page_page_type_front")).not_to be_checked
73
+ expect(page.find("##{recovered}page_page_type_inner")).not_to be_checked
74
+ end
75
+
76
+ def chill_out_long_enough_to_draft
77
+ sleep(find('form')['data-worth-saving-interval'].to_i + 0.5)
78
+ end
79
+
80
+ private
81
+
82
+ def form_factory(opts)
83
+ [
84
+ FormInput.new('Title', 'page_title', opts['Title'] || 'My Big Fat Title'),
85
+ FormInput.new('Content', 'page_content', opts['Content'] || 'Some page content to save...'),
86
+ FormInput.new('Subtitle', 'page_subpages_attributes_0_subtitle',
87
+ opts['Subtitle'] || 'My Not-so-big Subtitle'),
88
+ FormInput.new('Subpage content', 'page_subpages_attributes_0_content',
89
+ opts['Subpage content'] || 'Some subpage content here...'),
90
+ FormInput.new('Approved', 'page_approved', opts['Approved'] || true),
91
+ FormInput.new('Page type', 'page_page_type', opts['Page type'] || 'Front'),
92
+ FormInput.new('Position', 'page_position', opts['Position'] || 'Left')
93
+ ]
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,10 @@
1
+ //= require_self
2
+ //= require_tree .
3
+
4
+ WorthSaving = {};
5
+
6
+ $(document).ready(function() {
7
+ $('form[data-worth-saving-form-id]').each(function() {
8
+ new WorthSaving.Form($(this));
9
+ });
10
+ });
@@ -0,0 +1,64 @@
1
+ WorthSaving.Form = function($mainForm) {
2
+ var formId = $mainForm.data().worthSavingFormId;
3
+ var $draftForm = $('form[data-worth-saving-draft-form-id="' + formId + '"]')
4
+ var countdown = false;
5
+ var interval = parseInt($mainForm.data().worthSavingInterval) * 1000;
6
+ var $formDataField = $draftForm.find('input[name="draft[form_data]"]');
7
+ var $worthSavingFields = $mainForm.find('[data-worth-saving]');
8
+ var $messageDiv = $('#worth-saving-form-message-' + formId);
9
+
10
+ var startCountdown = function() {
11
+ countdown = true;
12
+ setTimeout(submitDraftForm, interval);
13
+ };
14
+
15
+ var resetCountdown = function(){
16
+ countdown = false;
17
+ };
18
+
19
+ var prepareDraftForm = function() {
20
+ $formDataField.val($worthSavingFields.serialize());
21
+ };
22
+
23
+ var submitDraftForm = function() {
24
+ prepareDraftForm();
25
+ resetCountdown();
26
+ $.ajax({
27
+ url: $draftForm.attr('action'),
28
+ method: "post",
29
+ data: $draftForm.serialize(),
30
+ accepts: "json",
31
+ success: processSuccessfulResponse,
32
+ error: processError
33
+ });
34
+ };
35
+
36
+ var processSuccessfulResponse = function(info) {
37
+ setDraftFormAction(info.worthSavingDraft.action);
38
+ displayMessage(info.message, info.error !== undefined);
39
+ };
40
+
41
+ var processError = function(info) {
42
+ displayMessage(info.responseText || 'Unable to save draft', true);
43
+ };
44
+
45
+ var setDraftFormAction = function(action) {
46
+ $draftForm.attr('action', action);
47
+ $draftForm.find('input[name="_method"]').remove();
48
+ $draftForm.append('<input type="hidden" name="_method" value="put" />');
49
+ }
50
+
51
+ var displayMessage = function(msg, isError) {
52
+ $messageDiv.fadeIn(500).removeClass('error').html(msg);
53
+ if(isError) {
54
+ $messageDiv.addClass('error');
55
+ } else {
56
+ $messageDiv.fadeOut(2000);
57
+ }
58
+ };
59
+
60
+ $worthSavingFields.on('keyup change', function() {
61
+ countdown || startCountdown();
62
+ });
63
+ };
64
+
@@ -0,0 +1,18 @@
1
+ /*
2
+ *= require_self
3
+ */
4
+
5
+ .worth-saving-recovery-form-container .worth-saving-form-container {
6
+ margin: 0;
7
+ padding: 0;
8
+ width: 50%;
9
+ float: left;
10
+ }
11
+
12
+ .worth-saving-form-message {
13
+ color: green;
14
+ }
15
+
16
+ .worth-saving-form-message.error {
17
+ color: red;
18
+ }
metadata ADDED
@@ -0,0 +1,424 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: worth_saving
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.9
5
+ platform: ruby
6
+ authors:
7
+ - John Lawrence
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: jquery-rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: capybara
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: factory_girl_rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: database_cleaner
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 1.0.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 1.0.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: slim
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: with_model
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: 0.3.2
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ version: 0.3.2
153
+ - !ruby/object:Gem::Dependency
154
+ name: jasmine
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: jasmine-jquery-rails
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: '1.5'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ~>
179
+ - !ruby/object:Gem::Version
180
+ version: '1.5'
181
+ - !ruby/object:Gem::Dependency
182
+ name: coveralls
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ! '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ! '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ description: Helps users of your app recover work by auto-saving drafts
196
+ email:
197
+ - johnonrails@gmail.com
198
+ executables: []
199
+ extensions: []
200
+ extra_rdoc_files: []
201
+ files:
202
+ - app/assets/javascripts/worth_saving/application.js
203
+ - app/assets/stylesheets/worth_saving/application.css
204
+ - app/controllers/worth_saving/application_controller.rb
205
+ - app/controllers/worth_saving/drafts_controller.rb
206
+ - app/helpers/worth_saving/application_helper.rb
207
+ - app/models/worth_saving/draft.rb
208
+ - app/views/layouts/worth_saving/application.html.erb
209
+ - config/routes.rb
210
+ - db/migrate/20130911055236_create_worth_saving_drafts.rb
211
+ - lib/tasks/worth_saving_tasks.rake
212
+ - lib/worth_saving/action_view_ext.rb
213
+ - lib/worth_saving/active_record_ext.rb
214
+ - lib/worth_saving/engine.rb
215
+ - lib/worth_saving/form/base.rb
216
+ - lib/worth_saving/form/record.rb
217
+ - lib/worth_saving/form/rendering.rb
218
+ - lib/worth_saving/form.rb
219
+ - lib/worth_saving/form_builder.rb
220
+ - lib/worth_saving/info.rb
221
+ - lib/worth_saving/version.rb
222
+ - lib/worth_saving.rb
223
+ - vendor/assets/javascripts/worth_saving/form.js
224
+ - vendor/assets/javascripts/worth_saving.js
225
+ - vendor/assets/stylesheets/worth_saving.css
226
+ - MIT-LICENSE
227
+ - Rakefile
228
+ - README.md
229
+ - spec/app/controllers/drafts_controller_spec.rb
230
+ - spec/app/models/worth_saving/draft_spec.rb
231
+ - spec/dummy/app/assets/javascripts/application.js
232
+ - spec/dummy/app/assets/stylesheets/application.css
233
+ - spec/dummy/app/controllers/application_controller.rb
234
+ - spec/dummy/app/controllers/login_controller.rb
235
+ - spec/dummy/app/controllers/pages_controller.rb
236
+ - spec/dummy/app/helpers/application_helper.rb
237
+ - spec/dummy/app/models/page.rb
238
+ - spec/dummy/app/models/subpage.rb
239
+ - spec/dummy/app/models/user.rb
240
+ - spec/dummy/app/views/layouts/application.html.erb
241
+ - spec/dummy/app/views/pages/form.html.slim
242
+ - spec/dummy/config/application.rb
243
+ - spec/dummy/config/boot.rb
244
+ - spec/dummy/config/database.yml
245
+ - spec/dummy/config/environment.rb
246
+ - spec/dummy/config/environments/development.rb
247
+ - spec/dummy/config/environments/production.rb
248
+ - spec/dummy/config/environments/test.rb
249
+ - spec/dummy/config/initializers/backtrace_silencers.rb
250
+ - spec/dummy/config/initializers/inflections.rb
251
+ - spec/dummy/config/initializers/mime_types.rb
252
+ - spec/dummy/config/initializers/secret_token.rb
253
+ - spec/dummy/config/initializers/session_store.rb
254
+ - spec/dummy/config/initializers/wrap_parameters.rb
255
+ - spec/dummy/config/locales/en.yml
256
+ - spec/dummy/config/routes.rb
257
+ - spec/dummy/config.ru
258
+ - spec/dummy/db/development.sqlite3
259
+ - spec/dummy/db/migrate/20130911060226_create_worth_saving_drafts.worth_saving.rb
260
+ - spec/dummy/db/migrate/20130912071319_create_users.rb
261
+ - spec/dummy/db/migrate/20130912071446_create_pages.rb
262
+ - spec/dummy/db/migrate/20130912145831_create_subpages.rb
263
+ - spec/dummy/db/migrate/20130913060709_add_columns_to_subpages.rb
264
+ - spec/dummy/db/migrate/20130913060847_add_columns_to_pages.rb
265
+ - spec/dummy/db/schema.rb
266
+ - spec/dummy/db/test.sqlite3
267
+ - spec/dummy/log/development.log
268
+ - spec/dummy/log/test.log
269
+ - spec/dummy/public/404.html
270
+ - spec/dummy/public/422.html
271
+ - spec/dummy/public/500.html
272
+ - spec/dummy/public/favicon.ico
273
+ - spec/dummy/Rakefile
274
+ - spec/dummy/README.rdoc
275
+ - spec/dummy/script/rails
276
+ - spec/dummy/tmp/cache/assets/CA6/7A0/sprockets%2Ff6723fb0918cb134f62480f155a0b364
277
+ - spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953
278
+ - spec/dummy/tmp/cache/assets/CF8/AF0/sprockets%2F228f63c526665cc53d670799eece3b98
279
+ - spec/dummy/tmp/cache/assets/D09/190/sprockets%2F993fae97313ed7d42322c85e60b02bb1
280
+ - spec/dummy/tmp/cache/assets/D1C/CE0/sprockets%2F9a5f4484900982bd33f792ca06e7f5ea
281
+ - spec/dummy/tmp/cache/assets/D31/620/sprockets%2F01f101ae68348ed1bb4e46d7f452a73a
282
+ - spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705
283
+ - spec/dummy/tmp/cache/assets/D3C/300/sprockets%2Ffb893496ed88af814fa985858f60ee66
284
+ - spec/dummy/tmp/cache/assets/D43/EB0/sprockets%2F43d74a38cb4f14de5087ea7f871ac166
285
+ - spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655
286
+ - spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6
287
+ - spec/dummy/tmp/cache/assets/D97/C50/sprockets%2F74b5c193fc06fb3cb3c4ac12ac7589a7
288
+ - spec/dummy/tmp/cache/assets/D9E/470/sprockets%2F36bde6f05aa955c51ab2cd97b59e742a
289
+ - spec/dummy/tmp/cache/assets/DCF/000/sprockets%2Fcfbeb9f4e8b3b7d1ac752d93c64017d3
290
+ - spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994
291
+ - spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af
292
+ - spec/dummy/tmp/cache/assets/test/sprockets/01f101ae68348ed1bb4e46d7f452a73a
293
+ - spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705
294
+ - spec/dummy/tmp/cache/assets/test/sprockets/228f63c526665cc53d670799eece3b98
295
+ - spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af
296
+ - spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953
297
+ - spec/dummy/tmp/cache/assets/test/sprockets/36bde6f05aa955c51ab2cd97b59e742a
298
+ - spec/dummy/tmp/cache/assets/test/sprockets/43d74a38cb4f14de5087ea7f871ac166
299
+ - spec/dummy/tmp/cache/assets/test/sprockets/74b5c193fc06fb3cb3c4ac12ac7589a7
300
+ - spec/dummy/tmp/cache/assets/test/sprockets/993fae97313ed7d42322c85e60b02bb1
301
+ - spec/dummy/tmp/cache/assets/test/sprockets/9a5f4484900982bd33f792ca06e7f5ea
302
+ - spec/dummy/tmp/cache/assets/test/sprockets/cfbeb9f4e8b3b7d1ac752d93c64017d3
303
+ - spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994
304
+ - spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6
305
+ - spec/dummy/tmp/cache/assets/test/sprockets/f6723fb0918cb134f62480f155a0b364
306
+ - spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655
307
+ - spec/dummy/tmp/cache/assets/test/sprockets/fb893496ed88af814fa985858f60ee66
308
+ - spec/factories.rb
309
+ - spec/features/worth_saving_features_spec.rb
310
+ - spec/lib/active_record_ext_spec.rb
311
+ - spec/lib/info_spec.rb
312
+ - spec/spec_helper.rb
313
+ - spec/support/features/helpers.rb
314
+ - spec/support/features.rb
315
+ homepage: https://github.com/johnnylaw/worth_saving
316
+ licenses: []
317
+ metadata: {}
318
+ post_install_message:
319
+ rdoc_options: []
320
+ require_paths:
321
+ - lib
322
+ required_ruby_version: !ruby/object:Gem::Requirement
323
+ requirements:
324
+ - - ! '>='
325
+ - !ruby/object:Gem::Version
326
+ version: '0'
327
+ required_rubygems_version: !ruby/object:Gem::Requirement
328
+ requirements:
329
+ - - ! '>='
330
+ - !ruby/object:Gem::Version
331
+ version: '0'
332
+ requirements: []
333
+ rubyforge_project:
334
+ rubygems_version: 2.1.4
335
+ signing_key:
336
+ specification_version: 4
337
+ summary: Helps users of your app recover work by auto-saving drafts
338
+ test_files:
339
+ - spec/app/controllers/drafts_controller_spec.rb
340
+ - spec/app/models/worth_saving/draft_spec.rb
341
+ - spec/dummy/app/assets/javascripts/application.js
342
+ - spec/dummy/app/assets/stylesheets/application.css
343
+ - spec/dummy/app/controllers/application_controller.rb
344
+ - spec/dummy/app/controllers/login_controller.rb
345
+ - spec/dummy/app/controllers/pages_controller.rb
346
+ - spec/dummy/app/helpers/application_helper.rb
347
+ - spec/dummy/app/models/page.rb
348
+ - spec/dummy/app/models/subpage.rb
349
+ - spec/dummy/app/models/user.rb
350
+ - spec/dummy/app/views/layouts/application.html.erb
351
+ - spec/dummy/app/views/pages/form.html.slim
352
+ - spec/dummy/config/application.rb
353
+ - spec/dummy/config/boot.rb
354
+ - spec/dummy/config/database.yml
355
+ - spec/dummy/config/environment.rb
356
+ - spec/dummy/config/environments/development.rb
357
+ - spec/dummy/config/environments/production.rb
358
+ - spec/dummy/config/environments/test.rb
359
+ - spec/dummy/config/initializers/backtrace_silencers.rb
360
+ - spec/dummy/config/initializers/inflections.rb
361
+ - spec/dummy/config/initializers/mime_types.rb
362
+ - spec/dummy/config/initializers/secret_token.rb
363
+ - spec/dummy/config/initializers/session_store.rb
364
+ - spec/dummy/config/initializers/wrap_parameters.rb
365
+ - spec/dummy/config/locales/en.yml
366
+ - spec/dummy/config/routes.rb
367
+ - spec/dummy/config.ru
368
+ - spec/dummy/db/development.sqlite3
369
+ - spec/dummy/db/migrate/20130911060226_create_worth_saving_drafts.worth_saving.rb
370
+ - spec/dummy/db/migrate/20130912071319_create_users.rb
371
+ - spec/dummy/db/migrate/20130912071446_create_pages.rb
372
+ - spec/dummy/db/migrate/20130912145831_create_subpages.rb
373
+ - spec/dummy/db/migrate/20130913060709_add_columns_to_subpages.rb
374
+ - spec/dummy/db/migrate/20130913060847_add_columns_to_pages.rb
375
+ - spec/dummy/db/schema.rb
376
+ - spec/dummy/db/test.sqlite3
377
+ - spec/dummy/log/development.log
378
+ - spec/dummy/log/test.log
379
+ - spec/dummy/public/404.html
380
+ - spec/dummy/public/422.html
381
+ - spec/dummy/public/500.html
382
+ - spec/dummy/public/favicon.ico
383
+ - spec/dummy/Rakefile
384
+ - spec/dummy/README.rdoc
385
+ - spec/dummy/script/rails
386
+ - spec/dummy/tmp/cache/assets/CA6/7A0/sprockets%2Ff6723fb0918cb134f62480f155a0b364
387
+ - spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953
388
+ - spec/dummy/tmp/cache/assets/CF8/AF0/sprockets%2F228f63c526665cc53d670799eece3b98
389
+ - spec/dummy/tmp/cache/assets/D09/190/sprockets%2F993fae97313ed7d42322c85e60b02bb1
390
+ - spec/dummy/tmp/cache/assets/D1C/CE0/sprockets%2F9a5f4484900982bd33f792ca06e7f5ea
391
+ - spec/dummy/tmp/cache/assets/D31/620/sprockets%2F01f101ae68348ed1bb4e46d7f452a73a
392
+ - spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705
393
+ - spec/dummy/tmp/cache/assets/D3C/300/sprockets%2Ffb893496ed88af814fa985858f60ee66
394
+ - spec/dummy/tmp/cache/assets/D43/EB0/sprockets%2F43d74a38cb4f14de5087ea7f871ac166
395
+ - spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655
396
+ - spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6
397
+ - spec/dummy/tmp/cache/assets/D97/C50/sprockets%2F74b5c193fc06fb3cb3c4ac12ac7589a7
398
+ - spec/dummy/tmp/cache/assets/D9E/470/sprockets%2F36bde6f05aa955c51ab2cd97b59e742a
399
+ - spec/dummy/tmp/cache/assets/DCF/000/sprockets%2Fcfbeb9f4e8b3b7d1ac752d93c64017d3
400
+ - spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994
401
+ - spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af
402
+ - spec/dummy/tmp/cache/assets/test/sprockets/01f101ae68348ed1bb4e46d7f452a73a
403
+ - spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705
404
+ - spec/dummy/tmp/cache/assets/test/sprockets/228f63c526665cc53d670799eece3b98
405
+ - spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af
406
+ - spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953
407
+ - spec/dummy/tmp/cache/assets/test/sprockets/36bde6f05aa955c51ab2cd97b59e742a
408
+ - spec/dummy/tmp/cache/assets/test/sprockets/43d74a38cb4f14de5087ea7f871ac166
409
+ - spec/dummy/tmp/cache/assets/test/sprockets/74b5c193fc06fb3cb3c4ac12ac7589a7
410
+ - spec/dummy/tmp/cache/assets/test/sprockets/993fae97313ed7d42322c85e60b02bb1
411
+ - spec/dummy/tmp/cache/assets/test/sprockets/9a5f4484900982bd33f792ca06e7f5ea
412
+ - spec/dummy/tmp/cache/assets/test/sprockets/cfbeb9f4e8b3b7d1ac752d93c64017d3
413
+ - spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994
414
+ - spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6
415
+ - spec/dummy/tmp/cache/assets/test/sprockets/f6723fb0918cb134f62480f155a0b364
416
+ - spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655
417
+ - spec/dummy/tmp/cache/assets/test/sprockets/fb893496ed88af814fa985858f60ee66
418
+ - spec/factories.rb
419
+ - spec/features/worth_saving_features_spec.rb
420
+ - spec/lib/active_record_ext_spec.rb
421
+ - spec/lib/info_spec.rb
422
+ - spec/spec_helper.rb
423
+ - spec/support/features/helpers.rb
424
+ - spec/support/features.rb