leonidas 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 (65) hide show
  1. data/CHANGELOG +1 -0
  2. data/Gemfile +15 -0
  3. data/Gemfile.lock +105 -0
  4. data/LICENSE +21 -0
  5. data/Manifest +63 -0
  6. data/README.md +213 -0
  7. data/Rakefile +42 -0
  8. data/assets/scripts/coffee/leonidas/client.coffee +15 -0
  9. data/assets/scripts/coffee/leonidas/commander.coffee +34 -0
  10. data/assets/scripts/coffee/leonidas/commands/command.coffee +9 -0
  11. data/assets/scripts/coffee/leonidas/commands/organizer.coffee +24 -0
  12. data/assets/scripts/coffee/leonidas/commands/processor.coffee +13 -0
  13. data/assets/scripts/coffee/leonidas/commands/stabilizer.coffee +13 -0
  14. data/assets/scripts/coffee/leonidas/commands/synchronizer.coffee +38 -0
  15. data/assets/scripts/js/lib/jquery.js +6 -0
  16. data/bin/leonidas.js +178 -0
  17. data/config/assets.rb +7 -0
  18. data/leonidas.gemspec +36 -0
  19. data/lib/leonidas.rb +14 -0
  20. data/lib/leonidas/app/app.rb +80 -0
  21. data/lib/leonidas/app/connection.rb +20 -0
  22. data/lib/leonidas/app/repository.rb +41 -0
  23. data/lib/leonidas/commands/aggregator.rb +31 -0
  24. data/lib/leonidas/commands/command.rb +24 -0
  25. data/lib/leonidas/commands/handler.rb +21 -0
  26. data/lib/leonidas/commands/processor.rb +30 -0
  27. data/lib/leonidas/dsl/configuration_expression.rb +17 -0
  28. data/lib/leonidas/memory_layer/memory_registry.rb +33 -0
  29. data/lib/leonidas/persistence_layer/persister.rb +54 -0
  30. data/lib/leonidas/persistence_layer/state_builder.rb +17 -0
  31. data/lib/leonidas/persistence_layer/state_loader.rb +22 -0
  32. data/lib/leonidas/routes/sync.rb +45 -0
  33. data/lib/leonidas/symbols.rb +17 -0
  34. data/spec/jasmine/jasmine.yml +44 -0
  35. data/spec/jasmine/runner.html +77 -0
  36. data/spec/jasmine/support/classes.coffee +16 -0
  37. data/spec/jasmine/support/helpers.coffee +22 -0
  38. data/spec/jasmine/support/mocks.coffee +19 -0
  39. data/spec/jasmine/support/objects.coffee +11 -0
  40. data/spec/jasmine/support/requirements.coffee +1 -0
  41. data/spec/jasmine/tests/client_spec.coffee +20 -0
  42. data/spec/jasmine/tests/commander_spec.coffee +69 -0
  43. data/spec/jasmine/tests/commands/command_spec.coffee +12 -0
  44. data/spec/jasmine/tests/commands/organizer_spec.coffee +70 -0
  45. data/spec/jasmine/tests/commands/processor_spec.coffee +22 -0
  46. data/spec/jasmine/tests/commands/stabilizer_spec.coffee +30 -0
  47. data/spec/jasmine/tests/commands/synchronizer_spec.coffee +72 -0
  48. data/spec/rspec/spec_helper.rb +4 -0
  49. data/spec/rspec/support/classes/app.rb +26 -0
  50. data/spec/rspec/support/classes/commands.rb +52 -0
  51. data/spec/rspec/support/classes/persistence.rb +56 -0
  52. data/spec/rspec/support/config.rb +3 -0
  53. data/spec/rspec/support/mocks.rb +15 -0
  54. data/spec/rspec/support/objects.rb +11 -0
  55. data/spec/rspec/unit/app/app_spec.rb +185 -0
  56. data/spec/rspec/unit/app/repository_spec.rb +114 -0
  57. data/spec/rspec/unit/commands/aggregator_spec.rb +103 -0
  58. data/spec/rspec/unit/commands/command.rb +17 -0
  59. data/spec/rspec/unit/commands/processor_spec.rb +30 -0
  60. data/spec/rspec/unit/dsl/configuration_expression_spec.rb +32 -0
  61. data/spec/rspec/unit/leonidas_spec.rb +26 -0
  62. data/spec/rspec/unit/memory_layer/memory_registry_spec.rb +85 -0
  63. data/spec/rspec/unit/persistence_layer/persister_spec.rb +84 -0
  64. data/spec/rspec/unit/persistence_layer/state_loader_spec.rb +29 -0
  65. metadata +166 -0
@@ -0,0 +1,17 @@
1
+ describe Leonidas::Commands::Command do
2
+ include TestObjects
3
+
4
+ subject do
5
+ @connection = build_connection
6
+ Leonidas::Commands::Command.new("test", { test: "testdata" }, 123, @connection)
7
+ end
8
+
9
+ describe '#to_hash' do
10
+
11
+ it "will return the command as a hash" do
12
+ subject.to_hash.should eq({ name: "test", data: { test: "testdata" }, timestamp: 123, @connection.id })
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,30 @@
1
+ describe Leonidas::Commands::Processor do
2
+ include TestObjects
3
+
4
+ subject do
5
+ @app = TestMocks::MockApp.new
6
+ described_class.new([ TestClasses::IncrementHandler.new(@app), TestClasses::MultiplyHandler.new(@app) ])
7
+ end
8
+
9
+ before :each do
10
+ TestClasses::PersistentState.reset
11
+ @command1 = build_command(build_connection, 1)
12
+ @command2 = build_command(build_connection, 2, "multiply", { multiply_by: 3 })
13
+ @command3 = build_command(build_connection, 3, "increment", { increment_by: 4 })
14
+ end
15
+
16
+ describe '#process' do
17
+
18
+ it "will run a list of commands in order by timestamp" do
19
+ subject.process([ @command3, @command1, @command2 ])
20
+ @app.current_state.should eq({ value: 7 })
21
+ end
22
+
23
+ it "will persist the list of commands when persist is true" do
24
+ subject.process([ @command3, @command1, @command2 ], true)
25
+ TestClasses::PersistentState.value.should eq 7
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,32 @@
1
+ describe Leonidas::Dsl::ConfigurationExpression do
2
+
3
+ def clear_persistence_layer
4
+ Leonidas::PersistenceLayer::Persister.class_variable_set(:@@persister, nil)
5
+ Leonidas::PersistenceLayer::Persister.class_variable_get(:@@state_loader).instance_variable_set(:@builders, [])
6
+ end
7
+
8
+ after :each do
9
+ clear_persistence_layer
10
+ end
11
+
12
+ describe '#persister_class_is' do
13
+
14
+ it "will set the class used to persist apps in Persister" do
15
+ persister_class = TestClasses::TestAppPersister
16
+ subject.persister_class_is persister_class
17
+ Leonidas::PersistenceLayer::Persister.class_variable_get(:@@persister).should_not be_nil
18
+ end
19
+
20
+ end
21
+
22
+ describe '#add_app_state_builder' do
23
+
24
+ it "will add a state builder to the persister's state loader" do
25
+ builder_class = TestClasses::TestAppStateBuilder
26
+ subject.add_app_state_builder builder_class
27
+ Leonidas::PersistenceLayer::Persister.class_variable_get(:@@state_loader).instance_variable_get(:@builders).should_not be_empty
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,26 @@
1
+ describe Leonidas do
2
+
3
+ def clear_persistence_layer
4
+ Leonidas::PersistenceLayer::Persister.class_variable_set(:@@persister, nil)
5
+ Leonidas::PersistenceLayer::Persister.class_variable_get(:@@state_loader).instance_variable_set(:@builders, [])
6
+ end
7
+
8
+ subject do
9
+ Leonidas
10
+ end
11
+
12
+ after :each do
13
+ clear_persistence_layer
14
+ end
15
+
16
+ describe '::bootstrap' do
17
+
18
+ it "will load and execute a config" do
19
+ subject.bootstrap(File.expand_path("#{File.dirname(__FILE__)}/../support/config.rb"))
20
+ Leonidas::PersistenceLayer::Persister.class_variable_get(:@@persister).should_not be_nil
21
+ Leonidas::PersistenceLayer::Persister.class_variable_get(:@@state_loader).instance_variable_get(:@builders).should_not be_empty
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,85 @@
1
+ describe Leonidas::MemoryLayer::MemoryRegistry do
2
+
3
+ subject do
4
+ described_class
5
+ end
6
+
7
+ before :each do
8
+ subject.clear_registry!
9
+ end
10
+
11
+ describe '::register_app!' do
12
+
13
+ it "will reject an argument if it doesn't include Leonidas::App::App" do
14
+ app = { convincing_app: "not so much"}
15
+ expect { subject.register_app!(app) }.to raise_error(TypeError, "Argument must include Leonidas::App::App")
16
+ subject.should_not have_app app
17
+ end
18
+
19
+ it "will add an app to the list of registered apps" do
20
+ subject.register_app! TestClasses::TestApp.new
21
+ subject.retrieve_app("app 1").should_not be_nil
22
+ end
23
+
24
+ it "will throw an error if an app with the same name is already registered" do
25
+ app1 = TestClasses::TestApp.new
26
+ app2 = TestClasses::TestApp.new
27
+ expect { subject.register_app! app1 }.not_to raise_error
28
+ expect { subject.register_app! app2 }.to raise_error(StandardError, "An app with the name 'app 1' is already registered")
29
+ subject.retrieve_app('app 1').should eq app1
30
+ end
31
+
32
+ end
33
+
34
+ describe '::retrieve_app' do
35
+
36
+ it "will return nil if the requested app isn't registered" do
37
+ subject.retrieve_app("app 1").should be_nil
38
+ end
39
+
40
+ it "will return the app if it is registered" do
41
+ app = TestClasses::TestApp.new
42
+ subject.register_app! app
43
+ subject.retrieve_app("app 1").should eq app
44
+ end
45
+
46
+ end
47
+
48
+ describe '::has_app?' do
49
+
50
+ it "will return true if the requested app is registered" do
51
+ subject.register_app! TestClasses::TestApp.new
52
+ subject.should have_app "app 1"
53
+ end
54
+
55
+ it "will return false if the requested app is not registered" do
56
+ subject.should_not have_app "badname"
57
+ end
58
+
59
+ end
60
+
61
+ describe '::close_app!' do
62
+
63
+ it "will remove the app from the list of registered apps" do
64
+ subject.register_app! TestClasses::TestApp.new
65
+ subject.close_app! "app 1"
66
+ subject.should_not have_app "app 1"
67
+ end
68
+
69
+ end
70
+
71
+ describe '#clear_registry!' do
72
+
73
+ it "removes all apps registered" do
74
+ app1 = TestClasses::TestApp.new
75
+ app2 = TestClasses::TestApp.new("app 2")
76
+ subject.register_app! app1
77
+ subject.register_app! app2
78
+ subject.clear_registry!
79
+ subject.should_not have_app app1.name
80
+ subject.should_not have_app app2.name
81
+ end
82
+
83
+ end
84
+
85
+ end
@@ -0,0 +1,84 @@
1
+ describe Leonidas::PersistenceLayer::Persister do
2
+ include TestObjects
3
+
4
+ def clear_persistence_layer
5
+ Leonidas::PersistenceLayer::Persister.class_variable_set(:@@persister, nil)
6
+ Leonidas::PersistenceLayer::Persister.class_variable_get(:@@state_loader).instance_variable_set(:@builders, [])
7
+ end
8
+
9
+ subject do
10
+ described_class
11
+ end
12
+
13
+ before :each do
14
+ @app = TestClasses::TestApp.new
15
+ @persister = TestClasses::TestAppPersister.new([ @app ])
16
+ end
17
+
18
+ after :each do
19
+ clear_persistence_layer
20
+ end
21
+
22
+ describe '::set_app_persister' do
23
+
24
+ it "will reject any argument that doesn't include AppPersister" do
25
+ persister = { fake_persister: "maybe it'll work this time" }
26
+ expect { subject.set_app_persister! persister }.to raise_error(TypeError, "Argument must include Leonidas::PersistenceLayer::AppPersister")
27
+ subject.class_variable_get(:@@persister).should be_nil
28
+ end
29
+
30
+ it "will set the persister to use for saving an app" do
31
+ persister = TestClasses::TestAppPersister.new
32
+ subject.set_app_persister! persister
33
+ subject.class_variable_get(:@@persister).should eq persister
34
+ end
35
+
36
+ end
37
+
38
+ describe '::load' do
39
+
40
+ before :each do
41
+ described_class.set_app_persister! @persister
42
+ described_class.add_state_builder! TestClasses::TestAppStateBuilder.new
43
+ end
44
+
45
+ it "will load an app with the given name" do
46
+ subject.load("app 1").should eq @app
47
+ end
48
+
49
+ it "will return nil if no app with the given name exists" do
50
+ subject.load("badname").should be_nil
51
+ end
52
+
53
+ it "will set the app current state to the active state" do
54
+ conn = @app.create_connection!
55
+ conn.add_command! build_command(conn, conn.last_update+10)
56
+ subject.load("app 1")
57
+ @app.current_state.should eq({ value: 1 })
58
+ end
59
+
60
+ end
61
+
62
+ describe '::persist' do
63
+
64
+ it "will persist the app" do
65
+ described_class.set_app_persister! @persister
66
+ @persister.clear_apps!
67
+ subject.load("app 1").should be_nil
68
+ subject.persist @app
69
+ subject.load("app 1").should eq @app
70
+ end
71
+
72
+ end
73
+
74
+ describe '::delete' do
75
+
76
+ it "will delete the app" do
77
+ described_class.set_app_persister! @persister
78
+ subject.delete @app
79
+ subject.load("app 1").should be_nil
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,29 @@
1
+ describe Leonidas::PersistenceLayer::StateLoader do
2
+
3
+ describe '#add_builder!' do
4
+
5
+ it "will reject any argument that isn't a StateBuilder" do
6
+ builder = { pretty_good: "but not good enough" }
7
+ expect { subject.add_builder! builder }.to raise_error(TypeError, "Argument must include Leonidas::PersistenceLayer::StateBuilder")
8
+ subject.instance_variable_get(:@builders).should be_empty
9
+ end
10
+
11
+ it "will add a builder to the state loader" do
12
+ builder = TestClasses::TestAppStateBuilder.new
13
+ subject.add_builder! builder
14
+ subject.instance_variable_get(:@builders).should eq [ builder ]
15
+ end
16
+
17
+ end
18
+
19
+ describe '#load_state' do
20
+
21
+ it "will load the state for a given app" do
22
+ subject.add_builder! TestClasses::TestAppStateBuilder.new
23
+ state = subject.load_state TestClasses::TestApp.new
24
+ state.should eq({ value: 0 })
25
+ end
26
+
27
+ end
28
+
29
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: leonidas
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tim Shelburne
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: jasmine
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: jasmine-headless-webkit
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: ''
47
+ email: shelburt02@gmail.com
48
+ executables:
49
+ - leonidas.js
50
+ extensions: []
51
+ extra_rdoc_files:
52
+ - CHANGELOG
53
+ - LICENSE
54
+ - README.md
55
+ - bin/leonidas.js
56
+ - lib/leonidas.rb
57
+ - lib/leonidas/app/app.rb
58
+ - lib/leonidas/app/connection.rb
59
+ - lib/leonidas/app/repository.rb
60
+ - lib/leonidas/commands/aggregator.rb
61
+ - lib/leonidas/commands/command.rb
62
+ - lib/leonidas/commands/handler.rb
63
+ - lib/leonidas/commands/processor.rb
64
+ - lib/leonidas/dsl/configuration_expression.rb
65
+ - lib/leonidas/memory_layer/memory_registry.rb
66
+ - lib/leonidas/persistence_layer/persister.rb
67
+ - lib/leonidas/persistence_layer/state_builder.rb
68
+ - lib/leonidas/persistence_layer/state_loader.rb
69
+ - lib/leonidas/routes/sync.rb
70
+ - lib/leonidas/symbols.rb
71
+ files:
72
+ - CHANGELOG
73
+ - Gemfile
74
+ - Gemfile.lock
75
+ - LICENSE
76
+ - Manifest
77
+ - README.md
78
+ - Rakefile
79
+ - assets/scripts/coffee/leonidas/client.coffee
80
+ - assets/scripts/coffee/leonidas/commander.coffee
81
+ - assets/scripts/coffee/leonidas/commands/command.coffee
82
+ - assets/scripts/coffee/leonidas/commands/organizer.coffee
83
+ - assets/scripts/coffee/leonidas/commands/processor.coffee
84
+ - assets/scripts/coffee/leonidas/commands/stabilizer.coffee
85
+ - assets/scripts/coffee/leonidas/commands/synchronizer.coffee
86
+ - assets/scripts/js/lib/jquery.js
87
+ - bin/leonidas.js
88
+ - config/assets.rb
89
+ - lib/leonidas.rb
90
+ - lib/leonidas/app/app.rb
91
+ - lib/leonidas/app/connection.rb
92
+ - lib/leonidas/app/repository.rb
93
+ - lib/leonidas/commands/aggregator.rb
94
+ - lib/leonidas/commands/command.rb
95
+ - lib/leonidas/commands/handler.rb
96
+ - lib/leonidas/commands/processor.rb
97
+ - lib/leonidas/dsl/configuration_expression.rb
98
+ - lib/leonidas/memory_layer/memory_registry.rb
99
+ - lib/leonidas/persistence_layer/persister.rb
100
+ - lib/leonidas/persistence_layer/state_builder.rb
101
+ - lib/leonidas/persistence_layer/state_loader.rb
102
+ - lib/leonidas/routes/sync.rb
103
+ - lib/leonidas/symbols.rb
104
+ - spec/jasmine/jasmine.yml
105
+ - spec/jasmine/runner.html
106
+ - spec/jasmine/support/classes.coffee
107
+ - spec/jasmine/support/helpers.coffee
108
+ - spec/jasmine/support/mocks.coffee
109
+ - spec/jasmine/support/objects.coffee
110
+ - spec/jasmine/support/requirements.coffee
111
+ - spec/jasmine/tests/client_spec.coffee
112
+ - spec/jasmine/tests/commander_spec.coffee
113
+ - spec/jasmine/tests/commands/command_spec.coffee
114
+ - spec/jasmine/tests/commands/organizer_spec.coffee
115
+ - spec/jasmine/tests/commands/processor_spec.coffee
116
+ - spec/jasmine/tests/commands/stabilizer_spec.coffee
117
+ - spec/jasmine/tests/commands/synchronizer_spec.coffee
118
+ - spec/rspec/spec_helper.rb
119
+ - spec/rspec/support/classes/app.rb
120
+ - spec/rspec/support/classes/commands.rb
121
+ - spec/rspec/support/classes/persistence.rb
122
+ - spec/rspec/support/config.rb
123
+ - spec/rspec/support/mocks.rb
124
+ - spec/rspec/support/objects.rb
125
+ - spec/rspec/unit/app/app_spec.rb
126
+ - spec/rspec/unit/app/repository_spec.rb
127
+ - spec/rspec/unit/commands/aggregator_spec.rb
128
+ - spec/rspec/unit/commands/command.rb
129
+ - spec/rspec/unit/commands/processor_spec.rb
130
+ - spec/rspec/unit/dsl/configuration_expression_spec.rb
131
+ - spec/rspec/unit/leonidas_spec.rb
132
+ - spec/rspec/unit/memory_layer/memory_registry_spec.rb
133
+ - spec/rspec/unit/persistence_layer/persister_spec.rb
134
+ - spec/rspec/unit/persistence_layer/state_loader_spec.rb
135
+ - leonidas.gemspec
136
+ homepage: https://github.com/tshelburne/leonidas
137
+ licenses: []
138
+ post_install_message:
139
+ rdoc_options:
140
+ - --line-numbers
141
+ - --inline-source
142
+ - --title
143
+ - Leonidas
144
+ - --main
145
+ - README.md
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '1.2'
160
+ requirements: []
161
+ rubyforge_project: leonidas
162
+ rubygems_version: 1.8.24
163
+ signing_key:
164
+ specification_version: 3
165
+ summary: ''
166
+ test_files: []