interapp 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 (59) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +30 -0
  3. data/app/controllers/interapp/application_controller.rb +11 -0
  4. data/app/controllers/interapp/messages_controller.rb +12 -0
  5. data/app/models/interapp/message.rb +22 -0
  6. data/app/models/interapp/peer.rb +23 -0
  7. data/app/services/interapp/receive_message_service.rb +27 -0
  8. data/app/services/interapp/send_message_service.rb +26 -0
  9. data/config/routes.rb +3 -0
  10. data/lib/interapp.rb +23 -0
  11. data/lib/interapp/configuration.rb +18 -0
  12. data/lib/interapp/cryptography.rb +30 -0
  13. data/lib/interapp/engine.rb +5 -0
  14. data/lib/interapp/errors.rb +4 -0
  15. data/lib/interapp/version.rb +3 -0
  16. data/lib/tasks/interapp_tasks.rake +12 -0
  17. data/spec/dummy/README.rdoc +28 -0
  18. data/spec/dummy/Rakefile +6 -0
  19. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  20. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  21. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  22. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  23. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  24. data/spec/dummy/bin/bundle +3 -0
  25. data/spec/dummy/bin/rails +4 -0
  26. data/spec/dummy/bin/rake +4 -0
  27. data/spec/dummy/config.ru +4 -0
  28. data/spec/dummy/config/application.rb +23 -0
  29. data/spec/dummy/config/boot.rb +5 -0
  30. data/spec/dummy/config/database.yml +25 -0
  31. data/spec/dummy/config/environment.rb +5 -0
  32. data/spec/dummy/config/environments/development.rb +37 -0
  33. data/spec/dummy/config/environments/production.rb +83 -0
  34. data/spec/dummy/config/environments/test.rb +39 -0
  35. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  36. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  37. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  38. data/spec/dummy/config/initializers/inflections.rb +16 -0
  39. data/spec/dummy/config/initializers/interapp.rb +21 -0
  40. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  41. data/spec/dummy/config/initializers/session_store.rb +3 -0
  42. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  43. data/spec/dummy/config/locales/en.yml +23 -0
  44. data/spec/dummy/config/routes.rb +3 -0
  45. data/spec/dummy/config/secrets.yml +22 -0
  46. data/spec/dummy/db/development.sqlite3 +0 -0
  47. data/spec/dummy/db/test.sqlite3 +0 -0
  48. data/spec/dummy/log/test.log +264 -0
  49. data/spec/dummy/public/404.html +67 -0
  50. data/spec/dummy/public/422.html +67 -0
  51. data/spec/dummy/public/500.html +66 -0
  52. data/spec/dummy/public/favicon.ico +0 -0
  53. data/spec/dummy/tmp/pids/server.pid +1 -0
  54. data/spec/models/message_spec.rb +53 -0
  55. data/spec/requests/interapp_spec.rb +59 -0
  56. data/spec/services/receive_message_service_spec.rb +49 -0
  57. data/spec/services/send_message_service_spec.rb +30 -0
  58. data/spec/spec_helper.rb +14 -0
  59. metadata +220 -0
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/404.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The page you were looking for doesn't exist.</h1>
62
+ <p>You may have mistyped the address or the page may have moved.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/422.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The change you wanted was rejected.</h1>
62
+ <p>Maybe you tried to change something you didn't have access to.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/500.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>We're sorry, but something went wrong.</h1>
62
+ </div>
63
+ <p>If you are the application owner check the logs for more information.</p>
64
+ </div>
65
+ </body>
66
+ </html>
File without changes
@@ -0,0 +1 @@
1
+ 16398
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Interapp::Message do
4
+ let(:payload) { '{ "test": ["message", "payload"] }' }
5
+ let(:keypair) { Interapp::Cryptography.generate_keypair }
6
+ let(:peer) { Interapp::Peer.new(identifier: "test_peer", public_key: keypair[1])}
7
+ subject(:message) { described_class.new(payload: payload, peer: peer) }
8
+
9
+ describe ".new" do
10
+ it "stores payload and peer in instance variable" do
11
+ expect(subject.payload).to eq(payload)
12
+ expect(subject.peer).to eq(peer)
13
+ end
14
+ end
15
+
16
+ describe "#verify" do
17
+ context "with a valid signature" do
18
+ before do
19
+ subject.signature = Interapp::Cryptography.sign(payload, keypair[0].to_i(16)).unpack("H*").first
20
+ end
21
+
22
+ it "verifies as true" do
23
+ expect(subject.verify).to be_true
24
+ end
25
+ end
26
+
27
+ context "with an invalid signature" do
28
+ before do
29
+ subject.signature = Interapp::Cryptography.sign("foo bar baz", keypair[0].to_i(16)).unpack("H*").first
30
+ end
31
+
32
+ it "verifies as false" do
33
+ expect(subject.verify).to be_false
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "#sign" do
39
+ before do
40
+ Interapp.configure { |config| config.private_key = keypair[0] }
41
+ subject.sign
42
+ end
43
+
44
+ it "stores the signature in hex" do
45
+ expect(subject.signature).to be_present
46
+ expect(subject.signature).to be_a(String)
47
+ end
48
+
49
+ it "verifies against itself" do
50
+ expect(subject.verify).to be_true
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe "POST /interapp" do
4
+ context "with valid signature" do
5
+ let(:payload) { "{\"test\":[\"message\",\"payload\"]}" }
6
+ let(:signature) { "304502210096e30cdca8d21ccd425eef825216dd65edb3fc4b3a6b401a7010c653208e864202201b442c03037c8deb6e3ff27cc33f6ddc338e02923d45ada41b5d57ee7d4b8a4a" }
7
+ let(:identifier) { "dummy" }
8
+
9
+ before do
10
+ @mock_handler = double("handler")
11
+ Interapp.configure do |config|
12
+ config.on_receive do |data, peer_identifier|
13
+ @mock_handler.receive(data, peer_identifier)
14
+ end
15
+ end
16
+ end
17
+
18
+ it "handles the message correctly" do
19
+ expect(@mock_handler).to receive(:receive).with({ "test" => ["message", "payload"]}, "dummy")
20
+ post "/interapp", payload, {
21
+ "CONTENT_TYPE" => "application/json",
22
+ "X-Interapp-Identifier" => identifier,
23
+ "X-Interapp-Signature" => signature
24
+ }
25
+ expect(response.status).to eq(200)
26
+ end
27
+ end
28
+
29
+ context "with invalid signature" do
30
+ let(:payload) { "{\"test\":[\"message\",\"payload\"]}" }
31
+ let(:signature) { "blahblahblah" }
32
+ let(:identifier) { "dummy" }
33
+
34
+ it "returns 403" do
35
+ post "/interapp", payload, {
36
+ "CONTENT_TYPE" => "application/json",
37
+ "X-Interapp-Identifier" => identifier,
38
+ "X-Interapp-Signature" => signature
39
+ }
40
+ expect(response.status).to eq(403)
41
+ end
42
+ end
43
+
44
+ context "with unknown peer" do
45
+ let(:payload) { "{\"test\":[\"message\",\"payload\"]}" }
46
+ let(:signature) { "304502210096e30cdca8d21ccd425eef825216dd65edb3fc4b3a6b401a7010c653208e864202201b442c03037c8deb6e3ff27cc33f6ddc338e02923d45ada41b5d57ee7d4b8a4a" }
47
+ let(:identifier) { "foobar" }
48
+
49
+ it "returns 403" do
50
+ post "/interapp", payload, {
51
+ "CONTENT_TYPE" => "application/json",
52
+ "X-Interapp-Identifier" => identifier,
53
+ "X-Interapp-Signature" => signature
54
+ }
55
+ expect(response.status).to eq(403)
56
+ end
57
+ end
58
+
59
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe Interapp::ReceiveMessageService do
4
+ subject(:receive_message_service) do
5
+ described_class.new(
6
+ payload: "{\"test\":[\"message\",\"payload\"]}",
7
+ peer_identifier: "dummy",
8
+ signature: "304502210096e30cdca8d21ccd425eef825216dd65edb3fc4b3a6b401a7010c653208e864202201b442c03037c8deb6e3ff27cc33f6ddc338e02923d45ada41b5d57ee7d4b8a4a"
9
+ )
10
+ end
11
+
12
+ describe ".new" do
13
+ it "finds the peer" do
14
+ expect(subject.peer).to be_a(Interapp::Peer)
15
+ end
16
+
17
+ it "loads the payload" do
18
+ expect(subject.data).to eq({ "test" => ["message", "payload"] })
19
+ end
20
+ end
21
+
22
+ describe "#perform" do
23
+ before do
24
+ @mock_handler = double("handler")
25
+ Interapp.configure do |config|
26
+ config.on_receive do |data, peer_identifier|
27
+ @mock_handler.receive(data, peer_identifier)
28
+ end
29
+ end
30
+ end
31
+
32
+ context "with valid signature" do
33
+ it "handles the message" do
34
+ expect(@mock_handler).to receive(:receive).with({ "test" => ["message", "payload"]}, "dummy")
35
+ subject.perform
36
+ end
37
+ end
38
+
39
+ context "with invalid signature" do
40
+ before do
41
+ subject.message.signature = "blahblahblahinvalid"
42
+ end
43
+
44
+ it "raises an error" do
45
+ expect { subject.perform }.to raise_error(Interapp::SignatureInvalidError)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Interapp::SendMessageService do
4
+ subject(:send_message_service) { described_class.new(data: { test: ["message", "payload"]}, peer_identifier: "dummy") }
5
+
6
+ describe ".new" do
7
+ it "finds the peer" do
8
+ expect(subject.peer).to be_a(Interapp::Peer)
9
+ end
10
+
11
+ it "dumps the payload" do
12
+ expect(subject.payload).to be_a(String)
13
+ end
14
+
15
+ it "signs the message" do
16
+ expect(subject.message.signature).to be_a(String)
17
+ end
18
+ end
19
+
20
+ describe "#perform" do
21
+ it "sends the POST request" do
22
+ expect(RestClient).to receive(:post).with(subject.peer.endpoint, subject.message.payload, {
23
+ content_type: 'application/json',
24
+ "X-Interapp-Identifier" => Interapp.configuration.identifier,
25
+ "X-Interapp-Signature" => subject.message.signature
26
+ })
27
+ subject.perform
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,14 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+
3
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
4
+ require 'rspec/rails'
5
+ require 'rspec/autorun'
6
+
7
+ Rails.backtrace_cleaner.remove_silencers!
8
+
9
+ RSpec.configure do |config|
10
+ config.mock_with :rspec
11
+ config.use_transactional_fixtures = true
12
+ config.infer_base_class_for_anonymous_controllers = false
13
+ config.order = "random"
14
+ end
metadata ADDED
@@ -0,0 +1,220 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: interapp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Zhou
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-07 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: 4.1.1
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 4.1.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 4.1.1
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 4.1.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: ecdsa
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 1.1.0
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 1.1.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: rest-client
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 1.7.2
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 1.7.2
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec-rails
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: sqlite3
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ description: Interapp is a mountable Rails engine that handles simple and secure inter-app
90
+ messaging using public key cryptography.
91
+ email:
92
+ - github@zhoutong.com
93
+ executables: []
94
+ extensions: []
95
+ extra_rdoc_files: []
96
+ files:
97
+ - Rakefile
98
+ - app/controllers/interapp/application_controller.rb
99
+ - app/controllers/interapp/messages_controller.rb
100
+ - app/models/interapp/message.rb
101
+ - app/models/interapp/peer.rb
102
+ - app/services/interapp/receive_message_service.rb
103
+ - app/services/interapp/send_message_service.rb
104
+ - config/routes.rb
105
+ - lib/interapp.rb
106
+ - lib/interapp/configuration.rb
107
+ - lib/interapp/cryptography.rb
108
+ - lib/interapp/engine.rb
109
+ - lib/interapp/errors.rb
110
+ - lib/interapp/version.rb
111
+ - lib/tasks/interapp_tasks.rake
112
+ - spec/dummy/README.rdoc
113
+ - spec/dummy/Rakefile
114
+ - spec/dummy/app/assets/javascripts/application.js
115
+ - spec/dummy/app/assets/stylesheets/application.css
116
+ - spec/dummy/app/controllers/application_controller.rb
117
+ - spec/dummy/app/helpers/application_helper.rb
118
+ - spec/dummy/app/views/layouts/application.html.erb
119
+ - spec/dummy/bin/bundle
120
+ - spec/dummy/bin/rails
121
+ - spec/dummy/bin/rake
122
+ - spec/dummy/config.ru
123
+ - spec/dummy/config/application.rb
124
+ - spec/dummy/config/boot.rb
125
+ - spec/dummy/config/database.yml
126
+ - spec/dummy/config/environment.rb
127
+ - spec/dummy/config/environments/development.rb
128
+ - spec/dummy/config/environments/production.rb
129
+ - spec/dummy/config/environments/test.rb
130
+ - spec/dummy/config/initializers/backtrace_silencers.rb
131
+ - spec/dummy/config/initializers/cookies_serializer.rb
132
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
133
+ - spec/dummy/config/initializers/inflections.rb
134
+ - spec/dummy/config/initializers/interapp.rb
135
+ - spec/dummy/config/initializers/mime_types.rb
136
+ - spec/dummy/config/initializers/session_store.rb
137
+ - spec/dummy/config/initializers/wrap_parameters.rb
138
+ - spec/dummy/config/locales/en.yml
139
+ - spec/dummy/config/routes.rb
140
+ - spec/dummy/config/secrets.yml
141
+ - spec/dummy/db/development.sqlite3
142
+ - spec/dummy/db/test.sqlite3
143
+ - spec/dummy/log/test.log
144
+ - spec/dummy/public/404.html
145
+ - spec/dummy/public/422.html
146
+ - spec/dummy/public/500.html
147
+ - spec/dummy/public/favicon.ico
148
+ - spec/dummy/tmp/pids/server.pid
149
+ - spec/models/message_spec.rb
150
+ - spec/requests/interapp_spec.rb
151
+ - spec/services/receive_message_service_spec.rb
152
+ - spec/services/send_message_service_spec.rb
153
+ - spec/spec_helper.rb
154
+ homepage: https://github.com/zhoutong/interapp
155
+ licenses:
156
+ - MIT
157
+ metadata: {}
158
+ post_install_message:
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project:
174
+ rubygems_version: 2.2.2
175
+ signing_key:
176
+ specification_version: 4
177
+ summary: Interapp handles simple and secure inter-app messaging.
178
+ test_files:
179
+ - spec/dummy/app/assets/javascripts/application.js
180
+ - spec/dummy/app/assets/stylesheets/application.css
181
+ - spec/dummy/app/controllers/application_controller.rb
182
+ - spec/dummy/app/helpers/application_helper.rb
183
+ - spec/dummy/app/views/layouts/application.html.erb
184
+ - spec/dummy/bin/bundle
185
+ - spec/dummy/bin/rails
186
+ - spec/dummy/bin/rake
187
+ - spec/dummy/config/application.rb
188
+ - spec/dummy/config/boot.rb
189
+ - spec/dummy/config/database.yml
190
+ - spec/dummy/config/environment.rb
191
+ - spec/dummy/config/environments/development.rb
192
+ - spec/dummy/config/environments/production.rb
193
+ - spec/dummy/config/environments/test.rb
194
+ - spec/dummy/config/initializers/backtrace_silencers.rb
195
+ - spec/dummy/config/initializers/cookies_serializer.rb
196
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
197
+ - spec/dummy/config/initializers/inflections.rb
198
+ - spec/dummy/config/initializers/interapp.rb
199
+ - spec/dummy/config/initializers/mime_types.rb
200
+ - spec/dummy/config/initializers/session_store.rb
201
+ - spec/dummy/config/initializers/wrap_parameters.rb
202
+ - spec/dummy/config/locales/en.yml
203
+ - spec/dummy/config/routes.rb
204
+ - spec/dummy/config/secrets.yml
205
+ - spec/dummy/config.ru
206
+ - spec/dummy/db/development.sqlite3
207
+ - spec/dummy/db/test.sqlite3
208
+ - spec/dummy/log/test.log
209
+ - spec/dummy/public/404.html
210
+ - spec/dummy/public/422.html
211
+ - spec/dummy/public/500.html
212
+ - spec/dummy/public/favicon.ico
213
+ - spec/dummy/Rakefile
214
+ - spec/dummy/README.rdoc
215
+ - spec/dummy/tmp/pids/server.pid
216
+ - spec/models/message_spec.rb
217
+ - spec/requests/interapp_spec.rb
218
+ - spec/services/receive_message_service_spec.rb
219
+ - spec/services/send_message_service_spec.rb
220
+ - spec/spec_helper.rb