negroku 2.4.2 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/lib/negroku.rb +13 -0
  4. data/lib/negroku/{deploy.rb → capistrano/deploy.rb} +1 -2
  5. data/lib/negroku/{eye.rb → capistrano/eye.rb} +0 -0
  6. data/lib/negroku/{eye → capistrano/eye}/delayed_job.rb +0 -0
  7. data/lib/negroku/{eye → capistrano/eye}/thinking_sphinx.rb +0 -0
  8. data/lib/negroku/{eye → capistrano/eye}/unicorn.rb +0 -0
  9. data/lib/negroku/{formatters → capistrano/formatters}/simple.rb +0 -0
  10. data/lib/negroku/{tasks → capistrano/tasks}/bower.rake +0 -0
  11. data/lib/negroku/{tasks → capistrano/tasks}/bundler.rake +0 -0
  12. data/lib/negroku/{tasks → capistrano/tasks}/delayed_job.rake +0 -0
  13. data/lib/negroku/{tasks → capistrano/tasks}/env.rake +0 -0
  14. data/lib/negroku/{tasks → capistrano/tasks}/eye.rake +1 -1
  15. data/lib/negroku/{tasks → capistrano/tasks}/eye/delayed_job.rake +0 -0
  16. data/lib/negroku/{tasks → capistrano/tasks}/eye/thinking_sphinx.rake +0 -0
  17. data/lib/negroku/{tasks → capistrano/tasks}/eye/unicorn.rake +0 -0
  18. data/lib/negroku/{tasks → capistrano/tasks}/github.rake +0 -0
  19. data/lib/negroku/{tasks → capistrano/tasks}/log.rake +0 -0
  20. data/lib/negroku/{tasks → capistrano/tasks}/nginx.rake +0 -0
  21. data/lib/negroku/{tasks → capistrano/tasks}/nodenv.rake +0 -0
  22. data/lib/negroku/{tasks → capistrano/tasks}/rails.rake +0 -0
  23. data/lib/negroku/{tasks → capistrano/tasks}/rbenv.rake +0 -0
  24. data/lib/negroku/{tasks → capistrano/tasks}/thinking_sphinx.rake +1 -1
  25. data/lib/negroku/{tasks → capistrano/tasks}/unicorn.rake +1 -1
  26. data/lib/negroku/{tasks → capistrano/tasks}/whenever.rake +0 -0
  27. data/lib/negroku/{templates/tasks → capistrano/templates}/eye/_delayed_job.erb +0 -0
  28. data/lib/negroku/{templates/tasks → capistrano/templates}/eye/_process.erb +0 -0
  29. data/lib/negroku/{templates/tasks → capistrano/templates}/eye/_sphinx.erb +0 -0
  30. data/lib/negroku/{templates/tasks → capistrano/templates}/eye/_unicorn.erb +0 -0
  31. data/lib/negroku/{templates/tasks → capistrano/templates}/eye/application.eye.erb +0 -0
  32. data/lib/negroku/{templates/tasks → capistrano/templates}/thinking_sphinx.yml.erb +0 -0
  33. data/lib/negroku/{templates/tasks → capistrano/templates}/unicorn_rails.rb.erb +0 -0
  34. data/lib/negroku/{templates/tasks → capistrano/templates}/unicorn_rails_activerecord.rb.erb +0 -0
  35. data/lib/negroku/capistrano/update.rb +3 -0
  36. data/lib/negroku/cli.rb +8 -5
  37. data/lib/negroku/cli/commands/app.rb +10 -1
  38. data/lib/negroku/cli/commands/env.rb +1 -1
  39. data/lib/negroku/cli/commands/stage.rb +1 -1
  40. data/lib/negroku/config.rb +64 -0
  41. data/lib/negroku/helpers.rb +1 -22
  42. data/lib/negroku/helpers/tasks.rb +21 -0
  43. data/lib/negroku/helpers/templates.rb +1 -3
  44. data/lib/negroku/helpers/watch.rb +1 -1
  45. data/lib/negroku/locales/en.yml +15 -0
  46. data/lib/negroku/modes/app.rb +167 -0
  47. data/lib/negroku/modes/env.rb +59 -0
  48. data/lib/negroku/modes/stage.rb +95 -0
  49. data/lib/negroku/templates/Capfile.erb +49 -0
  50. data/lib/negroku/templates/{negroku/deploy.rb.erb → deploy.rb.erb} +0 -0
  51. data/lib/negroku/templates/{negroku/stage.rb.erb → stage.rb.erb} +0 -0
  52. data/lib/negroku/version.rb +1 -1
  53. data/lib/negroku/versionable.rb +31 -0
  54. data/negroku.gemspec +7 -2
  55. data/spec/lib/modes/app_spec.rb +47 -0
  56. data/spec/lib/modes/env_spec.rb +44 -0
  57. data/spec/lib/{cli → modes}/stage_spec.rb +20 -17
  58. data/spec/lib/versionable_spec.rb +88 -0
  59. data/spec/negroku_mocks.rb +10 -0
  60. data/spec/spec_helper.rb +10 -4
  61. metadata +108 -47
  62. data/lib/negroku/cli/bootstrap.rb +0 -58
  63. data/lib/negroku/cli/env.rb +0 -57
  64. data/lib/negroku/cli/stage.rb +0 -93
  65. data/lib/negroku/tasks/negroku.rake +0 -48
  66. data/lib/negroku/templates/negroku/Capfile.erb +0 -46
  67. data/spec/lib/cli/bootstrap_spec.rb +0 -46
  68. data/spec/lib/cli/env_spec.rb +0 -49
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 90b0dd4913acc2b6bd2a667860a768f333b15e7b
4
- data.tar.gz: dedf7fc1f40a0ae5d4dcf04efbe5041428de355a
3
+ metadata.gz: 5dcb77d7922f3f0294a836a8995476b009898fa2
4
+ data.tar.gz: 2162463bb26561d51e152dc47f90ae58fe5b6ca8
5
5
  SHA512:
6
- metadata.gz: 1e88de7c39d95d51ab839f3b21939f2c73289c5bab317bac921ed5faca8c2092f956fb3793914202dee0ba8e582302afd3b2352939473354d74af6a40e8177b0
7
- data.tar.gz: 3806015f329ad0489cd38af8e55664b7fbd0953c8bd781244750a4532b49871a1d9e32f5d53c78c26d4be0cd4492c82051beeae7bfd307fc093007728dbe5ba7
6
+ metadata.gz: f158341dcc67274203b30f9f749f8fc4bb82b2763171772a4afc2b5fbfd217d6b584ce8c0b851b61145a2dd8234a9b681cb0dbf9f6a28dba79167cf7baaf9523
7
+ data.tar.gz: 9fd78397e37a89241b39619b3037a8415de29848fc4485524853dc1ed4dad1cd6a3f628029d8971be947d63a1cfeb51d50bec575dab2bdfbe586bbf386520d8a
data/.travis.yml CHANGED
@@ -2,6 +2,8 @@
2
2
  language: ruby
3
3
  script: bundle exec rspec spec
4
4
  rvm:
5
+ - "1.9.3"
5
6
  - "2.0.0"
6
7
  - "2.1.0"
8
+ - "2.2.0"
7
9
  sudo: false
data/lib/negroku.rb CHANGED
@@ -1,5 +1,18 @@
1
1
  require 'negroku/i18n'
2
2
  require 'negroku/version'
3
+ require 'negroku/versionable'
4
+
5
+ module Negroku
6
+ include Negroku::Versionable
7
+
8
+ def self.version
9
+ VERSION
10
+ end
11
+
12
+ def self.capfile_version
13
+ defined?(::CAPFILE_VERSION).nil? ? "0.0.0" : ::CAPFILE_VERSION
14
+ end
15
+ end
3
16
 
4
17
  # Add requires for other files you add to your project here, so
5
18
  # you just need to require this one file in your bin file
@@ -1,4 +1,4 @@
1
- require 'negroku/helpers'
1
+ require 'negroku/helpers/tasks'
2
2
 
3
3
  # Base configuration
4
4
  namespace :load do
@@ -21,7 +21,6 @@ namespace :load do
21
21
  end
22
22
 
23
23
  # Load Negroku tasks
24
- load_task "negroku"
25
24
  load_task "env"
26
25
  load_task "rbenv" if required? 'capistrano/rbenv'
27
26
  load_task "nodenv" if required? 'capistrano/nodenv'
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -78,7 +78,7 @@ namespace :negroku do
78
78
 
79
79
  # use a build in template if the template doesn't exists in the project
80
80
  unless File.exists?(template_path)
81
- template_path = "tasks/eye/application.eye.erb"
81
+ template_path = "capistrano/templates/eye/application.eye.erb"
82
82
  end
83
83
 
84
84
  config = build_template(template_path, nil, binding)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -37,7 +37,7 @@ namespace :negroku do
37
37
 
38
38
  # user a build in template if the template doesn't exists in the project
39
39
  unless File.exists?(template_path)
40
- template_path = "tasks/thinking_sphinx.yml.erb"
40
+ template_path = "capistrano/templates/thinking_sphinx.yml.erb"
41
41
  end
42
42
 
43
43
  config = build_template(template_path, nil, binding)
@@ -70,7 +70,7 @@ namespace :negroku do
70
70
 
71
71
  # user a build in template if the template doesn't exists in the project
72
72
  unless File.exists?(template_path)
73
- template_path = "tasks/unicorn_#{fetch(:unicorn_template_type)}.rb.erb"
73
+ template_path = "capistrano/templates/unicorn_#{fetch(:unicorn_template_type)}.rb.erb"
74
74
  end
75
75
 
76
76
  config = build_template(template_path, nil, binding)
@@ -0,0 +1,3 @@
1
+ require 'negroku/modes/app'
2
+
3
+ Negroku::Modes::App.check_all_versions
data/lib/negroku/cli.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'capistrano/all'
2
2
  require 'capistrano/setup'
3
3
  require 'capistrano/deploy'
4
+ require 'bundler'
5
+ require 'virtus'
4
6
 
5
7
  # Load applications deploy config if it exists
6
8
  require './config/deploy' if File.exists? "./config/deploy.rb"
@@ -9,15 +11,16 @@ require 'gli'
9
11
  require 'inquirer'
10
12
  require 'negroku/i18n'
11
13
  require 'negroku/version'
12
- require 'negroku/cli/bootstrap'
13
- require 'negroku/cli/stage'
14
- require 'negroku/cli/env'
14
+ require 'negroku/versionable'
15
+ require 'negroku/config'
16
+ require 'negroku/modes/app'
17
+ require 'negroku/modes/stage'
18
+ require 'negroku/modes/env'
15
19
  require 'negroku/helpers/app_directory'
16
20
  require 'negroku/helpers/templates'
17
21
 
18
22
  require 'capistrano/rbenv'
19
- require 'negroku/deploy'
20
-
23
+ require 'negroku/capistrano/deploy'
21
24
 
22
25
  module Negroku::CLI
23
26
 
@@ -7,7 +7,16 @@ module Negroku::CLI
7
7
  app.command :create do |create|
8
8
  create.action do |global_options,options,args|
9
9
 
10
- Negroku::Bootstrap.install
10
+ Negroku::Modes::App.install
11
+
12
+ end
13
+ end
14
+
15
+ app.desc 'Update your negroku capfile'
16
+ app.command :update do |create|
17
+ create.action do |global_options,options,args|
18
+
19
+ Negroku::Modes::App.update
11
20
 
12
21
  end
13
22
  end
@@ -6,7 +6,7 @@ module Negroku::CLI
6
6
  app.desc 'Sets multiple variables from rbenv-vars to a server'
7
7
  app.command :bulk do |bulk|
8
8
  bulk.action do |global_options,options,args|
9
- Negroku::Env.bulk
9
+ Negroku::Modes::Env.bulk
10
10
  end
11
11
  end
12
12
 
@@ -7,7 +7,7 @@ module Negroku::CLI
7
7
  stage.command :add do |add|
8
8
  add.action do |global_options,options,args|
9
9
 
10
- Negroku::Stage.add
10
+ Negroku::Modes::Stage.add
11
11
 
12
12
  end
13
13
  end
@@ -0,0 +1,64 @@
1
+ module Negroku
2
+ class Feature
3
+ include Virtus.value_object
4
+
5
+ values do
6
+ attribute :name, String
7
+ attribute :required, Boolean, default: false
8
+ attribute :enabled, Boolean, default: false, :writer => :public
9
+ end
10
+ end
11
+ end
12
+
13
+ class Negroku::ConfigFactory
14
+ include Virtus.model
15
+
16
+ def self.loaded_in_bundler(name)
17
+ Bundler.load.dependencies.any? {|a| a.name == name}
18
+ end
19
+
20
+ attribute :bower, Negroku::Feature, default: {
21
+ name: "bower", enabled: File.exists?('bower.json')
22
+ }
23
+
24
+ attribute :bundler, Negroku::Feature, default: {
25
+ name: "bundler", enabled: File.exists?('Gemfile')
26
+ }
27
+
28
+ attribute :delayed_job, Negroku::Feature, default: {
29
+ name: "delayed_job", enabled: loaded_in_bundler('delayed_jobs')
30
+ }
31
+
32
+ attribute :nginx, Negroku::Feature, default: {
33
+ name: "nginx", enabled: true, required: true
34
+ }
35
+
36
+ attribute :nodenv, Negroku::Feature, default: {
37
+ name: "nodenv", enabled: true, required: true
38
+ }
39
+
40
+ attribute :rails, Negroku::Feature, default: {
41
+ name: "rails", enabled: loaded_in_bundler('rails')
42
+ }
43
+
44
+ attribute :rbenv, Negroku::Feature, default: {
45
+ name: "rbenv", enabled: true, required: true
46
+ }
47
+
48
+ attribute :sphinx, Negroku::Feature, default: {
49
+ name: "sphinx", enabled: loaded_in_bundler('thinking-sphinx')
50
+ }
51
+
52
+ attribute :unicorn, Negroku::Feature, default: {
53
+ name: "unicorn", enabled: loaded_in_bundler('unicorn')
54
+ }
55
+
56
+ attribute :whenever, Negroku::Feature, default: {
57
+ name: "whenever", enabled: loaded_in_bundler('whenever')
58
+ }
59
+
60
+ # private
61
+
62
+ end
63
+
64
+ Negroku::Config = Negroku::ConfigFactory.new
@@ -2,25 +2,4 @@ require 'negroku/helpers/templates'
2
2
  require 'negroku/helpers/watch'
3
3
  require 'negroku/helpers/logs'
4
4
  require 'negroku/helpers/env'
5
-
6
- # Find out if a specific library file was already required
7
- def required?(file)
8
- rex = Regexp.new("/#{Regexp.quote(file)}\.(so|o|sl|rb)?")
9
- $LOADED_FEATURES.find { |f| f =~ rex }
10
- end
11
-
12
- def any_required?(arr)
13
- arr.any? { |file| required?(file) }
14
- end
15
-
16
- def all_required?(arr)
17
- arr.all? { |file| required?(file) }
18
- end
19
-
20
- def load_task(name, dependencies = [])
21
- if all_required? dependencies
22
- load File.join(File.dirname(__FILE__), 'tasks', "#{name}.rake")
23
- else
24
- fail "To load #{name} you need to include #{dependencies.join ", "}"
25
- end
26
- end
5
+ require 'negroku/helpers/tasks'
@@ -0,0 +1,21 @@
1
+ # Find out if a specific library file was already required
2
+ def required?(file)
3
+ rex = Regexp.new("/#{Regexp.quote(file)}\.(so|o|sl|rb)?")
4
+ $LOADED_FEATURES.find { |f| f =~ rex }
5
+ end
6
+
7
+ def any_required?(arr)
8
+ arr.any? { |file| required?(file) }
9
+ end
10
+
11
+ def all_required?(arr)
12
+ arr.all? { |file| required?(file) }
13
+ end
14
+
15
+ def load_task(name, dependencies = [])
16
+ if all_required? dependencies
17
+ load File.join(File.dirname(__FILE__), '..', 'capistrano', 'tasks', "#{name}.rake")
18
+ else
19
+ fail "To load #{name} you need to include #{dependencies.join ", "}"
20
+ end
21
+ end
@@ -11,8 +11,6 @@ def build_template(template, destination, binding)
11
11
  File.open(destination.to_s, 'w+') do |f|
12
12
  f.write(result)
13
13
  end
14
-
15
- puts I18n.t(:written_file, scope: :negroku, file: destination)
16
14
  else
17
15
  return StringIO.new(result)
18
16
  end
@@ -29,7 +27,7 @@ def get_template_file(filename)
29
27
  if File.exists?(filename)
30
28
  templateFile = filename
31
29
  else
32
- templateFile = File.expand_path("../../templates/#{filename}", __FILE__)
30
+ templateFile = File.expand_path("../../#{filename}", __FILE__)
33
31
  end
34
32
 
35
33
  File.read(templateFile)
@@ -6,7 +6,7 @@ def watch_process(name, options = {})
6
6
  options[:template] ||= name.to_sym
7
7
 
8
8
  if options[:template].kind_of?(Symbol)
9
- options[:template] = "tasks/eye/_#{options[:template]}.erb"
9
+ options[:template] = "capistrano/templates/eye/_#{options[:template]}.erb"
10
10
  end
11
11
 
12
12
  processes[name] = options
@@ -17,3 +17,18 @@ en:
17
17
  ask_domains: "Type the domains to use"
18
18
  ask_server_url: "Type the server url to deploy to"
19
19
  ask_set_vars: "Do you want to set rbenv-vars to the server now?"
20
+ application_features: "What features do you want to enable?"
21
+ updating_capfile: "Updating application Capfile...."
22
+ updated_capfile: "The Capfile was updated"
23
+ no_change_capfile: "Nothing to update "
24
+ gem_up_to_date: "\u2713 Negroku is up to date"
25
+ capfile_up_to_date: "\u2713 Your Capfile is up to date"
26
+ gem_new_version: "There is a new version of negroku\n"
27
+ capfile_new_version: "\u2718 Your Capfile version doesn't match your negroku version\n"
28
+ gem_latest_version: "Latest negroku version: %{version}\n"
29
+ gem_current_version: "Your negroku version: %{version}\n"
30
+ capfile_current_version: "Your Capfile version: %{version}\n"
31
+ continue_without_update: "Do you want to continue without updating?"
32
+ capfile_ask_update: "Capfile might be out-dated, the current negroku version might have added new features to your Capfile,\ndo you want to continue without update your Capfile?"
33
+ gem_update_instructions: "To update just change your %{gemfile} with the latest version and run %{cmd}"
34
+ capfile_update_instructions: "To update your %{capfile} just run %{cmd}"
@@ -0,0 +1,167 @@
1
+ require 'inquirer'
2
+ require 'colorize'
3
+ require 'negroku'
4
+
5
+ module Negroku::Modes
6
+ module App
7
+ def install
8
+
9
+ check_version
10
+
11
+ data = {}
12
+ data[:application_name] = ask_name
13
+ data[:repo_url] = select_repo
14
+
15
+ ask_features
16
+
17
+ custom_capify data
18
+
19
+ end
20
+
21
+ def update
22
+
23
+ puts I18n.t :updating_capfile, scope: :negroku
24
+
25
+ capfilePath = AppDirectory.root.join('Capfile')
26
+ capfile = File.read(capfilePath)
27
+
28
+ build_capfile
29
+
30
+ capfile_new = File.read(capfilePath)
31
+
32
+ if capfile_new != capfile
33
+ puts I18n.t :updated_capfile, scope: :negroku
34
+ else
35
+ puts I18n.t :no_change_capfile, scope: :negroku
36
+ end
37
+
38
+ end
39
+
40
+ # This code was exatracted from capistrano to be used with our own templates
41
+ # https://github.com/capistrano/capistrano/blob/68e7632c5f16823a09c324d556a208e096abee62/lib/capistrano/tasks/install.rake
42
+ def custom_capify(data={}, config=nil)
43
+ # defaults
44
+ data[:server_url] = ""
45
+ data[:branch] = "master"
46
+
47
+ FileUtils.mkdir_p AppDirectory.deploy
48
+
49
+ build_capfile
50
+
51
+ deploy_rb = AppDirectory.config.join('deploy.rb')
52
+ build_template("templates/deploy.rb.erb", deploy_rb, binding)
53
+
54
+ FileUtils.mkdir_p AppDirectory.tasks
55
+
56
+ puts I18n.t :capified, scope: :negroku
57
+
58
+ end
59
+
60
+ def build_capfile
61
+ # Default Config
62
+ config ||= Negroku::Config
63
+
64
+ capfile = AppDirectory.root.join('Capfile')
65
+ build_template('templates/Capfile.erb', capfile, binding)
66
+ end
67
+
68
+ # Ask the application name
69
+ def ask_name
70
+ question = I18n.t :application_name, scope: :negroku
71
+ Ask.input question, default: File.basename(Dir.getwd)
72
+ end
73
+
74
+ def ask_features
75
+ optional_features = Negroku::Config::attributes.select{|k,v| !v.required?}
76
+ default_features = optional_features.map{|k,v| v.enabled?}
77
+ features_names = optional_features.map{|k,v| v.name}
78
+
79
+ question = I18n.t :application_features, scope: :negroku
80
+ selected = Ask.checkbox question, features_names, default: default_features
81
+
82
+ optional_features.each.with_index do |(idx, feat), index|
83
+ Negroku::Config[feat.name].enabled = selected[index]
84
+ end
85
+ end
86
+
87
+ # Get git remotes from current git and ask to select one
88
+ def select_repo
89
+ remote_urls = %x(git remote -v 2> /dev/null | awk '{print $2}' | uniq).split("\n")
90
+ remote_urls << (I18n.t :other, scope: :negroku)
91
+
92
+ question = I18n.t :choose_repo_url, scope: :negroku
93
+ selected_idx = Ask.list question, remote_urls
94
+
95
+ if selected_idx == remote_urls.length - 1
96
+ question = I18n.t :type_repo_url, scope: :negroku
97
+ Ask.input question
98
+ else remote_urls[selected_idx] end
99
+ end
100
+
101
+
102
+ def check_version
103
+ updated = Negroku.check_version
104
+
105
+ if(updated)
106
+ puts I18n.t(:gem_up_to_date, scope: :negroku).colorize(:green)
107
+ else
108
+
109
+ puts I18n.t(:gem_new_version, scope: :negroku).colorize(:yellow)
110
+
111
+ puts I18n.t(:gem_latest_version, scope: :negroku, version: Negroku.latest.colorize(:green))
112
+ puts I18n.t(:gem_current_version, scope: :negroku, version: Negroku.version.colorize(:yellow))
113
+
114
+ puts "\n"
115
+
116
+ gemfile_str = "Gemfile".colorize(mode: :bold)
117
+ cmd_str = "bundle install".colorize(mode: :bold)
118
+ puts I18n.t(:gem_update_instructions, scope: :negroku, gemfile: gemfile_str, cmd: cmd_str)
119
+
120
+ puts "\n"
121
+
122
+ question = I18n.t(:continue_without_update, scope: :negroku)
123
+ continue = ::Ask.confirm(question, default: true)
124
+
125
+ exit 0 unless(continue)
126
+
127
+ return continue
128
+ end
129
+ end
130
+
131
+ def check_capfile_version
132
+ updated = Negroku.check_capfile_version
133
+
134
+ if(updated)
135
+ puts I18n.t(:capfile_up_to_date, scope: :negroku).colorize(:green)
136
+ else
137
+ puts I18n.t(:capfile_new_version, scope: :negroku).colorize(:red)
138
+
139
+ puts I18n.t(:gem_current_version, scope: :negroku, version: Negroku.version.colorize(:green))
140
+ puts I18n.t(:capfile_current_version, scope: :negroku, version: Negroku.capfile_version.colorize(:red))
141
+
142
+ puts "\n"
143
+
144
+ capfile_str = "Capfile".colorize(mode: :bold)
145
+ cmd_str = "negroku app update".colorize(mode: :bold)
146
+ puts I18n.t(:capfile_update_instructions, scope: :negroku, capfile: capfile_str, cmd: cmd_str)
147
+
148
+ puts "\n"
149
+
150
+ question = I18n.t(:continue_without_update, scope: :negroku)
151
+ continue = ::Ask.confirm(question, default: false)
152
+
153
+ exit 0 unless(continue)
154
+ end
155
+ end
156
+
157
+ def check_all_versions
158
+ continue = self.check_version
159
+
160
+ unless(continue)
161
+ self.check_capfile_version
162
+ end
163
+ end
164
+
165
+ extend self
166
+ end
167
+ end