rs-rails-base 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +75 -0
  5. data/.travis.yml +5 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/Gemfile +9 -0
  8. data/LICENSE.md +9 -0
  9. data/README.md +61 -0
  10. data/Rakefile +7 -0
  11. data/bin/bundle +3 -0
  12. data/bin/rails +7 -0
  13. data/bin/rake +16 -0
  14. data/bin/rs_rails_base +37 -0
  15. data/bin/setup +8 -0
  16. data/circle.yml +12 -0
  17. data/config.reek +109 -0
  18. data/docs/chat.md +14 -0
  19. data/docs/facebook.md +10 -0
  20. data/docs/twilio.md +21 -0
  21. data/images/chat_flow.png +0 -0
  22. data/images/chat_struct.png +0 -0
  23. data/lib/rs-rails-base/cli_actions.rb +16 -0
  24. data/lib/rs-rails-base/commands.rb +81 -0
  25. data/lib/rs-rails-base/constants.rb +7 -0
  26. data/lib/rs-rails-base/features.rb +16 -0
  27. data/lib/rs-rails-base/features/chat.rb +91 -0
  28. data/lib/rs-rails-base/features/facebook.rb +41 -0
  29. data/lib/rs-rails-base/features/twilio.rb +18 -0
  30. data/lib/rs-rails-base/file_manipulation.rb +55 -0
  31. data/lib/rs-rails-base/git_actions.rb +13 -0
  32. data/lib/rs-rails-base/rails_actions.rb +27 -0
  33. data/lib/rs_rails_base.rb +10 -0
  34. data/lib/templates/chat/channel.rb +4 -0
  35. data/lib/templates/chat/chat_channel.rb +15 -0
  36. data/lib/templates/chat/chat_service.rb +28 -0
  37. data/lib/templates/chat/chats_controller.rb +56 -0
  38. data/lib/templates/chat/connection.rb +24 -0
  39. data/lib/templates/chat/jbuilder/_info.json.jbuilder +2 -0
  40. data/lib/templates/chat/jbuilder/_message.json.jbuilder +2 -0
  41. data/lib/templates/chat/jbuilder/index.json.jbuilder +3 -0
  42. data/lib/templates/chat/jbuilder/messages_create.json.jbuilder +3 -0
  43. data/lib/templates/chat/jbuilder/messages_create_info.json.jbuilder +7 -0
  44. data/lib/templates/chat/jbuilder/show.json.jbuilder +3 -0
  45. data/lib/templates/chat/messages_controller.rb +23 -0
  46. data/lib/templates/chat/migration-models/add_chat.rb +9 -0
  47. data/lib/templates/chat/migration-models/add_message.rb +15 -0
  48. data/lib/templates/chat/migration-models/add_participant.rb +12 -0
  49. data/lib/templates/chat/migration-models/chat.rb +30 -0
  50. data/lib/templates/chat/migration-models/message.rb +43 -0
  51. data/lib/templates/chat/migration-models/participant.rb +28 -0
  52. data/lib/templates/chat/migration-models/user.rb +3 -0
  53. data/lib/templates/chat/routes.rb +6 -0
  54. data/lib/templates/chat/routes_2.rb +1 -0
  55. data/lib/templates/chat/sessions_controller.rb +7 -0
  56. data/lib/templates/chat/specs/chat_channel_spec.rb +25 -0
  57. data/lib/templates/chat/specs/chat_factory.rb +20 -0
  58. data/lib/templates/chat/specs/chat_service_spec.rb +19 -0
  59. data/lib/templates/chat/specs/chat_spec.rb +27 -0
  60. data/lib/templates/chat/specs/connection_spec.rb +10 -0
  61. data/lib/templates/chat/specs/message_factory.rb +7 -0
  62. data/lib/templates/chat/specs/message_spec.rb +40 -0
  63. data/lib/templates/chat/specs/participant_factory.rb +7 -0
  64. data/lib/templates/chat/specs/participant_spec.rb +21 -0
  65. data/lib/templates/chat/specs/rails_helper.rb +1 -0
  66. data/lib/templates/facebook/apiary.apib +28 -0
  67. data/lib/templates/facebook/en.yml +4 -0
  68. data/lib/templates/facebook/facebook_service.rb +13 -0
  69. data/lib/templates/facebook/facebook_spec.rb +146 -0
  70. data/lib/templates/facebook/factories_user.rb +6 -0
  71. data/lib/templates/facebook/routes.rb +3 -0
  72. data/lib/templates/facebook/sessions_controller.rb +9 -0
  73. data/lib/templates/facebook/sessions_controller_2.rb +7 -0
  74. data/lib/templates/facebook/sessions_routing_spec.rb +4 -0
  75. data/lib/templates/facebook/user_spec.rb +5 -0
  76. data/lib/templates/twilio/twilio.rb +4 -0
  77. data/lib/templates/twilio/twilio_service.rb +21 -0
  78. data/rs-rails-base.gemspec +29 -0
  79. data/tasks/code_analysis.rake +4 -0
  80. metadata +206 -0
@@ -0,0 +1,10 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ApplicationCable::Connection, type: :channel do
4
+ let(:user) { create(:user) }
5
+
6
+ it 'successfully connects' do
7
+ connect "/cable?user=#{user.id}"
8
+ expect(connection.current_user).to eq user
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :message do
3
+ chat { create(:chat) }
4
+ user { chat.users.first }
5
+ content { Faker::ChuckNorris.fact }
6
+ end
7
+ end
@@ -0,0 +1,40 @@
1
+ require 'rails_helper'
2
+
3
+ describe Message do
4
+ let(:user_1) { create(:user) }
5
+ let(:user_2) { create(:user) }
6
+ let(:chat) { create(:chat) }
7
+ let(:participant) { create(:participant, user: user_1, chat: chat) }
8
+
9
+ describe 'validates restrictions' do
10
+ it 'have a content' do
11
+ subject build(:message, user: user_1, chat: chat)
12
+ it { validate_presence_of(:content) }
13
+ end
14
+ end
15
+
16
+ describe 'validates last_message is updated' do
17
+ it 'be set for first time' do
18
+ new_message = 'next message'
19
+ expect(create(:message, user: user_1, chat: chat, content: new_message)).to
20
+ change(:participant.last_message).from(nil).to(new_message)
21
+ end
22
+
23
+ it 'change when new message' do
24
+ last_message = Message.last.pluck(:last_message)
25
+ new_message = 'next message'
26
+ expect(create(:message, user: user_1, chat: chat, content: new_message)).to
27
+ change(:participant.last_message).from(last_message).to(new_message)
28
+ end
29
+ end
30
+
31
+ describe 'validates user registered for chat' do
32
+ it 'allow user to send message' do
33
+ expect(build(:message, user: user_1, chat: chat)).to have(0).errors_on(:message)
34
+ end
35
+
36
+ it 'not allow user to send message' do
37
+ expect(build(:message, user: user_2, chat: chat)).to have(1).errors_on(:message)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :participant do
3
+ user { create(:user) }
4
+ chat { create(:chat) }
5
+ last_connection nil
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ require 'rails_helper'
2
+
3
+ describe Participant do
4
+ let(:user_1) { create(:user) }
5
+ let(:user_2) { create(:user) }
6
+ let(:chat) { create(:chat) }
7
+
8
+ before(:each) do
9
+ create(:participant, user: user_1, chat: chat)
10
+ end
11
+
12
+ describe 'validate uniqueness of user for a chat' do
13
+ it 'fail due to user already in chat' do
14
+ expect(build(:participant, user: user_1, chat: chat)).to have(1).errors_on(:participant)
15
+ end
16
+
17
+ it 'step the user into the chat' do
18
+ expect(build(:participant, user: user_2, chat: chat)).to have(0).errors_on(:participant)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1 @@
1
+ require 'action_cable/testing/rspec'
@@ -0,0 +1,28 @@
1
+
2
+ ## Login with Facebook [/api/v1/user/facebook]
3
+
4
+ ### Login with Facebook [POST]
5
+
6
+
7
+ + Response 200 (application/json)
8
+ + Headers
9
+
10
+ access-token: sO2bm_Bpdyoo8r78jZ-fqg
11
+ client: QADgNCWRJj0LyRruqzYbBg
12
+ uid: test@test.com
13
+
14
+
15
+ + Body
16
+
17
+ {
18
+ "user":
19
+ {
20
+ "id": 366,
21
+ "email": "test@facebook.com",
22
+ "first_name": "Test",
23
+ "last_name": "test",
24
+ "username": "",
25
+ "provider": "facebook",
26
+ "uid": "1234567890"
27
+ }
28
+ }
@@ -0,0 +1,4 @@
1
+
2
+ facebook:
3
+ not_authorized: 'Not Authorized'
4
+ already_registerd: 'User already registered with email/password'
@@ -0,0 +1,13 @@
1
+ class FacebookService
2
+ def initialize(access_token)
3
+ @access_token = access_token
4
+ end
5
+
6
+ def profile
7
+ client.get_object('me?fields=email,first_name,last_name')
8
+ end
9
+
10
+ def client
11
+ Koala::Facebook::API.new(@access_token, ENV['FACEBOOK_SECRET'])
12
+ end
13
+ end
@@ -0,0 +1,146 @@
1
+ require 'rails_helper'
2
+
3
+ describe 'POST api/v1/users/facebook', type: :request do
4
+ let(:user) { create(:user) }
5
+ let(:facebook_path) { facebook_api_v1_user_path }
6
+ let(:facebook_api_path) { 'https://graph.facebook.com/me' }
7
+ let(:facebook_response) do
8
+ {
9
+ first_name: 'Test',
10
+ last_name: 'test',
11
+ email: 'test@facebook.com',
12
+ id: '1234567890'
13
+ }
14
+ end
15
+
16
+ shared_examples 'fail to login with facebook' do
17
+ it 'does not returns a successful response' do
18
+ post facebook_path, params: params, as: :json
19
+ expect(response).to_not have_http_status(:success)
20
+ end
21
+
22
+ it 'does not create an user' do
23
+ expect { post facebook_path, params: params, as: :json }.to change(User, :count).by(0)
24
+ end
25
+ end
26
+
27
+ context 'with valid params' do
28
+ let(:params) do
29
+ {
30
+ access_token: '123456'
31
+ }
32
+ end
33
+ before do
34
+ stub_request(:get, facebook_api_path)
35
+ .with(query: hash_including(access_token: '123456',
36
+ fields: 'email,first_name,last_name'))
37
+ .to_return(status: 200, body: facebook_response.to_json)
38
+ end
39
+
40
+ it 'returns a successful response' do
41
+ post facebook_path, params: params, as: :json
42
+ expect(response).to have_http_status(:success)
43
+ end
44
+
45
+ it 'creates an user' do
46
+ expect { post facebook_path, params: params, as: :json }.to change(User, :count).by(1)
47
+ end
48
+
49
+ it 'assigns the information properly' do
50
+ post facebook_path, params: params, as: :json
51
+ user = User.last
52
+ expect(user.first_name).to eq 'Test'
53
+ expect(user.email).to eq 'test@facebook.com'
54
+ expect(user.uid).to eq '1234567890'
55
+ expect(user.provider).to eq 'facebook'
56
+ expect(user.encrypted_password).to be_present
57
+ end
58
+
59
+ it 'returns a valid client and access token' do
60
+ post facebook_path, params: params, as: :json
61
+ token = response.header['access-token']
62
+ client = response.header['client']
63
+ user = User.last
64
+ expect(user.reload.valid_token?(token, client)).to be_truthy
65
+ end
66
+
67
+ context 'with an user having the same email' do
68
+ before do
69
+ create :user, email: 'test@facebook.com'
70
+ end
71
+
72
+ it_behaves_like 'fail to login with facebook'
73
+
74
+ it 'shows the right error' do
75
+ post facebook_path, params: params, as: :json
76
+ expect(json[:error]).to include 'already registered'
77
+ end
78
+ end
79
+
80
+ context 'without facebook email' do
81
+ let(:params) do
82
+ {
83
+ access_token: 'without_email'
84
+ }
85
+ end
86
+ before do
87
+ facebook_response[:email] = ''
88
+ fields = 'email,first_name,last_name'
89
+ stub_request(:get, facebook_api_path)
90
+ .with(query: hash_including(access_token: 'without_email', fields: fields))
91
+ .to_return(status: 200, body: facebook_response.to_json)
92
+ end
93
+
94
+ it 'creates an user' do
95
+ expect { post facebook_path, params: params, as: :json }.to change(User, :count).by(1)
96
+ end
97
+ end
98
+
99
+ context 'the user has already logged with facebook' do
100
+ before do
101
+ params = {
102
+ email: 'test@facebook.com',
103
+ provider: 'facebook',
104
+ uid: '1234567890'
105
+ }
106
+ FactoryGirl.create :user, params
107
+ end
108
+
109
+ it 'returns a successful response' do
110
+ post facebook_path, params: params, as: :json
111
+ expect(response).to have_http_status(:success)
112
+ end
113
+
114
+ it 'does not create an user' do
115
+ expect { post facebook_path, params: params, as: :json }.to change(User, :count).by(0)
116
+ end
117
+ end
118
+ end
119
+
120
+ context 'with invalid params' do
121
+ let(:params) do
122
+ {
123
+ access_token: 'invalid'
124
+ }
125
+ end
126
+ before do
127
+ facebook_response = {
128
+ error: {
129
+ message: 'Expired token',
130
+ type: 'OAuthException',
131
+ code: 190
132
+ }
133
+ }
134
+ stub_request(:get, facebook_api_path)
135
+ .with(query: hash_including(access_token: 'invalid', fields: 'email,first_name,last_name'))
136
+ .to_return(status: 400, body: facebook_response.to_json)
137
+ end
138
+
139
+ it_behaves_like 'fail to login with facebook'
140
+
141
+ it 'shows the right error' do
142
+ post facebook_path, params: params, as: :json
143
+ expect(json[:error]).to include 'Not Authorized'
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,6 @@
1
+
2
+ trait :with_fb do
3
+ password nil
4
+ email nil
5
+ provider 'facebook'
6
+ end
@@ -0,0 +1,3 @@
1
+ controller :sessions do
2
+ post :facebook, on: :collection
3
+ end
@@ -0,0 +1,9 @@
1
+ def facebook
2
+ user_params = FacebookService.new(params[:access_token]).profile
3
+ @resource = User.from_social_provider 'facebook', user_params
4
+ custom_sign_in
5
+ rescue Koala::Facebook::AuthenticationError
6
+ render json: { error: I18n.t('api.facebook.not_authorized') }, status: :forbidden
7
+ rescue ActiveRecord::RecordNotUnique
8
+ render json: { error: I18n.t('api.facebook.already_registerd') }, status: :bad_request
9
+ end
@@ -0,0 +1,7 @@
1
+ def custom_sign_in
2
+ sign_in(:api_v1_user, @resource)
3
+ new_auth_header = @resource.create_new_auth_token
4
+ # update response with the header that will be required by the next request
5
+ response.headers.merge!(new_auth_header)
6
+ render_create_success
7
+ end
@@ -0,0 +1,4 @@
1
+
2
+ it 'routes to #facebook' do
3
+ expect(post: '/api/v1/user/facebook').to route_to('api/v1/sessions#facebook', format: :json)
4
+ end
@@ -0,0 +1,5 @@
1
+ context 'when was created with facebook login' do
2
+ subject { build :user, :with_fb }
3
+ it { should_not validate_uniqueness_of(:email) }
4
+ it { should_not validate_presence_of(:email) }
5
+ end
@@ -0,0 +1,4 @@
1
+ Twilio.configure do |config|
2
+ config.account_sid = ENV['TWILIO_ACCOUNT_SID']
3
+ config.auth_token = ENV['TWILIO_ACCOUNT_TOKEN']
4
+ end
@@ -0,0 +1,21 @@
1
+ module TwilioService
2
+ extend self
3
+
4
+ def send_text_message(phone_to, message)
5
+ client = Twilio::REST::Client.new
6
+ client.messages.create(
7
+ from: ENV['TWILIO_PHONE_FROM'],
8
+ to: phone_to,
9
+ body: message
10
+ )
11
+ @logger.info { "Sent SMS to #{phone_to}." }
12
+ rescue Twilio::REST::RequestError => err
13
+ @logger.error do
14
+ "ERROR in Twilio call for sending message to number #{phone_to}. Error: #{err.message}"
15
+ end
16
+ end
17
+
18
+ def logger
19
+ @logger ||= Rails.logger
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'rs-rails-base/constants'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'rs-rails-base'
7
+ spec.version = RailsBase::VERSION
8
+ spec.authors = ['Rootstrap']
9
+ spec.email = ['info@rootstrap.com']
10
+
11
+ spec.summary = 'All you need, all you wanted... and more'
12
+ spec.description = 'Rootstrap base engine'
13
+ spec.homepage = "http://github.com/rootstrap/rails_base"
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.files += Dir.glob('lib/**/*')
20
+
21
+ spec.executables = ['rs_rails_base']
22
+ spec.require_paths = ['lib']
23
+
24
+ spec.add_dependency 'tty-file', '~> 0.4.0'
25
+ spec.add_dependency 'commander', '~> 4.4', '>= 4.4.3'
26
+ spec.add_development_dependency 'bundler', '~> 1.9', '>=1.9.5'
27
+ spec.add_development_dependency 'rake', '~> 10.0'
28
+ spec.add_development_dependency 'rspec', '~> 3.0'
29
+ end
@@ -0,0 +1,4 @@
1
+ task :code_analysis do
2
+ sh 'bundle exec rubocop lib spec bin'
3
+ sh 'bundle exec reek lib bin'
4
+ end
metadata ADDED
@@ -0,0 +1,206 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rs-rails-base
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Rootstrap
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-07-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: tty-file
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.4.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.4.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: commander
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.4'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 4.4.3
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '4.4'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 4.4.3
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.9'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 1.9.5
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '1.9'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 1.9.5
67
+ - !ruby/object:Gem::Dependency
68
+ name: rake
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '10.0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '10.0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: rspec
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '3.0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '3.0'
95
+ description: Rootstrap base engine
96
+ email:
97
+ - info@rootstrap.com
98
+ executables:
99
+ - rs_rails_base
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - ".gitignore"
104
+ - ".rspec"
105
+ - ".rubocop.yml"
106
+ - ".travis.yml"
107
+ - CODE_OF_CONDUCT.md
108
+ - Gemfile
109
+ - LICENSE.md
110
+ - README.md
111
+ - Rakefile
112
+ - bin/bundle
113
+ - bin/rails
114
+ - bin/rake
115
+ - bin/rs_rails_base
116
+ - bin/setup
117
+ - circle.yml
118
+ - config.reek
119
+ - docs/chat.md
120
+ - docs/facebook.md
121
+ - docs/twilio.md
122
+ - images/chat_flow.png
123
+ - images/chat_struct.png
124
+ - lib/rs-rails-base/cli_actions.rb
125
+ - lib/rs-rails-base/commands.rb
126
+ - lib/rs-rails-base/constants.rb
127
+ - lib/rs-rails-base/features.rb
128
+ - lib/rs-rails-base/features/chat.rb
129
+ - lib/rs-rails-base/features/facebook.rb
130
+ - lib/rs-rails-base/features/twilio.rb
131
+ - lib/rs-rails-base/file_manipulation.rb
132
+ - lib/rs-rails-base/git_actions.rb
133
+ - lib/rs-rails-base/rails_actions.rb
134
+ - lib/rs_rails_base.rb
135
+ - lib/templates/chat/channel.rb
136
+ - lib/templates/chat/chat_channel.rb
137
+ - lib/templates/chat/chat_service.rb
138
+ - lib/templates/chat/chats_controller.rb
139
+ - lib/templates/chat/connection.rb
140
+ - lib/templates/chat/jbuilder/_info.json.jbuilder
141
+ - lib/templates/chat/jbuilder/_message.json.jbuilder
142
+ - lib/templates/chat/jbuilder/index.json.jbuilder
143
+ - lib/templates/chat/jbuilder/messages_create.json.jbuilder
144
+ - lib/templates/chat/jbuilder/messages_create_info.json.jbuilder
145
+ - lib/templates/chat/jbuilder/show.json.jbuilder
146
+ - lib/templates/chat/messages_controller.rb
147
+ - lib/templates/chat/migration-models/add_chat.rb
148
+ - lib/templates/chat/migration-models/add_message.rb
149
+ - lib/templates/chat/migration-models/add_participant.rb
150
+ - lib/templates/chat/migration-models/chat.rb
151
+ - lib/templates/chat/migration-models/message.rb
152
+ - lib/templates/chat/migration-models/participant.rb
153
+ - lib/templates/chat/migration-models/user.rb
154
+ - lib/templates/chat/routes.rb
155
+ - lib/templates/chat/routes_2.rb
156
+ - lib/templates/chat/sessions_controller.rb
157
+ - lib/templates/chat/specs/chat_channel_spec.rb
158
+ - lib/templates/chat/specs/chat_factory.rb
159
+ - lib/templates/chat/specs/chat_service_spec.rb
160
+ - lib/templates/chat/specs/chat_spec.rb
161
+ - lib/templates/chat/specs/connection_spec.rb
162
+ - lib/templates/chat/specs/message_factory.rb
163
+ - lib/templates/chat/specs/message_spec.rb
164
+ - lib/templates/chat/specs/participant_factory.rb
165
+ - lib/templates/chat/specs/participant_spec.rb
166
+ - lib/templates/chat/specs/rails_helper.rb
167
+ - lib/templates/facebook/apiary.apib
168
+ - lib/templates/facebook/en.yml
169
+ - lib/templates/facebook/facebook_service.rb
170
+ - lib/templates/facebook/facebook_spec.rb
171
+ - lib/templates/facebook/factories_user.rb
172
+ - lib/templates/facebook/routes.rb
173
+ - lib/templates/facebook/sessions_controller.rb
174
+ - lib/templates/facebook/sessions_controller_2.rb
175
+ - lib/templates/facebook/sessions_routing_spec.rb
176
+ - lib/templates/facebook/user_spec.rb
177
+ - lib/templates/twilio/twilio.rb
178
+ - lib/templates/twilio/twilio_service.rb
179
+ - rs-rails-base.gemspec
180
+ - tasks/code_analysis.rake
181
+ homepage: http://github.com/rootstrap/rails_base
182
+ licenses:
183
+ - MIT
184
+ metadata: {}
185
+ post_install_message:
186
+ rdoc_options: []
187
+ require_paths:
188
+ - lib
189
+ required_ruby_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ required_rubygems_version: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ requirements: []
200
+ rubyforge_project:
201
+ rubygems_version: 2.6.13
202
+ signing_key:
203
+ specification_version: 4
204
+ summary: All you need, all you wanted... and more
205
+ test_files: []
206
+ has_rdoc: