zero_downtime 0.2.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 90b2fb495197327ab698102779a0b606ae202f36
4
+ data.tar.gz: 32a7e5ee151c8f5f9c33349569a4f666f07e6a28
5
+ SHA512:
6
+ metadata.gz: 878f523c0300154fa9c145a8c1de5181ea1524e51f4e2393be4f8a83a58645ece21eaae0a81a0327ce3e85566c9f4c892680feeeb145888c38f5234f694b274f
7
+ data.tar.gz: 25b2e870303b499762282565e34504660936848f645f56e335baf755c2d2983607e22433d7ea7518bd5d044e1a7cf21667db74d9fdea3e92ac5531e5435661b9
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /gemfiles/*.gemfile.lock
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 2.1.5
5
+ - 2.2.2
6
+
7
+ gemfile:
8
+ - gemfiles/rails_4.0.gemfile
9
+ - gemfiles/rails_4.1.gemfile
10
+ - gemfiles/rails_4.2.gemfile
11
+
12
+ script: bundle exec rspec spec
data/Appraisals ADDED
@@ -0,0 +1,11 @@
1
+ appraise 'rails-4.0' do
2
+ gem 'activerecord', '~> 4.0.0'
3
+ end
4
+
5
+ appraise 'rails-4.1' do
6
+ gem 'activerecord', '~> 4.1.0'
7
+ end
8
+
9
+ appraise 'rails-4.2' do
10
+ gem 'activerecord', '~> 4.2.0'
11
+ end
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in zero_downtime.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Matthew Rudy Jacobs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # ZeroDowntime
2
+
3
+ [![Build Status](https://travis-ci.org/gogovan/zero_downtime.svg?branch=master)](https://travis-ci.org/gogovan/zero_downtime)
4
+
5
+ This is a minimal library to help run zero-downtime with rails and activerecord
6
+
7
+ ## Deprecated Columns
8
+
9
+ The most common use case is deprecating a column.
10
+
11
+ If you just drop a column,
12
+ it will break any existing process that has cached the columns.
13
+
14
+ ### Example
15
+
16
+ We have a model `Person`
17
+
18
+ It has a single column `:name`
19
+
20
+ However we want to split this up into
21
+
22
+ * :first_name
23
+ * :last_name
24
+
25
+ We add a migration
26
+
27
+ ```
28
+ class AddFirstAndLastNamesToPeople < ActiveRecord::Migration
29
+ class SafePersone # safe model
30
+ self.table_name :people
31
+ end
32
+
33
+ def up
34
+ add_column :people, :first_name
35
+ add_column :people, :last_name
36
+
37
+ SafePerson.find_each do |person|
38
+ *first_names, last_name = person.name.split(" ")
39
+
40
+ person.first_name = first_names.join(" ")
41
+ person.last_name = last_name
42
+ person.save!
43
+ end
44
+ end
45
+ end
46
+ ```
47
+
48
+ That's fine,
49
+ but what to do with the deprecated :name column?
50
+
51
+ The answer, mark it as deprecated
52
+
53
+ ```
54
+ class Person < ActiveRecord::Base
55
+ deprecate_column :name
56
+ end
57
+ ```
58
+
59
+ This will
60
+
61
+ * Let us easily find it later
62
+ * Stop anyone from using the column by accident
63
+ * Ensure that once its deployed we can safely remove the column
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'zero_downtime'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 4.0.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 4.1.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 4.2.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,77 @@
1
+ require 'active_support/concern'
2
+
3
+ module ZeroDowntime
4
+ class DeprecatedColumn < RuntimeError
5
+ end
6
+
7
+ # Deprecatable adds the ability to deprecate columns
8
+ # to ActiveRecord
9
+ #
10
+ # class MyModel < ActiveRecord::Base
11
+ # deprecate_column :name
12
+ # end
13
+ #
14
+ module Deprecatable
15
+ extend ActiveSupport::Concern
16
+
17
+ included do
18
+ class_attribute :deprecated_columns
19
+
20
+ class << self
21
+ alias_method_chain :columns, :deprecations
22
+ end
23
+ end
24
+
25
+ module ClassMethods
26
+ # deprecate a given column
27
+ # so it will be ignore by activerecord
28
+ # we can remove it once the deprecation is deployed
29
+ def deprecate_column(column_name)
30
+ deprecate_column_reader(column_name)
31
+ deprecate_column_writer(column_name)
32
+ override_attribute_methods
33
+
34
+ self.deprecated_columns ||= []
35
+ deprecated_columns << column_name.to_s
36
+ end
37
+
38
+ def columns_with_deprecations
39
+ all_columns = columns_without_deprecations
40
+ return all_columns unless deprecated_columns
41
+
42
+ all_columns.reject { |c| deprecated_columns.include?(c.name) }
43
+ end
44
+
45
+ private
46
+
47
+ def override_attribute_methods
48
+ return false if @attribute_methods_overriden
49
+
50
+ class_eval do
51
+ def attributes_with_deprecations
52
+ attributes_without_deprecations.except(*self.class.deprecated_columns)
53
+ end
54
+ alias_method_chain :attributes, :deprecations
55
+
56
+ def attribute_names_with_deprecations
57
+ attribute_names_without_deprecations - self.class.deprecated_columns
58
+ end
59
+ alias_method_chain :attribute_names, :deprecations
60
+ end
61
+ @attribute_methods_overriden = true
62
+ end
63
+
64
+ def deprecate_column_reader(column_name)
65
+ define_method(column_name) do
66
+ fail DeprecatedColumn, "attempted to read #{column_name}"
67
+ end
68
+ end
69
+
70
+ def deprecate_column_writer(column_name)
71
+ define_method("#{column_name}=") do |_|
72
+ fail DeprecatedColumn, "attempted to write #{column_name}"
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,17 @@
1
+ require 'zero_downtime/deprecatable'
2
+
3
+ begin
4
+ require 'rails/railtie'
5
+
6
+ module ZeroDowntime
7
+ class Railtie < Rails::Railtie # :nodoc:
8
+ initializer 'zero_downtime.initialize' do
9
+ ActiveSupport.on_load(:active_record) do
10
+ ActiveRecord::Base.send :include, Deprecatable
11
+ end
12
+ end
13
+ end
14
+ end
15
+ rescue LoadError
16
+ warn "can't load railtie"
17
+ end
@@ -0,0 +1,3 @@
1
+ module ZeroDowntime # :nodoc:
2
+ VERSION = '0.2.1'
3
+ end
@@ -0,0 +1,8 @@
1
+ require 'zero_downtime/version'
2
+ require 'zero_downtime/deprecatable'
3
+ require 'zero_downtime/railtie' if defined?(Rails)
4
+
5
+ # ZeroDowntime is a simple library for enabling zero-downtime
6
+ # with active record classes
7
+ module ZeroDowntime
8
+ end
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'zero_downtime/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'zero_downtime'
8
+ spec.version = ZeroDowntime::VERSION
9
+ spec.authors = ['Matthew Rudy Jacobs']
10
+ spec.email = ['matthewrudyjacobs@gmail.com']
11
+
12
+ spec.summary = <<-SUMMARY.strip
13
+ A simple library for running zero-downtime with Rails and ActiveRecord.
14
+ SUMMARY
15
+ spec.homepage = 'https://github.com/gogovan/zero_downtime'
16
+ spec.license = 'MIT'
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = 'exe'
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ['lib']
23
+
24
+ spec.add_dependency 'activesupport', '>= 4.0.0', '< 5.0.0'
25
+ spec.add_dependency 'activerecord', '>= 4.0.0', '< 5.0.0'
26
+
27
+ spec.add_development_dependency 'rubocop', '~> 0.31.0'
28
+ spec.add_development_dependency 'pry'
29
+ spec.add_development_dependency 'sqlite3'
30
+ spec.add_development_dependency 'appraisal', '~> 2.0.0'
31
+ spec.add_development_dependency 'bundler', '~> 1'
32
+ spec.add_development_dependency 'rake', '~> 10.0'
33
+ spec.add_development_dependency 'rspec', '~> 3.2.0'
34
+ end
metadata ADDED
@@ -0,0 +1,200 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zero_downtime
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Rudy Jacobs
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-07-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 5.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 4.0.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 5.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: activerecord
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 4.0.0
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: 5.0.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 4.0.0
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: 5.0.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: rubocop
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: 0.31.0
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: 0.31.0
67
+ - !ruby/object:Gem::Dependency
68
+ name: pry
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: sqlite3
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: appraisal
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: 2.0.0
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: 2.0.0
109
+ - !ruby/object:Gem::Dependency
110
+ name: bundler
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '1'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '1'
123
+ - !ruby/object:Gem::Dependency
124
+ name: rake
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '10.0'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '10.0'
137
+ - !ruby/object:Gem::Dependency
138
+ name: rspec
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: 3.2.0
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: 3.2.0
151
+ description:
152
+ email:
153
+ - matthewrudyjacobs@gmail.com
154
+ executables: []
155
+ extensions: []
156
+ extra_rdoc_files: []
157
+ files:
158
+ - ".gitignore"
159
+ - ".rspec"
160
+ - ".travis.yml"
161
+ - Appraisals
162
+ - Gemfile
163
+ - LICENSE.txt
164
+ - README.md
165
+ - Rakefile
166
+ - bin/console
167
+ - bin/setup
168
+ - gemfiles/rails_4.0.gemfile
169
+ - gemfiles/rails_4.1.gemfile
170
+ - gemfiles/rails_4.2.gemfile
171
+ - lib/zero_downtime.rb
172
+ - lib/zero_downtime/deprecatable.rb
173
+ - lib/zero_downtime/railtie.rb
174
+ - lib/zero_downtime/version.rb
175
+ - zero_downtime.gemspec
176
+ homepage: https://github.com/gogovan/zero_downtime
177
+ licenses:
178
+ - MIT
179
+ metadata: {}
180
+ post_install_message:
181
+ rdoc_options: []
182
+ require_paths:
183
+ - lib
184
+ required_ruby_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ requirements: []
195
+ rubyforge_project:
196
+ rubygems_version: 2.4.6
197
+ signing_key:
198
+ specification_version: 4
199
+ summary: A simple library for running zero-downtime with Rails and ActiveRecord.
200
+ test_files: []