offroad 0.0.1

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 (62) hide show
  1. data/LICENSE +674 -0
  2. data/README.rdoc +29 -0
  3. data/Rakefile +75 -0
  4. data/TODO +42 -0
  5. data/lib/app/models/offroad/group_state.rb +85 -0
  6. data/lib/app/models/offroad/mirror_info.rb +53 -0
  7. data/lib/app/models/offroad/model_state.rb +36 -0
  8. data/lib/app/models/offroad/received_record_state.rb +109 -0
  9. data/lib/app/models/offroad/sendable_record_state.rb +91 -0
  10. data/lib/app/models/offroad/system_state.rb +33 -0
  11. data/lib/cargo_streamer.rb +222 -0
  12. data/lib/controller_extensions.rb +74 -0
  13. data/lib/exceptions.rb +16 -0
  14. data/lib/migrate/20100512164608_create_offroad_tables.rb +72 -0
  15. data/lib/mirror_data.rb +354 -0
  16. data/lib/model_extensions.rb +377 -0
  17. data/lib/module_funcs.rb +94 -0
  18. data/lib/offroad.rb +30 -0
  19. data/lib/version.rb +3 -0
  20. data/lib/view_helper.rb +7 -0
  21. data/templates/offline.rb +36 -0
  22. data/templates/offline_database.yml +7 -0
  23. data/templates/offroad.yml +6 -0
  24. data/test/app_root/app/controllers/application_controller.rb +2 -0
  25. data/test/app_root/app/controllers/group_controller.rb +28 -0
  26. data/test/app_root/app/models/global_record.rb +10 -0
  27. data/test/app_root/app/models/group.rb +12 -0
  28. data/test/app_root/app/models/group_owned_record.rb +68 -0
  29. data/test/app_root/app/models/guest.rb +7 -0
  30. data/test/app_root/app/models/subrecord.rb +12 -0
  31. data/test/app_root/app/models/unmirrored_record.rb +4 -0
  32. data/test/app_root/app/views/group/download_down_mirror.html.erb +4 -0
  33. data/test/app_root/app/views/group/download_initial_down_mirror.html.erb +4 -0
  34. data/test/app_root/app/views/group/download_up_mirror.html.erb +6 -0
  35. data/test/app_root/app/views/group/upload_down_mirror.html.erb +1 -0
  36. data/test/app_root/app/views/group/upload_up_mirror.html.erb +1 -0
  37. data/test/app_root/app/views/layouts/mirror.html.erb +9 -0
  38. data/test/app_root/config/boot.rb +115 -0
  39. data/test/app_root/config/database.yml +6 -0
  40. data/test/app_root/config/environment.rb +15 -0
  41. data/test/app_root/config/environments/test.rb +17 -0
  42. data/test/app_root/config/offroad.yml +6 -0
  43. data/test/app_root/config/routes.rb +4 -0
  44. data/test/app_root/db/migrate/20100529235049_create_tables.rb +64 -0
  45. data/test/app_root/lib/common_hobo.rb +15 -0
  46. data/test/app_root/vendor/plugins/offroad/init.rb +2 -0
  47. data/test/functional/mirror_operations_test.rb +148 -0
  48. data/test/test_helper.rb +405 -0
  49. data/test/unit/app_state_tracking_test.rb +275 -0
  50. data/test/unit/cargo_streamer_test.rb +332 -0
  51. data/test/unit/global_data_test.rb +102 -0
  52. data/test/unit/group_controller_test.rb +152 -0
  53. data/test/unit/group_data_test.rb +435 -0
  54. data/test/unit/group_single_test.rb +136 -0
  55. data/test/unit/hobo_permissions_test.rb +57 -0
  56. data/test/unit/mirror_data_test.rb +1271 -0
  57. data/test/unit/mirror_info_test.rb +31 -0
  58. data/test/unit/module_funcs_test.rb +37 -0
  59. data/test/unit/pathological_model_test.rb +62 -0
  60. data/test/unit/test_framework_test.rb +86 -0
  61. data/test/unit/unmirrored_data_test.rb +14 -0
  62. metadata +140 -0
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+
3
+ class MirrorInfoTest < Test::Unit::TestCase
4
+ agnostic_test "can instantiate MirrorInfo instances, but they're invalid by default" do
5
+ rec = nil
6
+ assert_nothing_raised do
7
+ rec = Offroad::MirrorInfo.new
8
+ end
9
+ assert_equal false, rec.valid?
10
+ end
11
+
12
+ double_test "can use new_from_group to create a MirrorInfo instance for a particular group" do
13
+ rec = Offroad::MirrorInfo::new_from_group(@editable_group)
14
+ assert rec.valid?
15
+ assert Time.now - rec.created_at < 30
16
+ assert_equal Offroad::online_url, rec.online_site
17
+ assert_equal Offroad::app_name, rec.app
18
+ assert rec.app_mode.downcase.include?( Offroad::app_online? ? "online" : "offline" )
19
+ assert_equal Offroad::app_version, rec.app_version
20
+ assert_equal RUBY_PLATFORM, rec.operating_system
21
+ assert rec.generator.downcase.include?("offroad")
22
+ end
23
+
24
+ double_test "cannot save a MirrorInfo instance" do
25
+ rec = Offroad::MirrorInfo::new_from_group(@editable_group)
26
+ assert rec.valid?
27
+ assert_raise Offroad::DataError do
28
+ rec.save
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,37 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+
3
+ class ModuleFuncsTest < Test::Unit::TestCase
4
+ online_test "app reports being online" do
5
+ assert Offroad::app_online?, "App is online"
6
+ assert_equal false, Offroad::app_offline?, "App is not offline"
7
+ end
8
+
9
+ offline_test "app reports being offline" do
10
+ assert Offroad::app_offline?, "App is offline"
11
+ assert_equal false, Offroad::app_online?, "App is not online"
12
+ end
13
+
14
+ online_test "cannot call offline_group" do
15
+ assert_raise Offroad::PluginError do
16
+ Offroad::offline_group
17
+ end
18
+ end
19
+
20
+ offline_test "offline_group returns the offline group" do
21
+ assert_equal @offline_group, Offroad::offline_group
22
+ end
23
+
24
+ agnostic_test "config_app_online can set app to online or offline" do
25
+ Offroad::config_app_online(true)
26
+ assert Offroad::app_online?
27
+ Offroad::config_app_online(false)
28
+ assert Offroad::app_offline?
29
+ end
30
+
31
+ agnostic_test "config_app_online with nil sets app to unknown mode, which raises exception when checked" do
32
+ Offroad::config_app_online(nil)
33
+ assert_raise Offroad::AppModeUnknownError do
34
+ Offroad::app_online?
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+
3
+ # This is a unit test on the ability of model_extensions to correctly handle bad acts_as_offroadable calls
4
+
5
+ class PathologicalModelTest < Test::Unit::TestCase
6
+ agnostic_test "cannot specify acts_as_offroadable multiple times" do
7
+ assert_raise Offroad::ModelError do
8
+ class MultipleTimesBrokenRecord < ActiveRecord::Base
9
+ set_table_name "broken_records"
10
+ acts_as_offroadable :global
11
+ acts_as_offroadable :global
12
+ end
13
+ end
14
+ end
15
+
16
+ agnostic_test "cannot specify invalid mirror mode" do
17
+ assert_raise Offroad::ModelError do
18
+ class InvalidModeBrokenRecord < ActiveRecord::Base
19
+ set_table_name "broken_records"
20
+ acts_as_offroadable :this_mode_does_not_exist
21
+ end
22
+ end
23
+ end
24
+
25
+ agnostic_test "cannot specify :group_owned mode without :parent" do
26
+ assert_raise Offroad::ModelError do
27
+ class NoGroupKeyBrokenRecord < ActiveRecord::Base
28
+ set_table_name "broken_records"
29
+ acts_as_offroadable :group_owned # No :parent
30
+ end
31
+ end
32
+ end
33
+
34
+ agnostic_test "cannot specify :group_owned with a :parent to a non-existing association" do
35
+ self.class.send(:remove_const, :InvalidColumnBrokenRecord) if self.class.const_defined?(:InvalidColumnBrokenRecord)
36
+ assert_raise Offroad::ModelError do
37
+ class InvalidColumnBrokenRecord < ActiveRecord::Base
38
+ set_table_name "broken_records"
39
+ acts_as_offroadable :group_owned, :parent => :no_such_assoc
40
+ end
41
+ InvalidColumnBrokenRecord.create
42
+ end
43
+ end
44
+
45
+ agnostic_test "cannot give acts_as_offroadable unknown options" do
46
+ assert_raise Offroad::ModelError do
47
+ class UnknownOptionsBrokenRecord < ActiveRecord::Base
48
+ set_table_name "broken_records"
49
+ acts_as_offroadable :global, :foo_bar_bork_narf => 1234
50
+ end
51
+ end
52
+ end
53
+
54
+ agnostic_test "cannot specify more than one group base" do
55
+ # The Group model has already declare itself as :group base
56
+ assert_raise Offroad::ModelError do
57
+ class DoubleGroupBaseBrokenRecord < ActiveRecord::Base
58
+ acts_as_offroadable :group_base
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,86 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+
3
+ class TestFrameworkTest < Test::Unit::TestCase
4
+ cross_test "online and offline databases are independent" do
5
+ in_offline_app do
6
+ assert_equal 0, UnmirroredRecord.count
7
+ UnmirroredRecord.create(:content => "Testing")
8
+ end
9
+
10
+ in_online_app do
11
+ assert_equal 0, UnmirroredRecord.count
12
+ end
13
+
14
+ in_offline_app do
15
+ assert UnmirroredRecord.find_by_content("Testing")
16
+ end
17
+ end
18
+
19
+ cross_test "online-specific and offline-specific instance variables are independent" do
20
+ in_offline_app do
21
+ @offline_group.name = "Foo"
22
+ @offline_group.save!
23
+ assert_equal "Foo", @offline_group.name
24
+ end
25
+
26
+ in_online_app do
27
+ assert_not_equal "Foo", @offline_group.name
28
+ end
29
+
30
+ in_offline_app do
31
+ assert_equal "Foo", @offline_group.name
32
+ end
33
+ end
34
+
35
+ cross_test "instance variables lose unsaved data on mode switch" do
36
+ in_offline_app do
37
+ @offline_group.name = "Foo"
38
+ assert_equal "Foo", @offline_group.name
39
+ # Didn't save @offline_group
40
+ end
41
+
42
+ in_offline_app do
43
+ assert_not_equal "Foo", @offline_group.name
44
+ end
45
+ end
46
+
47
+ offline_test "callback detection switch on GroupOwnedRecord works on save" do
48
+ GroupOwnedRecord.reset_callback_called
49
+ assert !GroupOwnedRecord.callback_called
50
+ @offline_group_data.description = "Testing"
51
+ @offline_group_data.save!
52
+ assert GroupOwnedRecord.callback_called
53
+ end
54
+
55
+ offline_test "callback detection switch on GroupOwnedRecord works on create" do
56
+ GroupOwnedRecord.reset_callback_called
57
+ assert !GroupOwnedRecord.callback_called
58
+ GroupOwnedRecord.create!(:description => "Another new one", :group => @offline_group)
59
+ assert GroupOwnedRecord.callback_called
60
+ end
61
+
62
+ offline_test "callback detection switch on GroupOwnedRecord works on destroy" do
63
+ GroupOwnedRecord.reset_callback_called
64
+ assert !GroupOwnedRecord.callback_called
65
+ @offline_group_data.destroy
66
+ assert GroupOwnedRecord.callback_called
67
+ end
68
+
69
+ if HOBO_TEST_MODE
70
+ class CommonHoboTestModel < ActiveRecord::Base
71
+ include CommonHobo
72
+ set_table_name "broken_records" # Not important since we won't be saving anything
73
+ end
74
+ agnostic_test "simple unmirrored data hobo permissions work as expected" do
75
+ g = Guest.new
76
+ c = CommonHoboTestModel.new
77
+ assert !c.creatable_by?(g)
78
+ assert !c.updatable_by?(g)
79
+ assert !c.destroyable_by?(g)
80
+ c.permissive = true
81
+ assert c.creatable_by?(g)
82
+ assert c.updatable_by?(g)
83
+ assert c.destroyable_by?(g)
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+
3
+ # This is a unit test on the ability of model_extensions to correctly ignore unmirrored data
4
+
5
+ class UnmirroredDataTest < Test::Unit::TestCase
6
+ agnostic_test "unmirrored data model returns false to acts_as_offroadable?" do
7
+ assert_equal false, UnmirroredRecord.acts_as_offroadable?
8
+ end
9
+
10
+ agnostic_test "offroad_*_data? methods return false on unmirrored data models" do
11
+ assert_equal false, UnmirroredRecord.offroad_group_data?
12
+ assert_equal false, UnmirroredRecord.offroad_global_data?
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: offroad
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - David Mike Simon
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-04-11 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: ar-extensions
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ description: Offroad manages offline instances of a Rails app on computers without Internet access. The online and offline instances can communicate via mirror files, transported by the user via thumbdrive, burned CD, etc.
36
+ email: david.mike.simon@gmail.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - LICENSE
45
+ - README.rdoc
46
+ - Rakefile
47
+ - TODO
48
+ - lib/app/models/offroad/group_state.rb
49
+ - lib/app/models/offroad/mirror_info.rb
50
+ - lib/app/models/offroad/model_state.rb
51
+ - lib/app/models/offroad/received_record_state.rb
52
+ - lib/app/models/offroad/sendable_record_state.rb
53
+ - lib/app/models/offroad/system_state.rb
54
+ - lib/cargo_streamer.rb
55
+ - lib/controller_extensions.rb
56
+ - lib/exceptions.rb
57
+ - lib/migrate/20100512164608_create_offroad_tables.rb
58
+ - lib/mirror_data.rb
59
+ - lib/model_extensions.rb
60
+ - lib/module_funcs.rb
61
+ - lib/offroad.rb
62
+ - lib/version.rb
63
+ - lib/view_helper.rb
64
+ - templates/offline.rb
65
+ - templates/offline_database.yml
66
+ - templates/offroad.yml
67
+ - test/app_root/app/controllers/application_controller.rb
68
+ - test/app_root/app/controllers/group_controller.rb
69
+ - test/app_root/app/models/global_record.rb
70
+ - test/app_root/app/models/group.rb
71
+ - test/app_root/app/models/group_owned_record.rb
72
+ - test/app_root/app/models/guest.rb
73
+ - test/app_root/app/models/subrecord.rb
74
+ - test/app_root/app/models/unmirrored_record.rb
75
+ - test/app_root/app/views/group/download_down_mirror.html.erb
76
+ - test/app_root/app/views/group/download_initial_down_mirror.html.erb
77
+ - test/app_root/app/views/group/download_up_mirror.html.erb
78
+ - test/app_root/app/views/group/upload_down_mirror.html.erb
79
+ - test/app_root/app/views/group/upload_up_mirror.html.erb
80
+ - test/app_root/app/views/layouts/mirror.html.erb
81
+ - test/app_root/config/boot.rb
82
+ - test/app_root/config/database.yml
83
+ - test/app_root/config/environment.rb
84
+ - test/app_root/config/environments/test.rb
85
+ - test/app_root/config/offroad.yml
86
+ - test/app_root/config/routes.rb
87
+ - test/app_root/db/migrate/20100529235049_create_tables.rb
88
+ - test/app_root/lib/common_hobo.rb
89
+ - test/app_root/vendor/plugins/offroad/init.rb
90
+ - test/functional/mirror_operations_test.rb
91
+ - test/test_helper.rb
92
+ - test/unit/app_state_tracking_test.rb
93
+ - test/unit/cargo_streamer_test.rb
94
+ - test/unit/global_data_test.rb
95
+ - test/unit/group_controller_test.rb
96
+ - test/unit/group_data_test.rb
97
+ - test/unit/group_single_test.rb
98
+ - test/unit/hobo_permissions_test.rb
99
+ - test/unit/mirror_data_test.rb
100
+ - test/unit/mirror_info_test.rb
101
+ - test/unit/module_funcs_test.rb
102
+ - test/unit/pathological_model_test.rb
103
+ - test/unit/test_framework_test.rb
104
+ - test/unit/unmirrored_data_test.rb
105
+ has_rdoc: true
106
+ homepage: http://github.com/DavidMikeSimon/offroad
107
+ licenses: []
108
+
109
+ post_install_message:
110
+ rdoc_options: []
111
+
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ hash: 3
120
+ segments:
121
+ - 0
122
+ version: "0"
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
130
+ - 0
131
+ version: "0"
132
+ requirements: []
133
+
134
+ rubyforge_project: "[none]"
135
+ rubygems_version: 1.3.7
136
+ signing_key:
137
+ specification_version: 3
138
+ summary: Manages off-Internet instances of a Rails app
139
+ test_files: []
140
+