kuby-core 0.6.0 → 0.8.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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/kuby-core.gemspec +7 -3
  4. data/lib/kuby.rb +9 -7
  5. data/lib/kuby/definition.rb +0 -8
  6. data/lib/kuby/docker/cli.rb +32 -0
  7. data/lib/kuby/docker/errors.rb +1 -0
  8. data/lib/kuby/docker/layer.rb +4 -4
  9. data/lib/kuby/docker/metadata.rb +11 -7
  10. data/lib/kuby/docker/package_phase.rb +2 -2
  11. data/lib/kuby/docker/spec.rb +11 -11
  12. data/lib/kuby/docker/timestamp_tag.rb +6 -3
  13. data/lib/kuby/environment.rb +6 -2
  14. data/lib/kuby/kubernetes.rb +0 -2
  15. data/lib/kuby/kubernetes/deploy_task.rb +0 -1
  16. data/lib/kuby/kubernetes/deployer.rb +7 -7
  17. data/lib/kuby/kubernetes/minikube_provider.rb +4 -0
  18. data/lib/kuby/kubernetes/provider.rb +5 -5
  19. data/lib/kuby/kubernetes/spec.rb +8 -8
  20. data/lib/kuby/plugin.rb +59 -0
  21. data/lib/kuby/plugins.rb +6 -0
  22. data/lib/kuby/plugins/nginx_ingress.rb +71 -0
  23. data/lib/kuby/plugins/rails_app.rb +18 -0
  24. data/lib/kuby/plugins/rails_app/asset_copy_task.rb +117 -0
  25. data/lib/kuby/plugins/rails_app/assets.rb +347 -0
  26. data/lib/kuby/plugins/rails_app/database.rb +75 -0
  27. data/lib/kuby/{kubernetes/plugins → plugins}/rails_app/generators/kuby.rb +0 -0
  28. data/lib/kuby/plugins/rails_app/mysql.rb +155 -0
  29. data/lib/kuby/plugins/rails_app/plugin.rb +398 -0
  30. data/lib/kuby/plugins/rails_app/postgres.rb +143 -0
  31. data/lib/kuby/plugins/rails_app/rewrite_db_config.rb +11 -0
  32. data/lib/kuby/plugins/rails_app/sqlite.rb +32 -0
  33. data/lib/kuby/{kubernetes/plugins → plugins}/rails_app/tasks.rake +10 -2
  34. data/lib/kuby/tasks.rb +28 -9
  35. data/lib/kuby/tasks/kuby.rake +1 -1
  36. data/lib/kuby/version.rb +1 -1
  37. data/spec/docker/timestamp_tag_spec.rb +11 -0
  38. data/spec/spec_helper.rb +102 -0
  39. metadata +50 -27
  40. data/lib/ext/krane/kubernetes_resource.rb +0 -16
  41. data/lib/kuby/kubernetes/plugin.rb +0 -55
  42. data/lib/kuby/kubernetes/plugins.rb +0 -8
  43. data/lib/kuby/kubernetes/plugins/nginx_ingress.rb +0 -73
  44. data/lib/kuby/kubernetes/plugins/rails_app.rb +0 -16
  45. data/lib/kuby/kubernetes/plugins/rails_app/database.rb +0 -79
  46. data/lib/kuby/kubernetes/plugins/rails_app/mysql.rb +0 -154
  47. data/lib/kuby/kubernetes/plugins/rails_app/plugin.rb +0 -379
  48. data/lib/kuby/kubernetes/plugins/rails_app/postgres.rb +0 -142
  49. data/lib/kuby/kubernetes/plugins/rails_app/rewrite_db_config.rb +0 -13
  50. data/lib/kuby/kubernetes/plugins/rails_app/sqlite.rb +0 -30
@@ -0,0 +1,143 @@
1
+ require 'kube-dsl'
2
+ require 'kuby/kube-db'
3
+
4
+ module Kuby
5
+ module Plugins
6
+ module RailsApp
7
+ class Postgres < ::Kuby::Plugin
8
+ ROLE = 'web'.freeze
9
+
10
+ attr_reader :environment, :configs
11
+
12
+ def initialize(environment, configs)
13
+ @environment = environment
14
+ @configs = configs
15
+
16
+ user(config['username'])
17
+ password(config['password'])
18
+ end
19
+
20
+ def name
21
+ :postgres
22
+ end
23
+
24
+ def resources
25
+ @resources ||= [secret, database]
26
+ end
27
+
28
+ def after_configuration
29
+ environment.docker.package_phase.add(:postgres_dev)
30
+ environment.docker.package_phase.add(:postgres_client)
31
+ end
32
+
33
+ def host
34
+ # host is the same as the name thanks to k8s DNS
35
+ @host ||= database.metadata.name
36
+ end
37
+
38
+ def rewritten_configs
39
+ # deep dup
40
+ @rewritten_configs ||= Marshal.load(Marshal.dump(configs)).tap do |new_configs|
41
+ new_configs[environment.name]['host'] = host
42
+ end
43
+ end
44
+
45
+ def user(user)
46
+ secret do
47
+ data do
48
+ set :POSTGRES_USER, user
49
+ end
50
+ end
51
+ end
52
+
53
+ def password(password)
54
+ secret do
55
+ data do
56
+ set :POSTGRES_PASSWORD, password
57
+ end
58
+ end
59
+ end
60
+
61
+ def secret(&block)
62
+ context = self
63
+
64
+ @secret ||= KubeDSL.secret do
65
+ metadata do
66
+ name "#{context.base_name}-postgres-secret"
67
+ namespace context.kubernetes.namespace.metadata.name
68
+ end
69
+
70
+ type 'Opaque'
71
+ end
72
+
73
+ @secret.instance_eval(&block) if block
74
+ @secret
75
+ end
76
+
77
+ def database(&block)
78
+ context = self
79
+
80
+ @database ||= Kuby::KubeDB.postgres do
81
+ api_version 'kubedb.com/v1alpha1'
82
+
83
+ metadata do
84
+ name "#{context.base_name}-postgres"
85
+ namespace context.kubernetes.namespace.metadata.name
86
+ end
87
+
88
+ spec do
89
+ database_secret do
90
+ secret_name context.secret.metadata.name
91
+ end
92
+
93
+ version '11.2'
94
+ standby_mode 'Hot'
95
+ streaming_mode 'asynchronous'
96
+ storage_type 'Durable'
97
+
98
+ storage do
99
+ storage_class_name context.kubernetes.provider.storage_class_name
100
+ access_modes ['ReadWriteOnce']
101
+
102
+ resources do
103
+ requests do
104
+ add :storage, '10Gi'
105
+ end
106
+ end
107
+ end
108
+
109
+ termination_policy 'DoNotTerminate'
110
+ end
111
+ end
112
+
113
+ @database.instance_eval(&block) if block
114
+ @database
115
+ end
116
+
117
+ def base_name
118
+ @base_name ||= "#{kubernetes.selector_app}-#{ROLE}"
119
+ end
120
+
121
+ def kubernetes
122
+ environment.kubernetes
123
+ end
124
+
125
+ private
126
+
127
+ def config
128
+ configs[environment.name]
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ Kuby.register_package(:postgres_dev,
136
+ debian: 'postgresql-client',
137
+ alpine: 'postgresql-dev'
138
+ )
139
+
140
+ Kuby.register_package(:postgres_client,
141
+ debian: 'postgresql-client',
142
+ alpine: 'postgresql-client'
143
+ )
@@ -0,0 +1,11 @@
1
+ module Kuby
2
+ module Plugins
3
+ module RailsApp
4
+ class RewriteDbConfig
5
+ def apply_to(dockerfile)
6
+ dockerfile.run('bundle exec rake kuby:rails_app:db:rewrite_config')
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,32 @@
1
+ module Kuby
2
+ module Plugins
3
+ module RailsApp
4
+ class Sqlite < ::Kuby::Plugin
5
+ attr_reader :environment
6
+
7
+ def initialize(environment, *)
8
+ @environment = environment
9
+ end
10
+
11
+ def after_configuration
12
+ environment.docker.package_phase.add(:sqlite_dev)
13
+ environment.docker.package_phase.add(:sqlite_client)
14
+ end
15
+
16
+ def name
17
+ :sqlite
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ Kuby.register_package(:sqlite_dev,
25
+ debian: 'libsqlite3-dev',
26
+ alpine: 'sqlite-dev'
27
+ )
28
+
29
+ Kuby.register_package(:sqlite_client,
30
+ debian: 'sqlite3',
31
+ alpine: 'sqlite'
32
+ )
@@ -6,8 +6,8 @@ namespace :kuby do
6
6
  task :rewrite_config do
7
7
  Kuby.load!
8
8
 
9
- config_file = File.join(Kuby.definition.kubernetes.plugin(:rails_app).root, 'config', 'database.yml')
10
- database = Kuby.definition.kubernetes.plugin(:rails_app).database
9
+ config_file = File.join(Kuby.environment.kubernetes.plugin(:rails_app).root, 'config', 'database.yml')
10
+ database = Kuby.environment.kubernetes.plugin(:rails_app).database
11
11
 
12
12
  if database.respond_to?(:rewritten_configs)
13
13
  File.write(config_file, YAML.dump(database.rewritten_configs))
@@ -24,5 +24,13 @@ namespace :kuby do
24
24
  end
25
25
  end
26
26
  end
27
+
28
+ namespace :assets do
29
+ task :copy do
30
+ Kuby.load!
31
+ assets = Kuby.environment.kubernetes.plugin(:rails_assets)
32
+ assets.copy_task.run
33
+ end
34
+ end
27
35
  end
28
36
  end
@@ -2,22 +2,22 @@ require 'rouge'
2
2
 
3
3
  module Kuby
4
4
  class Tasks
5
- attr_reader :definition
5
+ attr_reader :environment
6
6
 
7
- def initialize(definition)
8
- @definition = definition
7
+ def initialize(environment)
8
+ @environment = environment
9
9
  end
10
10
 
11
11
  def print_dockerfile
12
12
  theme = Rouge::Themes::Base16::Solarized.new
13
13
  formatter = Rouge::Formatters::Terminal256.new(theme)
14
14
  lexer = Rouge::Lexers::Docker.new
15
- tokens = lexer.lex(Kuby.definition.docker.to_dockerfile.to_s)
15
+ tokens = lexer.lex(Kuby.environment.docker.to_dockerfile.to_s)
16
16
  puts formatter.format(tokens)
17
17
  end
18
18
 
19
19
  def setup
20
- definition.kubernetes.setup
20
+ environment.kubernetes.setup
21
21
  end
22
22
 
23
23
  def build
@@ -39,6 +39,24 @@ module Kuby
39
39
  end
40
40
 
41
41
  def push
42
+ hostname = docker.metadata.image_hostname
43
+
44
+ unless docker.cli.auths.include?(hostname)
45
+ Kuby.logger.info("Attempting to log in to registry at #{hostname}")
46
+
47
+ begin
48
+ docker.cli.login(
49
+ url: docker.metadata.image_host,
50
+ username: docker.credentials.username,
51
+ password: docker.credentials.password
52
+ )
53
+ rescue Kuby::Docker::LoginError => e
54
+ Kuby.logger.fatal("Couldn't log in to the registry at #{hostname}")
55
+ Kuby.logger.fatal(e.message)
56
+ return
57
+ end
58
+ end
59
+
42
60
  image_url = docker.metadata.image_url
43
61
 
44
62
  begin
@@ -50,15 +68,16 @@ module Kuby
50
68
  'Docker image before running this task.'
51
69
 
52
70
  Kuby.logger.fatal(msg)
71
+ Kuby.logger.fatal(e.message)
53
72
  end
54
73
  end
55
74
 
56
75
  def deploy
57
- definition.kubernetes.deploy
76
+ environment.kubernetes.deploy
58
77
  end
59
78
 
60
79
  def rollback
61
- definition.kubernetes.rollback
80
+ environment.kubernetes.rollback
62
81
  end
63
82
 
64
83
  def print_resources
@@ -143,11 +162,11 @@ module Kuby
143
162
  end
144
163
 
145
164
  def kubernetes
146
- Kuby.definition.kubernetes
165
+ Kuby.environment.kubernetes
147
166
  end
148
167
 
149
168
  def docker
150
- Kuby.definition.docker
169
+ Kuby.environment.docker
151
170
  end
152
171
  end
153
172
  end
@@ -3,7 +3,7 @@ require 'shellwords'
3
3
  namespace :kuby do
4
4
  def tasks
5
5
  Kuby.load!
6
- @tasks ||= Kuby::Tasks.new(Kuby.definition)
6
+ @tasks ||= Kuby::Tasks.new(Kuby.environment)
7
7
  end
8
8
 
9
9
  task :dockerfile do
@@ -1,3 +1,3 @@
1
1
  module Kuby
2
- VERSION = '0.6.0'
2
+ VERSION = '0.8.0'
3
3
  end
@@ -0,0 +1,11 @@
1
+ require "spec_helper"
2
+
3
+ describe Kuby::Docker::TimestampTag do
4
+ context ".try_parse" do
5
+ it "returns a new timestamp tag" do
6
+ tag = described_class.try_parse("20200810165134")
7
+
8
+ expect(tag).to be_kind_of(described_class)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,102 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
4
+ # this file to always be loaded, without a need to explicitly require it in any
5
+ # files.
6
+ #
7
+ # Given that it is always loaded, you are encouraged to keep this file as
8
+ # light-weight as possible. Requiring heavyweight dependencies from this file
9
+ # will add to the boot time of your test suite on EVERY test run, even for an
10
+ # individual file that may not need all of that loaded. Instead, consider making
11
+ # a separate helper file that requires the additional dependencies and performs
12
+ # the additional setup, and require it from the spec files that actually need
13
+ # it.
14
+ #
15
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
16
+ RSpec.configure do |config|
17
+ # rspec-expectations config goes here. You can use an alternate
18
+ # assertion/expectation library such as wrong or the stdlib/minitest
19
+ # assertions if you prefer.
20
+ config.expect_with :rspec do |expectations|
21
+ # This option will default to `true` in RSpec 4. It makes the `description`
22
+ # and `failure_message` of custom matchers include text for helper methods
23
+ # defined using `chain`, e.g.:
24
+ # be_bigger_than(2).and_smaller_than(4).description
25
+ # # => "be bigger than 2 and smaller than 4"
26
+ # ...rather than:
27
+ # # => "be bigger than 2"
28
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
29
+ end
30
+
31
+ # rspec-mocks config goes here. You can use an alternate test double
32
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
33
+ config.mock_with :rspec do |mocks|
34
+ # Prevents you from mocking or stubbing a method that does not exist on
35
+ # a real object. This is generally recommended, and will default to
36
+ # `true` in RSpec 4.
37
+ mocks.verify_partial_doubles = true
38
+ end
39
+
40
+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
41
+ # have no way to turn it off -- the option exists only for backwards
42
+ # compatibility in RSpec 3). It causes shared context metadata to be
43
+ # inherited by the metadata hash of host groups and examples, rather than
44
+ # triggering implicit auto-inclusion in groups with matching metadata.
45
+ config.shared_context_metadata_behavior = :apply_to_host_groups
46
+
47
+ # The settings below are suggested to provide a good initial experience
48
+ # with RSpec, but feel free to customize to your heart's content.
49
+ =begin
50
+ # This allows you to limit a spec run to individual examples or groups
51
+ # you care about by tagging them with `:focus` metadata. When nothing
52
+ # is tagged with `:focus`, all examples get run. RSpec also provides
53
+ # aliases for `it`, `describe`, and `context` that include `:focus`
54
+ # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
55
+ config.filter_run_when_matching :focus
56
+
57
+ # Allows RSpec to persist some state between runs in order to support
58
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
59
+ # you configure your source control system to ignore this file.
60
+ config.example_status_persistence_file_path = "spec/examples.txt"
61
+
62
+ # Limits the available syntax to the non-monkey patched syntax that is
63
+ # recommended. For more details, see:
64
+ # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
65
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
66
+ # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
67
+ config.disable_monkey_patching!
68
+
69
+ # This setting enables warnings. It's recommended, but in some cases may
70
+ # be too noisy due to issues in dependencies.
71
+ config.warnings = true
72
+
73
+ # Many RSpec users commonly either run the entire suite or an individual
74
+ # file, and it's useful to allow more verbose output when running an
75
+ # individual spec file.
76
+ if config.files_to_run.one?
77
+ # Use the documentation formatter for detailed output,
78
+ # unless a formatter has already been configured
79
+ # (e.g. via a command-line flag).
80
+ config.default_formatter = "doc"
81
+ end
82
+
83
+ # Print the 10 slowest examples and example groups at the
84
+ # end of the spec run, to help surface which specs are running
85
+ # particularly slow.
86
+ config.profile_examples = 10
87
+
88
+ # Run specs in random order to surface order dependencies. If you find an
89
+ # order dependency and want to debug it, you can fix the order by providing
90
+ # the seed, which is printed after each run.
91
+ # --seed 1234
92
+ config.order = :random
93
+
94
+ # Seed global randomization in this process using the `--seed` CLI option.
95
+ # Setting this allows you to use `--seed` to deterministically reproduce
96
+ # test failures related to randomization by passing the same `--seed` value
97
+ # as the one that triggered the failure.
98
+ Kernel.srand config.seed
99
+ =end
100
+ end
101
+
102
+ require "kuby"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kuby-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Dutro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-06 00:00:00.000000000 Z
11
+ date: 2020-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -42,30 +42,36 @@ dependencies:
42
42
  name: krane
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.0'
47
+ version: 1.1.4
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '2.0'
48
51
  type: :runtime
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
52
- - - "~>"
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 1.1.4
58
+ - - "<"
53
59
  - !ruby/object:Gem::Version
54
- version: '1.0'
60
+ version: '2.0'
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: kuby-cert-manager
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
- - - "~>"
65
+ - - ">="
60
66
  - !ruby/object:Gem::Version
61
- version: '0.2'
67
+ version: '0.3'
62
68
  type: :runtime
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
- - - "~>"
72
+ - - ">="
67
73
  - !ruby/object:Gem::Version
68
- version: '0.2'
74
+ version: '0.3'
69
75
  - !ruby/object:Gem::Dependency
70
76
  name: kube-dsl
71
77
  requirement: !ruby/object:Gem::Requirement
@@ -84,16 +90,16 @@ dependencies:
84
90
  name: kuby-kube-db
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
- - - "~>"
93
+ - - ">="
88
94
  - !ruby/object:Gem::Version
89
- version: '0.4'
95
+ version: '0.5'
90
96
  type: :runtime
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
- - - "~>"
100
+ - - ">="
95
101
  - !ruby/object:Gem::Version
96
- version: '0.4'
102
+ version: '0.5'
97
103
  - !ruby/object:Gem::Dependency
98
104
  name: kubernetes-cli
99
105
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +142,20 @@ dependencies:
136
142
  - - "~>"
137
143
  - !ruby/object:Gem::Version
138
144
  version: '3.0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rspec
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
139
159
  description: Deploy your Rails app onto Kubernetes the easy way.
140
160
  email:
141
161
  - camertron@gmail.com
@@ -149,7 +169,6 @@ files:
149
169
  - README.md
150
170
  - Rakefile
151
171
  - kuby-core.gemspec
152
- - lib/ext/krane/kubernetes_resource.rb
153
172
  - lib/kuby.rb
154
173
  - lib/kuby/basic_logger.rb
155
174
  - lib/kuby/cli_base.rb
@@ -192,28 +211,32 @@ files:
192
211
  - lib/kuby/kubernetes/errors.rb
193
212
  - lib/kuby/kubernetes/manifest.rb
194
213
  - lib/kuby/kubernetes/minikube_provider.rb
195
- - lib/kuby/kubernetes/plugin.rb
196
- - lib/kuby/kubernetes/plugins.rb
197
- - lib/kuby/kubernetes/plugins/nginx_ingress.rb
198
- - lib/kuby/kubernetes/plugins/rails_app.rb
199
- - lib/kuby/kubernetes/plugins/rails_app/database.rb
200
- - lib/kuby/kubernetes/plugins/rails_app/generators/kuby.rb
201
- - lib/kuby/kubernetes/plugins/rails_app/mysql.rb
202
- - lib/kuby/kubernetes/plugins/rails_app/plugin.rb
203
- - lib/kuby/kubernetes/plugins/rails_app/postgres.rb
204
- - lib/kuby/kubernetes/plugins/rails_app/rewrite_db_config.rb
205
- - lib/kuby/kubernetes/plugins/rails_app/sqlite.rb
206
- - lib/kuby/kubernetes/plugins/rails_app/tasks.rake
207
214
  - lib/kuby/kubernetes/provider.rb
208
215
  - lib/kuby/kubernetes/registry_secret.rb
209
216
  - lib/kuby/kubernetes/spec.rb
210
217
  - lib/kuby/middleware.rb
211
218
  - lib/kuby/middleware/health_check.rb
219
+ - lib/kuby/plugin.rb
220
+ - lib/kuby/plugins.rb
221
+ - lib/kuby/plugins/nginx_ingress.rb
222
+ - lib/kuby/plugins/rails_app.rb
223
+ - lib/kuby/plugins/rails_app/asset_copy_task.rb
224
+ - lib/kuby/plugins/rails_app/assets.rb
225
+ - lib/kuby/plugins/rails_app/database.rb
226
+ - lib/kuby/plugins/rails_app/generators/kuby.rb
227
+ - lib/kuby/plugins/rails_app/mysql.rb
228
+ - lib/kuby/plugins/rails_app/plugin.rb
229
+ - lib/kuby/plugins/rails_app/postgres.rb
230
+ - lib/kuby/plugins/rails_app/rewrite_db_config.rb
231
+ - lib/kuby/plugins/rails_app/sqlite.rb
232
+ - lib/kuby/plugins/rails_app/tasks.rake
212
233
  - lib/kuby/railtie.rb
213
234
  - lib/kuby/tasks.rb
214
235
  - lib/kuby/tasks/kuby.rake
215
236
  - lib/kuby/trailing_hash.rb
216
237
  - lib/kuby/version.rb
238
+ - spec/docker/timestamp_tag_spec.rb
239
+ - spec/spec_helper.rb
217
240
  homepage: http://github.com/getkuby/kuby-core
218
241
  licenses: []
219
242
  metadata: {}