solarsearch 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +23 -0
- data/.specification +294 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +76 -0
- data/Solarsearch.gemspec +176 -0
- data/VERSION +1 -0
- data/app/controllers/article_controller.rb +30 -0
- data/app/controllers/article_statuses_controller.rb +12 -0
- data/app/controllers/infosources_controller.rb +143 -0
- data/app/controllers/search_keywords_controller.rb +99 -0
- data/app/controllers/user_sessions_controller.rb +48 -0
- data/app/controllers/users_controller.rb +62 -0
- data/app/helpers/article_helper.rb +25 -0
- data/app/helpers/article_statuses_helper.rb +2 -0
- data/app/helpers/infosources_helper.rb +2 -0
- data/app/helpers/layout_helper.rb +22 -0
- data/app/helpers/search_keywords_helper.rb +2 -0
- data/app/helpers/site_helper.rb +2 -0
- data/app/helpers/user_sessions_helper.rb +2 -0
- data/app/helpers/users_helper.rb +2 -0
- data/app/models/article.rb +74 -0
- data/app/models/article_status.rb +20 -0
- data/app/models/infosource.rb +83 -0
- data/app/models/role.rb +2 -0
- data/app/models/roles_users.rb +2 -0
- data/app/models/search_keyword.rb +14 -0
- data/app/models/user.rb +132 -0
- data/app/models/user_mailer.rb +12 -0
- data/app/models/user_session.rb +2 -0
- data/config/locales/hu.yml +111 -0
- data/config/locales/sk.yml +111 -0
- data/init.rb +1 -0
- data/install.rb +1 -0
- data/lib/solarsearch.rb +9 -0
- data/lib/solarsearch/locales.rb +3 -0
- data/lib/solarsearch/routing.rb +31 -0
- data/rails/init.rb +1 -0
- data/solarsearch.gemspec +178 -0
- data/tasks/solarsearch_tasks.rake +4 -0
- data/test/blueprints.rb +34 -0
- data/test/blueprints/articles.rb +37 -0
- data/test/blueprints/infosources.rb +53 -0
- data/test/blueprints/infosources_files/pretty.html +17 -0
- data/test/blueprints/infosources_files/ugly.html +399 -0
- data/test/blueprints/search_keywords.rb +13 -0
- data/test/blueprints/users.rb +17 -0
- data/test/content_scrapper.rb +13 -0
- data/test/database.yml +7 -0
- data/test/functional/article_controller_test.rb +40 -0
- data/test/functional/email_controller_test.rb +9 -0
- data/test/functional/infosources_controller_test.rb +65 -0
- data/test/functional/restricted_logged_exceptions_controller_test.rb +38 -0
- data/test/functional/search_keywords_controller_test.rb +108 -0
- data/test/functional/user_sessions_controller_test.rb +39 -0
- data/test/functional/users_controller_test.rb +109 -0
- data/test/schema.rb +92 -0
- data/test/test_helper.rb +48 -0
- data/test/unit/article_test.rb +56 -0
- data/test/unit/helpers/article_helper_test.rb +20 -0
- data/test/unit/helpers/email_helper_test.rb +4 -0
- data/test/unit/helpers/user_sessions_helper_test.rb +4 -0
- data/test/unit/helpers/users_helper_test.rb +4 -0
- data/test/unit/infosource_test.rb +132 -0
- data/test/unit/role_test.rb +6 -0
- data/test/unit/roles_users_test.rb +6 -0
- data/test/unit/user_mailer_test.rb +24 -0
- data/test/unit/user_test.rb +103 -0
- data/uninstall.rb +1 -0
- metadata +297 -0
data/test/database.yml
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ArticleControllerTest < ActionController::TestCase
|
4
|
+
|
5
|
+
context "for logged in user" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
activate_authlogic
|
9
|
+
UserSession.create(@user = User.make)
|
10
|
+
end
|
11
|
+
|
12
|
+
context "on GET to show" do
|
13
|
+
setup { get :show, :id => Article.make }
|
14
|
+
should_respond_with :success
|
15
|
+
should "have article value set" do
|
16
|
+
assert_not_nil assigns(:article)
|
17
|
+
end
|
18
|
+
should_render_template :show
|
19
|
+
end
|
20
|
+
|
21
|
+
context "on GET to search" do
|
22
|
+
setup do
|
23
|
+
Sunspot.remove_all!
|
24
|
+
2.times { Article.make }
|
25
|
+
(Article::per_page + 1).times { Article.make(:accent_in_body) }
|
26
|
+
Sunspot.commit
|
27
|
+
get :search, :q => Sham.accented_word
|
28
|
+
end
|
29
|
+
should_respond_with :success
|
30
|
+
should "have articles value set" do
|
31
|
+
articles = assigns(:articles)
|
32
|
+
assert_not_nil assigns(:articles)
|
33
|
+
assert_equal 1, articles.current_page
|
34
|
+
assert_equal Article::per_page + 1, articles.total_entries
|
35
|
+
end
|
36
|
+
should_render_template :search
|
37
|
+
end
|
38
|
+
#TODO should be tested for cases when the user is not logged in
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class InfosourcesControllerTest < ActionController::TestCase
|
4
|
+
|
5
|
+
context "for logged in user" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
activate_authlogic
|
9
|
+
@user = User.make
|
10
|
+
@user.has_role!(:admin)
|
11
|
+
UserSession.create(@user)
|
12
|
+
end
|
13
|
+
|
14
|
+
context "on GET to index" do
|
15
|
+
setup { get :index }
|
16
|
+
should_respond_with :success
|
17
|
+
should "have infosources set" do
|
18
|
+
assert_not_nil assigns(:infosources)
|
19
|
+
end
|
20
|
+
should_render_template :index
|
21
|
+
end
|
22
|
+
|
23
|
+
context "on GET to new" do
|
24
|
+
setup { get :new }
|
25
|
+
should_respond_with :success
|
26
|
+
should_render_template :new
|
27
|
+
end
|
28
|
+
|
29
|
+
context "on POST to create" do
|
30
|
+
setup { post :create, :infosource => Infosource.plan }
|
31
|
+
should_change('the number of infosources', :by => 1) { Infosource.count }
|
32
|
+
should_redirect_to("the newly created infosource") { infosource_path(assigns(:infosource)) }
|
33
|
+
end
|
34
|
+
|
35
|
+
context "on POST to create invalid infosource" do
|
36
|
+
setup { post :create, :infosource => Infosource.plan(
|
37
|
+
:sourcename => 'x' * (Infosource::MIN_SOURCENAME_SIZE-1))}
|
38
|
+
should_not_change('the number of infosources') { Infosource.count }
|
39
|
+
should_render_template :new
|
40
|
+
end
|
41
|
+
|
42
|
+
context "on GET to show" do
|
43
|
+
setup { get :show, :id => Infosource.make }
|
44
|
+
should_respond_with :success
|
45
|
+
end
|
46
|
+
|
47
|
+
context "on GET to edit" do
|
48
|
+
setup { get :edit, :id => Infosource.make }
|
49
|
+
should_respond_with :success
|
50
|
+
end
|
51
|
+
|
52
|
+
context "on PUT to update" do
|
53
|
+
setup { put :update, :id => Infosource.make, :infosource => Infosource.plan }
|
54
|
+
should_redirect_to("the updated infosource") { infosource_path(assigns(:infosource)) }
|
55
|
+
end
|
56
|
+
|
57
|
+
context "on DELETE after destroy action" do
|
58
|
+
setup { delete :destroy, :id => (@infosource = Infosource.make) }
|
59
|
+
should "not find the destroyed infosource" do
|
60
|
+
assert !Infosource.exists?(@infosource)
|
61
|
+
end
|
62
|
+
should_redirect_to("the list of infosources") { infosources_path }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
class LoggedExceptionsControllerTest < ActionController::TestCase
|
5
|
+
|
6
|
+
#FIXME test the tests for the LoggedExceptionsControlledTest
|
7
|
+
=begin
|
8
|
+
context "for not-admin user" do
|
9
|
+
|
10
|
+
setup do
|
11
|
+
activate_authlogic
|
12
|
+
UserSession.create(@user = User.make)
|
13
|
+
end
|
14
|
+
|
15
|
+
context "to show logged exception" do
|
16
|
+
setup { get :index }
|
17
|
+
should_respond_with :redirect
|
18
|
+
should_redirect_to('the default page') { root_url }
|
19
|
+
#should_set_the_flash_to /prístup/
|
20
|
+
end
|
21
|
+
end
|
22
|
+
=end
|
23
|
+
context "for admin user" do
|
24
|
+
|
25
|
+
setup do
|
26
|
+
activate_authlogic
|
27
|
+
@user = User.make
|
28
|
+
@user.has_role!(:admin)
|
29
|
+
UserSession.create(@user)
|
30
|
+
end
|
31
|
+
|
32
|
+
context "to show logged exception" do
|
33
|
+
setup { get :index }
|
34
|
+
should_respond_with :success
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SearchKeywordsControllerTest < ActionController::TestCase
|
4
|
+
|
5
|
+
context "authenticated" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
activate_authlogic
|
9
|
+
@user = User.make
|
10
|
+
@user_searchkeyword = SearchKeyword.make(:user => @user)
|
11
|
+
end
|
12
|
+
|
13
|
+
context "with non-admin access" do
|
14
|
+
|
15
|
+
setup { UserSession.create(@user) }
|
16
|
+
|
17
|
+
context "on GET to index action" do
|
18
|
+
setup { get :index }
|
19
|
+
should_render_template :index
|
20
|
+
should("render the search keywords") do
|
21
|
+
assert_match(@user_searchkeyword.query, @response.body)
|
22
|
+
end
|
23
|
+
should_not_set_the_flash
|
24
|
+
end
|
25
|
+
|
26
|
+
context "on unathorized GET to index action for a different user" do
|
27
|
+
setup { get :index, :user_id => User.make.username }
|
28
|
+
should("render the search keywords of the logged in user") do
|
29
|
+
assert_match(@user_searchkeyword.query, @response.body)
|
30
|
+
end
|
31
|
+
should_set_the_flash_to I18n.t(:access_denied_flash)
|
32
|
+
end
|
33
|
+
|
34
|
+
context "on GET to new action" do
|
35
|
+
setup { get :new }
|
36
|
+
should_render_template :new
|
37
|
+
end
|
38
|
+
|
39
|
+
context "on POST to valid search keyword creation should redirect to show keywords view" do
|
40
|
+
setup { post :create, :search_keyword => @search_keyword = SearchKeyword.plan }
|
41
|
+
should_redirect_to("the created search keyword show view") { search_keyword_url(assigns(:search_keyword)) }
|
42
|
+
should "the created search keyword exist" do
|
43
|
+
assert_not_nil SearchKeyword.find_by_query(@search_keyword[:query])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "on POST to create action with invalid inputs" do
|
48
|
+
setup { post :create, :search_keyword => SearchKeyword.plan(:query => '') }
|
49
|
+
should_render_template :new
|
50
|
+
end
|
51
|
+
|
52
|
+
context "for an existing search keyword" do
|
53
|
+
setup { @search_keyword = SearchKeyword.make(:user => @user) }
|
54
|
+
|
55
|
+
context "on GET to edit action" do
|
56
|
+
setup { get :edit, :id => @search_keyword }
|
57
|
+
should_render_template :edit
|
58
|
+
end
|
59
|
+
|
60
|
+
context "on PUT to update action when model is valid" do
|
61
|
+
setup {
|
62
|
+
put :update, :id => @search_keyword.id,
|
63
|
+
:search_keyword => @search_keyword.attributes.merge('query' => (@new_query = Sham.query) ) }
|
64
|
+
should_redirect_to("search keywords show view") { search_keyword_url(assigns(:search_keyword)) }
|
65
|
+
should "the changed keyword become changed" do
|
66
|
+
assert_equal @new_query, SearchKeyword.find(@search_keyword).query
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "on PUT to update action when model is invalid" do
|
71
|
+
setup { put :update, :id => @search_keyword.id,
|
72
|
+
:search_keyword => @search_keyword.attributes.merge('query' => '') }
|
73
|
+
should_render_template :edit
|
74
|
+
end
|
75
|
+
|
76
|
+
context "on GET to show action" do
|
77
|
+
setup { get :show, :id => @search_keyword }
|
78
|
+
should_render_template :show
|
79
|
+
end
|
80
|
+
|
81
|
+
context "on DELETE to destroy action" do
|
82
|
+
setup { delete :destroy, :id => @search_keyword }
|
83
|
+
should_redirect_to("keywords index page") { search_keywords_url }
|
84
|
+
should "the deleted search keyword by removed from the database" do
|
85
|
+
assert !SearchKeyword.exists?(@search_keyword.id)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "with administrative access" do
|
92
|
+
setup do
|
93
|
+
@adminuser = User.make
|
94
|
+
@adminuser.has_role!(:admin)
|
95
|
+
UserSession.create(@adminuser)
|
96
|
+
end
|
97
|
+
|
98
|
+
context "on GET to show action for any user" do
|
99
|
+
setup { get :index, :user_id => @user.username }
|
100
|
+
should "see the other user's search keyword listed" do
|
101
|
+
assert_match(@user_searchkeyword.query, @response.body)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
#FIXME tests for unauthorized access should follow
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class UserSessionsControllerTest < ActionController::TestCase
|
4
|
+
context "on GET for login screen" do
|
5
|
+
setup do
|
6
|
+
get :new
|
7
|
+
end
|
8
|
+
should_render_template :new
|
9
|
+
end
|
10
|
+
|
11
|
+
context "authentication" do
|
12
|
+
|
13
|
+
setup do
|
14
|
+
activate_authlogic
|
15
|
+
@user = User.make
|
16
|
+
end
|
17
|
+
|
18
|
+
context "on GET for login by username" do
|
19
|
+
setup do
|
20
|
+
get :create, :user_session => { :username => @user.username, :password => @user.password }
|
21
|
+
end
|
22
|
+
should_set_the_flash_to I18n.t(:login_successful_flash)
|
23
|
+
end
|
24
|
+
|
25
|
+
context "on GET for login by email address" do
|
26
|
+
setup do
|
27
|
+
get :create, :user_session => { :username => @user.email, :password => @user.password }
|
28
|
+
end
|
29
|
+
should_set_the_flash_to I18n.t(:login_successful_flash)
|
30
|
+
end
|
31
|
+
|
32
|
+
context "on GET for login by email address not responding to any user" do
|
33
|
+
setup do
|
34
|
+
get :create, :user_session => { :username => @user.email, :password => '@@' }
|
35
|
+
end
|
36
|
+
should_render_template :new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class UsersControllerTest < ActionController::TestCase
|
4
|
+
|
5
|
+
#TODO I dont trust to this get, put way of testing, should use webrat or alike instead OR UNDERSTAND how get,put, post work!!
|
6
|
+
#TODO find out how to ask for can_do_somebody_somethigs with acl9 or anything else
|
7
|
+
|
8
|
+
=begin
|
9
|
+
context "on GET for user registration" do
|
10
|
+
setup { get :create, :user => User.plan }
|
11
|
+
should_set_the_flash_to I18n.t(:login_please_flash)
|
12
|
+
end
|
13
|
+
|
14
|
+
context "on GET for user edition" do
|
15
|
+
setup { get :edit, :id => User.make.username }
|
16
|
+
should_set_the_flash_to I18n.t(:login_please_flash)
|
17
|
+
end
|
18
|
+
|
19
|
+
context "authorization" do
|
20
|
+
setup do
|
21
|
+
activate_authlogic
|
22
|
+
@users = Array.new
|
23
|
+
(0..1).each { |i| @users[i] = User.make }
|
24
|
+
end
|
25
|
+
|
26
|
+
context "for admin" do
|
27
|
+
setup do
|
28
|
+
@adminuser = User.make
|
29
|
+
@adminuser.has_role!(:admin)
|
30
|
+
UserSession.create(@adminuser)
|
31
|
+
end
|
32
|
+
|
33
|
+
context "on GET action for listing the existing users" do
|
34
|
+
setup { get :index }
|
35
|
+
should "list users" do
|
36
|
+
assert_match(@users[0].username, @response.body)
|
37
|
+
end
|
38
|
+
should_not_set_the_flash
|
39
|
+
end
|
40
|
+
|
41
|
+
context "on GET action for editing other users" do
|
42
|
+
setup { get :edit, :id => @users[0].username }
|
43
|
+
should_not_set_the_flash
|
44
|
+
should "show form for the user" do
|
45
|
+
assert_match(@users[0].username, @response.body)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "on PUT action for updating other users" do
|
50
|
+
setup do
|
51
|
+
put :update, 'id' => { :email => (@changed_email = Sham.email)}
|
52
|
+
end
|
53
|
+
should_set_the_flash_to I18n.t(:profil_change_success_flash)
|
54
|
+
should "change the user attributes" do
|
55
|
+
changed_user = User.find_by_username(@users[0].username)
|
56
|
+
assert_equal(@changed_email, changed_user.email )
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "on GET for user registration" do
|
61
|
+
setup { get :create, :user => (@user_plan = User.plan) }
|
62
|
+
should_set_the_flash_to I18n.t(:registration_successful_flash)
|
63
|
+
should 'have created the new user' do
|
64
|
+
assert_not_nil User.find_by_username(@user_plan[:username])
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "for non-admin" do
|
70
|
+
setup do
|
71
|
+
UserSession.create(@users[0])
|
72
|
+
end
|
73
|
+
|
74
|
+
context "on GET action for listing the existing users" do
|
75
|
+
setup { get :index }
|
76
|
+
should_set_the_flash_to I18n.t(:access_denied_flash)
|
77
|
+
end
|
78
|
+
|
79
|
+
context "on GET action for editing other user" do
|
80
|
+
setup { get :edit, :id => @users[1].username }
|
81
|
+
should_set_the_flash_to I18n.t(:access_denied_flash)
|
82
|
+
should "show form for the logged in user" do
|
83
|
+
assert_match(@users[0].username, @response.body)
|
84
|
+
assert_no_match(Regexp.new(@users[1].username), @response.body)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "on PUT action for updating other users" do
|
89
|
+
setup { put :update,
|
90
|
+
:user => @users[1].attributes.merge('email' => (@changed_email = Sham.email)) }
|
91
|
+
should_set_the_flash_to I18n.t(:access_denied_flash)
|
92
|
+
should "not change the user attributes" do
|
93
|
+
changed_user = User.find_by_username(@users[1].username)
|
94
|
+
assert_not_equal(@changed_email, changed_user.email )
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "on PUT action for updating the own profile" do
|
99
|
+
setup { put :update,
|
100
|
+
'id' => @users[0].attributes.merge('email' => (@changed_email = Sham.email)) }
|
101
|
+
should_set_the_flash_to I18n.t(:profil_change_success_flash)
|
102
|
+
should "change the user's own attributes" do
|
103
|
+
assert_equal(@changed_email, User.find(@users[0].id).email )
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
=end
|
109
|
+
end
|
data/test/schema.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# This file is auto-generated from the current state of the database. Instead of editing this file,
|
2
|
+
# please use the migrations feature of Active Record to incrementally modify your database, and
|
3
|
+
# then regenerate this schema definition.
|
4
|
+
#
|
5
|
+
# Note that this schema.rb definition is the authoritative source for your database schema. If you need
|
6
|
+
# to create the application database on another system, you should be using db:schema:load, not running
|
7
|
+
# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
8
|
+
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
9
|
+
#
|
10
|
+
# It's strongly recommended to check this file into your version control system.
|
11
|
+
|
12
|
+
ActiveRecord::Schema.define(:version => 20091127111337) do
|
13
|
+
|
14
|
+
create_table "article_statuses", :force => true do |t|
|
15
|
+
t.integer "article_id"
|
16
|
+
t.integer "user_id"
|
17
|
+
t.integer "status"
|
18
|
+
t.datetime "created_at"
|
19
|
+
t.datetime "updated_at"
|
20
|
+
end
|
21
|
+
|
22
|
+
create_table "articles", :force => true do |t|
|
23
|
+
t.integer "infosource_id"
|
24
|
+
t.string "author"
|
25
|
+
t.text "title"
|
26
|
+
t.text "summary"
|
27
|
+
t.text "body"
|
28
|
+
t.string "url"
|
29
|
+
t.date "published_at"
|
30
|
+
t.string "guid"
|
31
|
+
t.datetime "created_at"
|
32
|
+
t.datetime "updated_at"
|
33
|
+
end
|
34
|
+
|
35
|
+
create_table "infosources", :force => true do |t|
|
36
|
+
t.string "sourcename"
|
37
|
+
t.string "sourcefeed"
|
38
|
+
t.datetime "created_at"
|
39
|
+
t.datetime "updated_at"
|
40
|
+
end
|
41
|
+
|
42
|
+
create_table "logged_exceptions", :force => true do |t|
|
43
|
+
t.string "exception_class"
|
44
|
+
t.string "controller_name"
|
45
|
+
t.string "action_name"
|
46
|
+
t.text "message"
|
47
|
+
t.text "backtrace"
|
48
|
+
t.text "environment"
|
49
|
+
t.text "request"
|
50
|
+
t.datetime "created_at"
|
51
|
+
end
|
52
|
+
|
53
|
+
create_table "roles", :force => true do |t|
|
54
|
+
t.string "name", :limit => 40
|
55
|
+
t.string "authorizable_type", :limit => 40
|
56
|
+
t.integer "authorizable_id"
|
57
|
+
t.datetime "created_at"
|
58
|
+
t.datetime "updated_at"
|
59
|
+
end
|
60
|
+
|
61
|
+
add_index "roles", ["authorizable_id"], :name => "index_roles_on_authorizable_id"
|
62
|
+
add_index "roles", ["authorizable_type"], :name => "index_roles_on_authorizable_type"
|
63
|
+
add_index "roles", ["name", "authorizable_id", "authorizable_type"], :name => "index_roles_on_name_and_authorizable_id_and_authorizable_type", :unique => true
|
64
|
+
add_index "roles", ["name"], :name => "index_roles_on_name"
|
65
|
+
|
66
|
+
create_table "roles_users", :id => false, :force => true do |t|
|
67
|
+
t.integer "user_id"
|
68
|
+
t.integer "role_id"
|
69
|
+
t.datetime "created_at"
|
70
|
+
t.datetime "updated_at"
|
71
|
+
end
|
72
|
+
|
73
|
+
add_index "roles_users", ["role_id"], :name => "index_roles_users_on_role_id"
|
74
|
+
add_index "roles_users", ["user_id", "role_id"], :name => "index_roles_users_on_user_id_and_role_id", :unique => true
|
75
|
+
add_index "roles_users", ["user_id"], :name => "index_roles_users_on_user_id"
|
76
|
+
|
77
|
+
create_table "search_keywords", :force => true do |t|
|
78
|
+
t.integer "user_id"
|
79
|
+
t.string "query"
|
80
|
+
t.datetime "created_at"
|
81
|
+
t.datetime "updated_at"
|
82
|
+
end
|
83
|
+
|
84
|
+
create_table "users", :force => true do |t|
|
85
|
+
t.string "username"
|
86
|
+
t.string "email"
|
87
|
+
t.string "crypted_password"
|
88
|
+
t.string "password_salt"
|
89
|
+
t.string "persistence_token"
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|