pose 3.0.0 → 3.1.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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +42 -19
  3. data/Rakefile +37 -5
  4. data/lib/pose/activerecord_base_additions.rb +7 -6
  5. data/{app/models → lib}/pose/assignment.rb +6 -1
  6. data/lib/pose/jobs/install.rb +27 -0
  7. data/lib/pose/jobs/reindex_all.rb +34 -0
  8. data/lib/pose/jobs/remove.rb +28 -0
  9. data/lib/pose/jobs/uninstall.rb +19 -0
  10. data/lib/pose/jobs/vacuum.rb +23 -0
  11. data/lib/pose/model_class_additions.rb +32 -14
  12. data/lib/pose/query.rb +49 -9
  13. data/lib/pose/search.rb +5 -5
  14. data/lib/pose/static_api.rb +21 -3
  15. data/lib/pose/version.rb +1 -1
  16. data/lib/pose/word.rb +33 -0
  17. data/lib/pose.rb +11 -5
  18. data/lib/tasks/pose_tasks.rake +16 -27
  19. data/spec/{dummy/db/development.sqlite3 → db/pose.sqlite3} +0 -0
  20. data/spec/factories/posable_one.rb +2 -0
  21. data/spec/factories/posable_three.rb +8 -0
  22. data/spec/factories/posable_two.rb +2 -0
  23. data/spec/factories/user.rb +2 -0
  24. data/spec/lib/pose/activerecord_base_additions_spec.rb +11 -0
  25. data/spec/{models → lib/pose}/assignment_spec.rb +5 -5
  26. data/spec/lib/pose/jobs/reindex_all_spec.rb +31 -0
  27. data/spec/lib/pose/jobs/remove_spec.rb +20 -0
  28. data/spec/lib/pose/model_class_additions_spec.rb +150 -0
  29. data/spec/lib/pose/query_spec.rb +106 -8
  30. data/spec/lib/pose/search_spec.rb +2 -22
  31. data/spec/lib/pose/word_spec.rb +68 -0
  32. data/spec/pose_api_spec.rb +33 -13
  33. data/spec/spec_helper.rb +4 -32
  34. data/spec/support/config/database.yml +51 -0
  35. data/spec/support/config/database.yml.example +16 -0
  36. data/spec/{dummy/db/migrate → support/migrations}/20130308054001_create_posable_one.rb +0 -0
  37. data/spec/{dummy/db/migrate → support/migrations}/20130308054142_create_posable_two.rb +0 -0
  38. data/spec/support/migrations/20130308054143_create_posable_three.rb +9 -0
  39. data/spec/{dummy/db/migrate → support/migrations}/20130708084009_create_users.rb +0 -0
  40. data/spec/support/migrations/20130808084009_setup_pose_specs.rb +5 -0
  41. data/spec/{dummy/app → support}/models/posable_one.rb +1 -1
  42. data/spec/support/models/posable_three.rb +10 -0
  43. data/spec/{dummy/app → support}/models/posable_two.rb +1 -1
  44. data/spec/{dummy/app → support}/models/user.rb +1 -1
  45. data/spec/support/spec_manager.rb +105 -0
  46. metadata +70 -101
  47. data/app/models/pose/word.rb +0 -22
  48. data/db/migrate/20130308144915_pose_install.rb +0 -18
  49. data/lib/generators/pose/install/install_generator.rb +0 -56
  50. data/lib/generators/pose/install/templates/install_migration.rb +0 -24
  51. data/lib/generators/pose/remove/remove_generator.rb +0 -56
  52. data/lib/generators/pose/remove/templates/remove_migration.rb +0 -23
  53. data/lib/generators/pose/upgrade/templates/upgrade_migration.rb +0 -7
  54. data/lib/generators/pose/upgrade/upgrade_generator.rb +0 -35
  55. data/lib/pose/engine.rb +0 -5
  56. data/lib/pose/helpers.rb +0 -89
  57. data/lib/pose/railtie.rb +0 -19
  58. data/spec/dummy/Rakefile +0 -7
  59. data/spec/dummy/config/application.rb +0 -23
  60. data/spec/dummy/config/boot.rb +0 -10
  61. data/spec/dummy/config/database.yml +0 -25
  62. data/spec/dummy/config/environment.rb +0 -5
  63. data/spec/dummy/config/environments/development.rb +0 -30
  64. data/spec/dummy/config/environments/production.rb +0 -81
  65. data/spec/dummy/config/environments/test.rb +0 -37
  66. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  67. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  68. data/spec/dummy/config/initializers/inflections.rb +0 -15
  69. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  70. data/spec/dummy/config/initializers/secret_token.rb +0 -7
  71. data/spec/dummy/config/initializers/session_store.rb +0 -8
  72. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  73. data/spec/dummy/config/locales/en.yml +0 -5
  74. data/spec/dummy/config/routes.rb +0 -2
  75. data/spec/dummy/config.ru +0 -4
  76. data/spec/dummy/db/schema.rb +0 -47
  77. data/spec/dummy/db/test.sqlite3 +0 -0
  78. data/spec/dummy/log/development.log +0 -309
  79. data/spec/dummy/log/test.log +0 -88518
  80. data/spec/dummy/script/rails +0 -6
  81. data/spec/lib/pose/helpers_spec.rb +0 -147
  82. data/spec/models/word_spec.rb +0 -42
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ module Pose
4
+ describe Word do
5
+
6
+ describe "::factory" do
7
+
8
+ context 'given a non-existing word' do
9
+ it 'creates the word in the database' do
10
+ expect(Word).to have(0).instances
11
+ Word.factory ['one']
12
+ expect(Word.pluck :text).to eql %w[ one ]
13
+ end
14
+ end
15
+
16
+ context 'existing word' do
17
+ before do
18
+ Word.create text: 'one'
19
+ @words = Word.factory ['one']
20
+ end
21
+
22
+ it 'returns the word' do
23
+ expect(@words.map &:text).to eql %w[one]
24
+ end
25
+
26
+ it 'does not create a new Word in the database' do
27
+ expect(Word).to have(1).instance
28
+ end
29
+ end
30
+ end
31
+
32
+
33
+ describe 'class methods' do
34
+
35
+ shared_examples 'cleans unused words' do
36
+ it 'removes unused words' do
37
+ create :word
38
+ Word.remove_unused_words
39
+ expect(Word.count).to eql 0
40
+ end
41
+
42
+ it 'does not remove used words' do
43
+ create :posable_one
44
+ Word.remove_unused_words
45
+ expect(Word.count).to be > 0
46
+ end
47
+ end
48
+
49
+ context 'with a SQL database' do
50
+ before :each do
51
+ # TODO: do not mock class method
52
+ Pose.should_receive(:has_sql_connection?).and_return(true)
53
+ end
54
+
55
+ it_should_behave_like 'cleans unused words'
56
+ end
57
+
58
+ context 'without a SQL database' do
59
+ before :each do
60
+ # TODO: do not mock class method
61
+ Pose.should_receive(:has_sql_connection?).and_return(false)
62
+ end
63
+
64
+ it_should_behave_like 'cleans unused words'
65
+ end
66
+ end
67
+ end
68
+ end
@@ -143,9 +143,9 @@ module Pose
143
143
  describe "'limit' parameter" do
144
144
 
145
145
  before :each do
146
- @pos1 = FactoryGirl.create :posable_one, text: 'foo', private: true
147
- @pos2 = FactoryGirl.create :posable_one, text: 'foo', private: true
148
- @pos3 = FactoryGirl.create :posable_one, text: 'foo', private: false
146
+ @pos1 = create :posable_one, text: 'foo', private: true
147
+ @pos2 = create :posable_one, text: 'foo', private: true
148
+ @pos3 = create :posable_one, text: 'foo', private: false
149
149
  end
150
150
 
151
151
  context 'with ids and no scope' do
@@ -193,7 +193,7 @@ module Pose
193
193
  describe "'result_type' parameter" do
194
194
 
195
195
  before :each do
196
- @foo_one = FactoryGirl.create :posable_one, text: 'foo one'
196
+ @foo_one = create :posable_one, text: 'foo one'
197
197
  end
198
198
 
199
199
  describe 'default behavior' do
@@ -215,9 +215,9 @@ module Pose
215
215
  describe "'where' parameter" do
216
216
 
217
217
  before :each do
218
- @one = FactoryGirl.create :posable_one, text: 'foo one', private: true
219
- @bar = FactoryGirl.create :posable_one, text: 'bar one', private: true
220
- @two = FactoryGirl.create :posable_one, text: 'foo two', private: false
218
+ @one = create :posable_one, text: 'foo one', private: true
219
+ @bar = create :posable_one, text: 'bar one', private: true
220
+ @two = create :posable_one, text: 'foo two', private: false
221
221
  end
222
222
 
223
223
  context 'with result type :classes' do
@@ -241,7 +241,7 @@ module Pose
241
241
  end
242
242
 
243
243
  it 'allows to combine several conditions' do
244
- three = FactoryGirl.create :posable_one, text: 'foo two', private: true
244
+ three = create :posable_one, text: 'foo two', private: true
245
245
  result = Pose.search 'foo',
246
246
  PosableOne,
247
247
  joins: PosableOne,
@@ -269,10 +269,10 @@ module Pose
269
269
  describe ':joins parameter' do
270
270
 
271
271
  before :each do
272
- @user_1 = FactoryGirl.create :user, name: 'Jeff'
273
- @user_2 = FactoryGirl.create :user, name: 'Jim'
274
- @one = FactoryGirl.create :posable_one, text: 'snippet one', user: @user_1
275
- @two = FactoryGirl.create :posable_one, text: 'snippet two', user: @user_2
272
+ @user_1 = create :user, name: 'Jeff'
273
+ @user_2 = create :user, name: 'Jim'
274
+ @one = create :posable_one, text: 'snippet one', user: @user_1
275
+ @two = create :posable_one, text: 'snippet two', user: @user_2
276
276
  end
277
277
 
278
278
  it 'allows to use joined tables for queries' do
@@ -280,7 +280,7 @@ module Pose
280
280
  PosableOne,
281
281
  { joins: [ PosableOne,
282
282
  "INNER JOIN users on posable_ones.user_id=users.id" ],
283
- where: ["users.name == 'Jeff'"] }
283
+ where: ["users.name = 'Jeff'"] }
284
284
  expect(result[PosableOne].map(&:text)).to eql ['snippet one']
285
285
  end
286
286
 
@@ -320,5 +320,25 @@ module Pose
320
320
  expect(result).to be_empty
321
321
  end
322
322
  end
323
+
324
+ describe "::has_sql_connection?" do
325
+
326
+ it 'recognizes mysql databases' do
327
+ ActiveRecord::Base.connection.class.stub(:name).and_return 'ActiveRecord::ConnectionAdapters::Mysql2Adapter'
328
+ expect(Pose.has_sql_connection?).to be_true
329
+ ActiveRecord::Base.connection.class.stub(:name).and_return 'ActiveRecord::ConnectionAdapters::MysqlAdapter'
330
+ expect(Pose.has_sql_connection?).to be_true
331
+ end
332
+
333
+ it 'recognizes postgres databases' do
334
+ ActiveRecord::Base.connection.class.stub(:name).and_return 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter'
335
+ expect(Pose.has_sql_connection?).to be_true
336
+ end
337
+
338
+ it 'recognizes sqlite3 databases' do
339
+ ActiveRecord::Base.connection.class.stub(:name).and_return 'ActiveRecord::ConnectionAdapters::SQLite3Adapter'
340
+ expect(Pose.has_sql_connection?).to be_true
341
+ end
342
+ end
323
343
  end
324
344
  end
data/spec/spec_helper.rb CHANGED
@@ -3,42 +3,14 @@ if ENV['COVERALLS_CONFIG'] != 'nocoveralls'
3
3
  Coveralls.wear!
4
4
  end
5
5
 
6
- # This file is copied to spec/ when you run 'rails generate rspec:install'
7
- ENV["RAILS_ENV"] ||= 'test'
8
- require File.expand_path("../dummy/config/environment.rb", __FILE__)
9
- require 'rspec/rails'
10
- require 'rspec/autorun'
11
- require 'factory_girl_rails'
6
+ require 'factory_girl'
12
7
  require 'faker'
8
+ require 'pose'
13
9
 
14
- # Requires supporting ruby files with custom matchers and macros, etc,
15
- # in spec/support/ and its subdirectories.
10
+ Dir["#{File.dirname __FILE__}/factories/**/*.rb"].each {|f| require f}
16
11
  Dir["#{File.dirname __FILE__}/support/**/*.rb"].each {|f| require f}
17
12
 
18
13
  RSpec.configure do |config|
19
- # ## Mock Framework
20
- #
21
- # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
22
- #
23
- # config.mock_with :mocha
24
- # config.mock_with :flexmock
25
- # config.mock_with :rr
26
-
27
- # If you're not using ActiveRecord, or you'd prefer not to run each of your
28
- # examples within a transaction, remove the following line or assign false
29
- # instead of true.
30
- config.use_transactional_fixtures = true
31
-
32
- # If true, the base class of anonymous controllers will be inferred
33
- # automatically. This will be the default behavior in future versions of
34
- # rspec-rails.
35
- config.infer_base_class_for_anonymous_controllers = false
36
-
37
- # Run specs in random order to surface order dependencies. If you find an
38
- # order dependency and want to debug it, you can fix the order by providing
39
- # the seed, which is printed after each run.
40
- # --seed 1234
41
- config.order = "random"
42
-
43
14
  config.include FactoryGirl::Syntax::Methods
15
+ SpecManager.manage(config, ENV['POSE_ENV'])
44
16
  end
@@ -0,0 +1,51 @@
1
+ default: &default
2
+ adapter: sqlite3
3
+ database: spec/db/pose.sqlite3
4
+ pool: 5
5
+ timeout: 5000
6
+
7
+ mysql2:
8
+ adapter: mysql2
9
+ encoding: utf8
10
+ database: pose
11
+ min_messages: WARNING
12
+
13
+ mysql:
14
+ adapter: mysql
15
+ encoding: utf8
16
+ database: pose
17
+ min_messages: WARNING
18
+
19
+ postgres:
20
+ adapter: postgresql
21
+ encoding: utf8
22
+ database: pose
23
+ min_messages: WARNING
24
+
25
+ sqlite:
26
+ <<: *default
27
+
28
+ mysql2_ci:
29
+ adapter: mysql2
30
+ encoding: utf8
31
+ database: pose
32
+ username: travis
33
+ min_messages: WARNING
34
+
35
+ mysql_ci:
36
+ adapter: mysql
37
+ encoding: utf8
38
+ database: pose
39
+ username: travis
40
+ min_messages: WARNING
41
+
42
+ postgres_ci:
43
+ adapter: postgresql
44
+ encoding: utf8
45
+ database: pose
46
+ min_messages: WARNING
47
+
48
+ sqlite_ci:
49
+ adapter: sqlite3
50
+ database: ":memory:"
51
+ timeout: 500
@@ -0,0 +1,16 @@
1
+ default: &default
2
+ adapter: sqlite3
3
+ database: spec/db/pose.sqlite3
4
+ pool: 5
5
+ timeout: 5000
6
+
7
+ postgres:
8
+ adapter: postgresql
9
+ encoding: utf8
10
+ database: pose
11
+ username: pose
12
+ password: pose
13
+ min_messages: WARNING
14
+
15
+ sqlite:
16
+ <<: *default
@@ -0,0 +1,9 @@
1
+ class CreatePosableThree < ActiveRecord::Migration
2
+ def change
3
+ create_table :posable_threes do |t|
4
+ t.string :text_1
5
+ t.string :text_2
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,5 @@
1
+ class SetupPoseSpecs < ActiveRecord::Migration
2
+ def change
3
+ Pose::Jobs::Install.new.perform
4
+ end
5
+ end
@@ -2,4 +2,4 @@ class PosableOne < ActiveRecord::Base
2
2
  belongs_to :user
3
3
 
4
4
  posify { text }
5
- end
5
+ end
@@ -0,0 +1,10 @@
1
+ class PosableThree < ActiveRecord::Base
2
+ posify :text_1, :text_2, :generate_custom_text do
3
+ "|from pose block|"
4
+ end
5
+
6
+ # @return [String]
7
+ def generate_custom_text
8
+ "|custom text|"
9
+ end
10
+ end
@@ -2,4 +2,4 @@ class PosableTwo < ActiveRecord::Base
2
2
  belongs_to :user
3
3
 
4
4
  posify { text }
5
- end
5
+ end
@@ -1,4 +1,4 @@
1
1
  class User < ActiveRecord::Base
2
2
  has_many :posable_one
3
3
  has_many :posable_two
4
- end
4
+ end
@@ -0,0 +1,105 @@
1
+ require 'database_cleaner'
2
+ require 'yaml'
3
+
4
+
5
+ class SpecManager
6
+ attr_reader :env
7
+
8
+ # @param [String, Symbol] env
9
+ def initialize(env = 'default')
10
+ @env = env.to_s
11
+ end
12
+
13
+ # @param [Rspec::Config] config
14
+ # @param [String, Symbol] env
15
+ def self.manage(config, env)
16
+ env ||= 'default'
17
+
18
+ config.order = "random"
19
+
20
+ config.include FactoryGirl::Syntax::Methods
21
+
22
+ config.before(:each) do
23
+ DatabaseCleaner.start
24
+ end
25
+
26
+ config.after(:each) do
27
+ DatabaseCleaner.clean
28
+ end
29
+
30
+ spec_manager = self.new(env)
31
+
32
+ config.before(:suite) do
33
+ spec_manager.init!
34
+ end
35
+
36
+ config.after(:suite) do
37
+ spec_manager.drop_database
38
+ end
39
+ end
40
+
41
+ # @return [String]
42
+ def db_adapter
43
+ database_config['adapter']
44
+ end
45
+
46
+ def init!
47
+ database_config or raise 'Wrong database configuration, please specify spec/support/config/database.yml'
48
+ puts "Running specs with #{db_adapter}."
49
+ create_database
50
+ establish_db_connection
51
+ migrate_database
52
+ apply_cleaner_strategy
53
+ end
54
+
55
+ def db_connection
56
+ ActiveRecord::Base.connection
57
+ end
58
+
59
+ def create_database
60
+ establish_service_connection
61
+ db_connection.create_database(database_config['database']) if db_connection.respond_to?(:create_database)
62
+ end
63
+
64
+ def drop_database
65
+ establish_service_connection
66
+ db_connection.drop_database(database_config['database']) if db_connection.respond_to?(:drop_database)
67
+ end
68
+
69
+ # @return [Hash]
70
+ def database_config
71
+ @database_config ||= YAML.load_file('spec/support/config/database.yml')[env]
72
+ end
73
+
74
+
75
+ private
76
+
77
+ def apply_cleaner_strategy
78
+ case db_adapter
79
+ when 'postgresql', 'mysql', 'mysql2'
80
+ DatabaseCleaner.strategy = :transaction
81
+ DatabaseCleaner.clean_with(:truncation)
82
+ end
83
+ end
84
+
85
+ def establish_db_connection
86
+ ActiveRecord::Base.establish_connection(database_config)
87
+ end
88
+
89
+ # @param [Integer, nil] version
90
+ def migrate_database version = nil
91
+ ActiveRecord::Migrator.migrate "spec/support/migrations", version.try(:to_i)
92
+ end
93
+
94
+ def establish_service_connection
95
+ case db_adapter
96
+ when 'mysql', 'mysql2'
97
+ ActiveRecord::Base.establish_connection(database_config.merge('database' => nil))
98
+ when 'postgresql'
99
+ ActiveRecord::Base.establish_connection(database_config.merge('database' => 'postgres',
100
+ 'schema_search_path' => 'public'))
101
+ when 'sqlite3'
102
+ ActiveRecord::Base.establish_connection(database_config)
103
+ end
104
+ end
105
+ end