capistrano-chewy 0.1.0 → 0.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36801dffebe67a59da0de98084f1c2775d47371f
4
- data.tar.gz: 50afbaef407413dd996110e7dc946690b8f63af9
3
+ metadata.gz: cc03aaa995d6e19dcf3628db3ee4ebe0ded4e093
4
+ data.tar.gz: 6d4d0d9068d11e6c3b2443fdf8f3cdeec181ef75
5
5
  SHA512:
6
- metadata.gz: ee2759d696d557a1e858347dbc4c854b4d705de2447d31145c205e1ba7486cd2ff945839e461a1825254a88d6667850f46b1481d1e9bd5f85f02b15856574987
7
- data.tar.gz: edf506dd5325071b2b06c28a3f9cac42d16bfea928029472117319da29551e8dda7b8c417ea5dc6ba41c16bf0450f0e866c6a88c8891d651cb1e73aa0a878971
6
+ metadata.gz: 66e508f1ee8d0c208bb70be8ab31bfadb579c01a7f4c1c8500beeb10e4d7ab8c073ce37afab9f453ca24555866ef6f360b4bedc2ff6e6197dc8cbc4742ec81b4
7
+ data.tar.gz: dba7535113a333ad4b302cf41bd3e0e719976de73e4bcba9d63e49c94615afabfd0da9b2cbfca0094f0d47222fd72b05b515a0170b490ae02919f21c2a3d87ac
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Manage and continuously rebuild your ElasticSearch indexes with [Chewy](https://github.com/toptal/chewy/) and [Capistrano](https://github.com/capistrano/capistrano) v3.
6
6
 
7
- `Capistrano::Chewy` gem adds automatic conditionally reset only modified Chewy indexes to your deploy flow so you do not have to build them manually.
7
+ `Capistrano::Chewy` gem adds automatic conditionally reset of only modified Chewy indexes and the removal of deleted index files to your deploy flow so you do not have to do it manually.
8
8
  Moreover, it adds the possibility of manual index management with the base Chewy tasks on the remote server.
9
9
 
10
10
  ## Requirements
@@ -38,6 +38,12 @@ Or install it yourself as:
38
38
  $ gem install capistrano-chewy
39
39
  ```
40
40
 
41
+ If you want to use the latest version from the `master`, then add the following line to your Gemfile:
42
+
43
+ ```ruby
44
+ gem 'capistrano-chewy', git: 'https://github.com/nbulaj/capistrano-chewy.git'
45
+ ```
46
+
41
47
  ## Usage
42
48
 
43
49
  Require it in your `Capfile`:
@@ -45,7 +51,9 @@ Require it in your `Capfile`:
45
51
  ```ruby
46
52
  # Capfile
47
53
 
54
+ ...
48
55
  require 'capistrano/chewy'
56
+ ...
49
57
  ```
50
58
 
51
59
  then you can use `cap -T` to list `Capistrano::Chewy` tasks:
@@ -58,6 +66,9 @@ cap deploy:chewy:update # Updates data to all the indexes
58
66
  cap deploy:chewy:update[indexes] # Updates data to the specified indexes
59
67
  ```
60
68
 
69
+ By default `Capistrano::Chewy` adds `deploy:chewy:rebuild` task after `deploy:updated` and `deploy:reverted`.
70
+ If you want to change it, then you need to disable default gem hooks by setting `chewy_default_hooks` to `false` in your deployment config and manually define the order of the tasks.
71
+
61
72
  ## Configuration
62
73
 
63
74
  You can setup the following:
@@ -68,8 +79,8 @@ set :chewy_conditionally_reset, false # Reset only modified Chewy indexes, true
68
79
  set :chewy_path, 'app/my_indexes' # Path to Chewy indexes, 'app/chewy' by default
69
80
  set :chewy_env, :chewy_production # Environment variable for Chewy, equal to RAILS_ENV by default
70
81
  set :chewy_role, :web # Chewy role, :app by default
71
- set :chewy_skip, true # Skip processing Chewy indexes during deploy, false by default
72
82
  set :chewy_default_hooks, false # Add default capistrano-chewy hooks to your deploy flow, true by default
83
+ set :chewy_delete_removed_indexes, false # Delete indexes which files have been deleted, true by default
73
84
  ```
74
85
 
75
86
  ## Contributing
@@ -7,8 +7,8 @@ Gem::Specification.new do |spec|
7
7
  spec.name = 'capistrano-chewy'
8
8
  spec.version = CapistranoChewy.gem_version
9
9
  spec.authors = ['Nikita Bulai']
10
- spec.date = '2016-10-18'
11
- spec.email = ['bulainikita@gmail.com']
10
+ spec.date = '2016-10-19'
11
+ spec.email = ['bulajnikita@gmail.com']
12
12
  spec.summary = 'Manage and continuously rebuild your ElasticSearch indexes with Chewy and Capistrano'
13
13
  spec.description = 'Manage and continuously rebuild your ElasticSearch indexes with Chewy and Capistrano v3.'
14
14
  spec.homepage = 'https://github.com/nbulaj/capistrano-chewy'
@@ -8,6 +8,10 @@ module CapistranoChewy
8
8
  @changed = []
9
9
  @added = []
10
10
  end
11
+
12
+ def empty?
13
+ [@removed, @changed, @added].all?(&:empty?)
14
+ end
11
15
  end
12
16
 
13
17
  CHANGED_FILE_PATTERN = /Files\s+.+\s+and\s+(.+)\s+differ/i
@@ -15,7 +19,7 @@ module CapistranoChewy
15
19
 
16
20
  class << self
17
21
  def parse(diff, current_path, release_path)
18
- raise ArgumentError, 'current_path can not be the same as release_path!' if current_path == release_path
22
+ return Result.new if current_path == release_path
19
23
 
20
24
  diff.split("\n").each_with_object(Result.new) do |line, result|
21
25
  # File was changed
@@ -5,7 +5,7 @@ module CapistranoChewy
5
5
 
6
6
  module VERSION
7
7
  MAJOR = 0
8
- MINOR = 1
8
+ MINOR = 2
9
9
  TINY = 0
10
10
 
11
11
  STRING = [MAJOR, MINOR, TINY].compact.join('.')
@@ -1,11 +1,11 @@
1
1
  namespace :load do
2
2
  task :defaults do
3
+ set :chewy_default_hooks, -> { true }
3
4
  set :chewy_conditionally_reset, -> { true }
4
5
  set :chewy_path, -> { 'app/chewy' }
5
6
  set :chewy_env, -> { fetch(:rails_env, fetch(:stage)) }
6
7
  set :chewy_role, -> { :app }
7
- set :chewy_skip, -> { false }
8
- set :chewy_default_hooks, -> { true }
8
+ set :chewy_delete_removed_indexes, -> { true }
9
9
  end
10
10
  end
11
11
 
@@ -17,7 +17,8 @@ namespace :deploy do
17
17
  namespace :chewy do
18
18
  # Adds default Capistrano::Chewy hooks to the deploy flow
19
19
  task :add_default_hooks do
20
- after 'deploy:updated', 'deploy:chewy:rebuild'
20
+ after :'deploy:updated', 'deploy:chewy:rebuild'
21
+ after :'deploy:reverted', 'deploy:chewy:rebuild'
21
22
  end
22
23
 
23
24
  # Default Chewy rake tasks
@@ -60,11 +61,6 @@ namespace :deploy do
60
61
  desc 'Reset Chewy indexes if they have been added, changed or removed'
61
62
  task :rebuild do
62
63
  on roles fetch(:chewy_role) do
63
- if fetch(:chewy_skip)
64
- info 'Skipping task according to the deploy settings'
65
- exit 0
66
- end
67
-
68
64
  info "Checking Chewy directory (#{fetch(:chewy_path)})"
69
65
 
70
66
  chewy_path = File.join(release_path, fetch(:chewy_path))
@@ -91,11 +87,6 @@ namespace :deploy do
91
87
  desc 'Runs smart Chewy indexes rebuilding (only for changed files)'
92
88
  task :rebuilding do
93
89
  on roles fetch(:chewy_role) do
94
- if fetch(:chewy_skip)
95
- info 'Skipping task according to the deploy settings'
96
- exit 0
97
- end
98
-
99
90
  chewy_path = fetch(:chewy_path)
100
91
  info "Checking changes in #{chewy_path}"
101
92
 
@@ -107,25 +98,41 @@ namespace :deploy do
107
98
  # -Z, --ignore-trailing-space ignore white space at line end
108
99
  # -B, --ignore-blank-lines ignore changes where lines are all blank
109
100
  #
110
- indexes_diff = capture(:diff, "-qZEB #{chewy_release_path} #{chewy_current_path}", raise_on_non_zero_exit: false)
101
+ diff_args = "-qZEB #{chewy_release_path} #{chewy_current_path}"
102
+ indexes_diff = capture :diff, diff_args, raise_on_non_zero_exit: false
103
+ changes = ::CapistranoChewy::DiffParser.parse(indexes_diff, chewy_current_path, chewy_release_path)
111
104
 
112
105
  # If diff is empty then indices have not changed
113
- if indexes_diff.nil? || indexes_diff.strip.empty?
106
+ if changes.empty?
114
107
  info 'Skipping `deploy:chewy:rebuilding` (nothing changed in the Chewy path)'
108
+ exit 0
115
109
  else
116
- within release_path do
117
- with rails_env: fetch(:chewy_env) do
118
- changes = ::CapistranoChewy::DiffParser.parse(indexes_diff, chewy_current_path, chewy_release_path)
110
+ indexes_to_reset = changes.changed.concat(changes.added)
111
+ indexes_to_delete = changes.removed
119
112
 
120
- # Reset indexes that were changed or added
121
- indexes_to_reset = changes.changed.concat(changes.added)
113
+ # Reset indexes which have been modified or added
114
+ if indexes_to_reset.any?
115
+ indexes = indexes_to_reset.map { |file| File.basename(file, '_index.rb') }.join(',')
122
116
 
123
- if indexes_to_reset.any?
124
- indexes = indexes_to_reset.map { |file| File.basename(file).gsub('_index.rb', '') }.join(',')
117
+ within release_path do
118
+ with rails_env: fetch(:chewy_env) do
119
+ info "Modified or new indexes: #{indexes}"
125
120
  execute :rake, "chewy:reset[#{indexes}]"
126
121
  end
122
+ end
123
+ end
124
+
125
+ # Delete indexes which have been removed
126
+ if indexes_to_delete.any? && fetch(:chewy_delete_removed_indexes)
127
+ indexes = indexes_to_delete.map { |file| File.basename(file, '.rb').camelize }.uniq
128
+ runner_code = "[#{indexes.join(', ')}].each(&:delete)"
127
129
 
128
- # TODO: destroy removed indexes?
130
+ # Removed index files exists only in the old (current) release
131
+ within current_path do
132
+ with rails_env: fetch(:chewy_env) do
133
+ info "Removing indexes: #{indexes.join(',')}"
134
+ execute :rails, "runner '#{runner_code}'"
135
+ end
129
136
  end
130
137
  end
131
138
  end
@@ -4,6 +4,7 @@ describe CapistranoChewy::DiffParser do
4
4
  let(:current_path) { '/project/1/app/chewy' }
5
5
  let(:release_path) { '/project/2/app/chewy' }
6
6
 
7
+ # TODO: make a real diff
7
8
  let(:full_diff) do
8
9
  "Files #{current_path}/accounts_index.rb and #{release_path}/accounts_index.rb differ\n" \
9
10
  "Files #{current_path}/posts_index.rb and #{release_path}/posts_index.rb differ\n" \
@@ -20,6 +21,8 @@ describe CapistranoChewy::DiffParser do
20
21
  expect(result.changed).to eq(["#{release_path}/accounts_index.rb", "#{release_path}/posts_index.rb", "#{release_path}/comments_index.rb"])
21
22
  expect(result.added).to eq(["#{release_path}/applications_index.rb"])
22
23
  expect(result.removed).to eq(["#{current_path}/users_index.rb"])
24
+
25
+ expect(result.empty?).to be_falsey
23
26
  end
24
27
  end
25
28
 
@@ -30,12 +33,20 @@ describe CapistranoChewy::DiffParser do
30
33
  expect(result.changed).to be_empty
31
34
  expect(result.added).to be_empty
32
35
  expect(result.removed).to be_empty
36
+
37
+ expect(result.empty?).to be_truthy
33
38
  end
34
39
  end
35
40
 
36
41
  context 'with the same directories' do
37
- it 'raises an error' do
38
- expect { described_class.parse('', current_path, current_path) }.to raise_error(ArgumentError)
42
+ it 'returns blank result' do
43
+ result = described_class.parse('', current_path, current_path)
44
+
45
+ expect(result.changed).to be_empty
46
+ expect(result.added).to be_empty
47
+ expect(result.removed).to be_empty
48
+
49
+ expect(result.empty?).to be_truthy
39
50
  end
40
51
  end
41
52
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-chewy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Bulai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-18 00:00:00.000000000 Z
11
+ date: 2016-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capistrano
@@ -55,7 +55,7 @@ dependencies:
55
55
  description: Manage and continuously rebuild your ElasticSearch indexes with Chewy
56
56
  and Capistrano v3.
57
57
  email:
58
- - bulainikita@gmail.com
58
+ - bulajnikita@gmail.com
59
59
  executables: []
60
60
  extensions: []
61
61
  extra_rdoc_files: []
@@ -68,7 +68,7 @@ files:
68
68
  - LICENSE
69
69
  - README.md
70
70
  - Rakefile
71
- - capistrano3-postgres.gemspec
71
+ - capistrano-chewy.gemspec
72
72
  - lib/capistrano-chewy.rb
73
73
  - lib/capistrano-chewy/diff_parser.rb
74
74
  - lib/capistrano-chewy/version.rb