eucalypt 0.1.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 (160) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE +21 -0
  4. data/README.md +26 -0
  5. data/Rakefile +2 -0
  6. data/bin/eucalypt +3 -0
  7. data/eucalypt.gemspec +39 -0
  8. data/lib/eucalypt/app.rb +6 -0
  9. data/lib/eucalypt/controller.rb +10 -0
  10. data/lib/eucalypt/errors.rb +109 -0
  11. data/lib/eucalypt/eucalypt-blog/helpers.rb +106 -0
  12. data/lib/eucalypt/eucalypt-blog/namespaces/blog/__base__.rb +22 -0
  13. data/lib/eucalypt/eucalypt-blog/namespaces/blog/__require__.rb +1 -0
  14. data/lib/eucalypt/eucalypt-blog/namespaces/blog/cli/blog.rb +65 -0
  15. data/lib/eucalypt/eucalypt-blog/namespaces/blog/generators/article.rb +28 -0
  16. data/lib/eucalypt/eucalypt-blog/namespaces/blog/generators/controller.rb +14 -0
  17. data/lib/eucalypt/eucalypt-blog/namespaces/blog/generators/helper.rb +12 -0
  18. data/lib/eucalypt/eucalypt-blog/namespaces/blog/generators/list.rb +74 -0
  19. data/lib/eucalypt/eucalypt-blog/namespaces/blog/generators/views.rb +20 -0
  20. data/lib/eucalypt/eucalypt-blog/namespaces/blog/templates/controller/controller.tt +33 -0
  21. data/lib/eucalypt/eucalypt-blog/namespaces/blog/templates/controller/controller_spec.tt +43 -0
  22. data/lib/eucalypt/eucalypt-blog/namespaces/blog/templates/helper/helper.tt +5 -0
  23. data/lib/eucalypt/eucalypt-blog/namespaces/blog/templates/helper/helper_spec.tt +9 -0
  24. data/lib/eucalypt/eucalypt-blog/namespaces/blog/templates/views/article.erb +1 -0
  25. data/lib/eucalypt/eucalypt-blog/namespaces/blog/templates/views/article_layout.erb +10 -0
  26. data/lib/eucalypt/eucalypt-blog/namespaces/blog/templates/views/article_md.tt +9 -0
  27. data/lib/eucalypt/eucalypt-blog/namespaces/blog/templates/views/articles.erb +1 -0
  28. data/lib/eucalypt/eucalypt-blog/namespaces/blog/templates/views/articles_layout.erb +10 -0
  29. data/lib/eucalypt/eucalypt-blog/namespaces/blog/templates/views/search.erb +1 -0
  30. data/lib/eucalypt/eucalypt-blog/namespaces/blog-article/cli/article.rb +120 -0
  31. data/lib/eucalypt/eucalypt-blog/namespaces/blog-article-edit/cli/edit-datetime.rb +113 -0
  32. data/lib/eucalypt/eucalypt-blog/namespaces/blog-article-edit/cli/edit-urltitle.rb +75 -0
  33. data/lib/eucalypt/eucalypt-core/cli/__base__.rb +11 -0
  34. data/lib/eucalypt/eucalypt-core/cli/console.rb +15 -0
  35. data/lib/eucalypt/eucalypt-core/cli/core.rb +6 -0
  36. data/lib/eucalypt/eucalypt-core/cli/help.rb +11 -0
  37. data/lib/eucalypt/eucalypt-core/cli/init.rb +71 -0
  38. data/lib/eucalypt/eucalypt-core/cli/launch.rb +33 -0
  39. data/lib/eucalypt/eucalypt-core/cli/test.rb +16 -0
  40. data/lib/eucalypt/eucalypt-core/cli/version.rb +11 -0
  41. data/lib/eucalypt/eucalypt-core/templates/Gemfile.tt +35 -0
  42. data/lib/eucalypt/eucalypt-core/templates/eucalypt/.gitignore +48 -0
  43. data/lib/eucalypt/eucalypt-core/templates/eucalypt/.travis.yml +8 -0
  44. data/lib/eucalypt/eucalypt-core/templates/eucalypt/Procfile +1 -0
  45. data/lib/eucalypt/eucalypt-core/templates/eucalypt/Rakefile +7 -0
  46. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/assets/fonts/.empty_directory +0 -0
  47. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/assets/images/.empty_directory +0 -0
  48. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/assets/scripts/application.js +17 -0
  49. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/assets/stylesheets/__partials__.scss +16 -0
  50. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/assets/stylesheets/application.scss +17 -0
  51. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/assets/stylesheets/partials/_mixins.scss +54 -0
  52. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/controllers/application_controller.rb +7 -0
  53. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/helpers/application_helper.rb +3 -0
  54. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/models/.empty_directory +0 -0
  55. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/static/.empty_directory +0 -0
  56. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/static/readme.yml +34 -0
  57. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/views/index.erb +0 -0
  58. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/views/layouts/main.erb +9 -0
  59. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app/views/partials/.empty_directory +0 -0
  60. data/lib/eucalypt/eucalypt-core/templates/eucalypt/app.rb +42 -0
  61. data/lib/eucalypt/eucalypt-core/templates/eucalypt/config/active_record.rb +6 -0
  62. data/lib/eucalypt/eucalypt-core/templates/eucalypt/config/asset_pipeline.rb +15 -0
  63. data/lib/eucalypt/eucalypt-core/templates/eucalypt/config/database.yml +16 -0
  64. data/lib/eucalypt/eucalypt-core/templates/eucalypt/config/initializers/.empty_directory +0 -0
  65. data/lib/eucalypt/eucalypt-core/templates/eucalypt/config/logging.rb +27 -0
  66. data/lib/eucalypt/eucalypt-core/templates/eucalypt/config/manifest.rb +15 -0
  67. data/lib/eucalypt/eucalypt-core/templates/eucalypt/config.ru +10 -0
  68. data/lib/eucalypt/eucalypt-core/templates/eucalypt/log/.empty_directory +0 -0
  69. data/lib/eucalypt/eucalypt-core/templates/eucalypt/spec/controllers/application_controller_spec.rb +9 -0
  70. data/lib/eucalypt/eucalypt-core/templates/eucalypt/spec/helpers/application_helper_spec.rb +9 -0
  71. data/lib/eucalypt/eucalypt-core/templates/eucalypt/spec/models/.empty_directory +0 -0
  72. data/lib/eucalypt/eucalypt-core/templates/eucalypt/spec/spec_helper.rb +18 -0
  73. data/lib/eucalypt/eucalypt-destroy/helpers.rb +77 -0
  74. data/lib/eucalypt/eucalypt-destroy/namespaces/destroy/cli/destroy-controller.rb +16 -0
  75. data/lib/eucalypt/eucalypt-destroy/namespaces/destroy/cli/destroy-helper.rb +16 -0
  76. data/lib/eucalypt/eucalypt-destroy/namespaces/destroy/cli/destroy-model.rb +16 -0
  77. data/lib/eucalypt/eucalypt-destroy/namespaces/destroy/cli/destroy-scaffold.rb +63 -0
  78. data/lib/eucalypt/eucalypt-destroy/namespaces/destroy/cli/destroy.rb +21 -0
  79. data/lib/eucalypt/eucalypt-generate/.gitkeep +0 -0
  80. data/lib/eucalypt/eucalypt-generate/namespaces/generate/cli/generate-scaffold.rb +62 -0
  81. data/lib/eucalypt/eucalypt-generate/namespaces/generate/cli/generate.rb +24 -0
  82. data/lib/eucalypt/eucalypt-generate/namespaces/generate-controller/cli/generate-controller.rb +29 -0
  83. data/lib/eucalypt/eucalypt-generate/namespaces/generate-controller/generators/controller.rb +45 -0
  84. data/lib/eucalypt/eucalypt-generate/namespaces/generate-controller/templates/controller/controller.tt +3 -0
  85. data/lib/eucalypt/eucalypt-generate/namespaces/generate-controller/templates/controller/policy_rest_controller.tt +71 -0
  86. data/lib/eucalypt/eucalypt-generate/namespaces/generate-controller/templates/controller/rest_controller.tt +28 -0
  87. data/lib/eucalypt/eucalypt-generate/namespaces/generate-controller/templates/controller_spec.tt +9 -0
  88. data/lib/eucalypt/eucalypt-generate/namespaces/generate-helper/cli/generate-helper.rb +23 -0
  89. data/lib/eucalypt/eucalypt-generate/namespaces/generate-helper/generators/helper.rb +24 -0
  90. data/lib/eucalypt/eucalypt-generate/namespaces/generate-helper/templates/helper.tt +3 -0
  91. data/lib/eucalypt/eucalypt-generate/namespaces/generate-helper/templates/helper_spec.tt +9 -0
  92. data/lib/eucalypt/eucalypt-generate/namespaces/generate-model/cli/generate-model.rb +26 -0
  93. data/lib/eucalypt/eucalypt-generate/namespaces/generate-model/generators/model.rb +25 -0
  94. data/lib/eucalypt/eucalypt-generate/namespaces/generate-model/templates/model.tt +3 -0
  95. data/lib/eucalypt/eucalypt-generate/namespaces/generate-model/templates/model_spec.tt +8 -0
  96. data/lib/eucalypt/eucalypt-migration/helpers.rb +93 -0
  97. data/lib/eucalypt/eucalypt-migration/migration_base.tt +4 -0
  98. data/lib/eucalypt/eucalypt-migration/namespaces/migration/cli/migration.rb +39 -0
  99. data/lib/eucalypt/eucalypt-migration/namespaces/migration-add/cli/add-column.rb +25 -0
  100. data/lib/eucalypt/eucalypt-migration/namespaces/migration-add/cli/add-index.rb +25 -0
  101. data/lib/eucalypt/eucalypt-migration/namespaces/migration-add/cli/add.rb +18 -0
  102. data/lib/eucalypt/eucalypt-migration/namespaces/migration-add/generators/column.rb +46 -0
  103. data/lib/eucalypt/eucalypt-migration/namespaces/migration-add/generators/index.rb +52 -0
  104. data/lib/eucalypt/eucalypt-migration/namespaces/migration-blank/cli/blank.rb +22 -0
  105. data/lib/eucalypt/eucalypt-migration/namespaces/migration-blank/generators/blank.rb +28 -0
  106. data/lib/eucalypt/eucalypt-migration/namespaces/migration-change/cli/change-column.rb +23 -0
  107. data/lib/eucalypt/eucalypt-migration/namespaces/migration-change/cli/change.rb +17 -0
  108. data/lib/eucalypt/eucalypt-migration/namespaces/migration-change/generators/column.rb +46 -0
  109. data/lib/eucalypt/eucalypt-migration/namespaces/migration-create/cli/create-table.rb +25 -0
  110. data/lib/eucalypt/eucalypt-migration/namespaces/migration-create/cli/create.rb +17 -0
  111. data/lib/eucalypt/eucalypt-migration/namespaces/migration-create/generators/table.rb +53 -0
  112. data/lib/eucalypt/eucalypt-migration/namespaces/migration-drop/cli/drop-column.rb +22 -0
  113. data/lib/eucalypt/eucalypt-migration/namespaces/migration-drop/cli/drop-index.rb +23 -0
  114. data/lib/eucalypt/eucalypt-migration/namespaces/migration-drop/cli/drop-table.rb +22 -0
  115. data/lib/eucalypt/eucalypt-migration/namespaces/migration-drop/cli/drop.rb +19 -0
  116. data/lib/eucalypt/eucalypt-migration/namespaces/migration-drop/generators/column.rb +38 -0
  117. data/lib/eucalypt/eucalypt-migration/namespaces/migration-drop/generators/index.rb +48 -0
  118. data/lib/eucalypt/eucalypt-migration/namespaces/migration-drop/generators/table.rb +37 -0
  119. data/lib/eucalypt/eucalypt-migration/namespaces/migration-rename/cli/rename-column.rb +22 -0
  120. data/lib/eucalypt/eucalypt-migration/namespaces/migration-rename/cli/rename-index.rb +22 -0
  121. data/lib/eucalypt/eucalypt-migration/namespaces/migration-rename/cli/rename-table.rb +24 -0
  122. data/lib/eucalypt/eucalypt-migration/namespaces/migration-rename/cli/rename.rb +19 -0
  123. data/lib/eucalypt/eucalypt-migration/namespaces/migration-rename/generators/column.rb +39 -0
  124. data/lib/eucalypt/eucalypt-migration/namespaces/migration-rename/generators/index.rb +39 -0
  125. data/lib/eucalypt/eucalypt-migration/namespaces/migration-rename/generators/table.rb +38 -0
  126. data/lib/eucalypt/eucalypt-security/helpers.rb +22 -0
  127. data/lib/eucalypt/eucalypt-security/namespaces/security/cli/security.rb +31 -0
  128. data/lib/eucalypt/eucalypt-security/namespaces/security-policy/cli/security-policy.rb +91 -0
  129. data/lib/eucalypt/eucalypt-security/namespaces/security-policy/generators/policy.rb +31 -0
  130. data/lib/eucalypt/eucalypt-security/namespaces/security-policy/templates/create_policy_roles_migration.tt +11 -0
  131. data/lib/eucalypt/eucalypt-security/namespaces/security-policy/templates/policy.tt +16 -0
  132. data/lib/eucalypt/eucalypt-security/namespaces/security-policy-permission/cli/security-policy-permission.rb +62 -0
  133. data/lib/eucalypt/eucalypt-security/namespaces/security-policy-permission/generators/policy-permission.rb +28 -0
  134. data/lib/eucalypt/eucalypt-security/namespaces/security-policy-permission/templates/add_permission_to_policy_migration.tt +5 -0
  135. data/lib/eucalypt/eucalypt-security/namespaces/security-policy-role/cli/security-policy-role.rb +66 -0
  136. data/lib/eucalypt/eucalypt-security/namespaces/security-pundit/cli/security-pundit.rb +79 -0
  137. data/lib/eucalypt/eucalypt-security/namespaces/security-pundit/generators/role.rb +24 -0
  138. data/lib/eucalypt/eucalypt-security/namespaces/security-pundit/templates/create_roles_migration.tt +7 -0
  139. data/lib/eucalypt/eucalypt-security/namespaces/security-pundit/templates/pundit.tt +4 -0
  140. data/lib/eucalypt/eucalypt-security/namespaces/security-warden/cli/security-warden.rb +61 -0
  141. data/lib/eucalypt/eucalypt-security/namespaces/security-warden/generators/auth_controller.rb +34 -0
  142. data/lib/eucalypt/eucalypt-security/namespaces/security-warden/generators/user.rb +37 -0
  143. data/lib/eucalypt/eucalypt-security/namespaces/security-warden/templates/auth_controller.tt +25 -0
  144. data/lib/eucalypt/eucalypt-security/namespaces/security-warden/templates/auth_login.tt +1 -0
  145. data/lib/eucalypt/eucalypt-security/namespaces/security-warden/templates/create_users_table_migration.tt +9 -0
  146. data/lib/eucalypt/eucalypt-security/namespaces/security-warden/templates/user.tt +16 -0
  147. data/lib/eucalypt/eucalypt-security/namespaces/security-warden/templates/warden.tt +35 -0
  148. data/lib/eucalypt/eucalypt-security/namespaces/security-warden/user_confirm.rb +38 -0
  149. data/lib/eucalypt/helpers/colorize.rb +27 -0
  150. data/lib/eucalypt/helpers/gemfile.rb +48 -0
  151. data/lib/eucalypt/helpers/inflect.rb +79 -0
  152. data/lib/eucalypt/helpers/messages.rb +31 -0
  153. data/lib/eucalypt/helpers/migration.rb +85 -0
  154. data/lib/eucalypt/helpers/numeric.rb +10 -0
  155. data/lib/eucalypt/helpers.rb +6 -0
  156. data/lib/eucalypt/list.rb +39 -0
  157. data/lib/eucalypt/static.rb +48 -0
  158. data/lib/eucalypt/version.rb +3 -0
  159. data/lib/eucalypt.rb +19 -0
  160. metadata +373 -0
@@ -0,0 +1,16 @@
1
+ require 'eucalypt/eucalypt-security/namespaces/security-warden/user_confirm'
2
+ class User < ActiveRecord::Base
3
+ validates :username, presence: true, uniqueness: true
4
+ validates :encrypted_password, presence: true
5
+
6
+ include BCrypt
7
+
8
+ def authenticate(attempt)
9
+ Password.new(self.encrypted_password) == attempt
10
+ end
11
+
12
+ def password=(entered_password)
13
+ @password = Password.create(entered_password)
14
+ self.encrypted_password = @password
15
+ end
16
+ end
@@ -0,0 +1,35 @@
1
+ class ApplicationController < Sinatra::Base
2
+ # Configure Warden for authentication
3
+ enable :sessions
4
+
5
+ use Warden::Manager do |config|
6
+ config.serialize_into_session{|user| user.id}
7
+ config.serialize_from_session{|id| User.find(id)}
8
+ config.scope_defaults :default, strategies: [:password], action: 'auth/invalid'
9
+ config.failure_app = self
10
+ end
11
+
12
+ Warden::Manager.before_failure {|env,opts| env['REQUEST_METHOD'] = 'POST'}
13
+ Warden::Strategies.add(:password) do
14
+ def valid?
15
+ params['user'] && params['user']['username'] && params['user']['password']
16
+ end
17
+ def authenticate!
18
+ unless (user = User.find_by_username params['user']['username'])
19
+ fail! 'The username you entered does not exist'
20
+ else
21
+ user.authenticate(params['user']['password']) ? success!(user) : fail!('Could not log in')
22
+ end
23
+ end
24
+ end
25
+
26
+ helpers do
27
+ def current_user
28
+ env['warden'].user
29
+ end
30
+
31
+ def authenticate
32
+ env['warden'].authenticate!
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,38 @@
1
+ class User < ActiveRecord::Base
2
+ def with_confirm(*fields)
3
+ return if fields.empty?
4
+ fields.map(&:to_sym).each {|field| instance_variable_set "@with_confirm_#{field}", true }
5
+ class_eval do
6
+ attr_accessor *fields.map {|field| "#{field}_confirmation".to_sym }
7
+ attr_reader *fields.map {|field| field.to_sym }.reject {|field| field != :password}
8
+ end
9
+
10
+ fields.each do |field|
11
+ confirm = "confirm_#{field}".to_sym
12
+ define_singleton_method confirm do
13
+ if instance_variable_get "@with_#{confirm}"
14
+ case field
15
+ when :password
16
+ return if @password.nil?
17
+ unless authenticate @password_confirmation
18
+ errors.add :password_confirmation, "Passwords don't match"
19
+ end
20
+ else
21
+ actual = self.send field
22
+ return if actual.nil?
23
+ confirmation = instance_variable_get "@#{field}_confirmation"
24
+ unless actual == confirmation
25
+ errors.add "#{field}_confirmation", "#{field.to_s.pluralize.capitalize} don't match"
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ class_eval do
32
+ private confirm
33
+ validate confirm
34
+ end
35
+ end
36
+ self
37
+ end
38
+ end
@@ -0,0 +1,27 @@
1
+ module Eucalypt
2
+ module Helpers
3
+ module Colorize
4
+ ANSI = {
5
+ bold: '1',
6
+ red: '91',
7
+ yellow: '93',
8
+ blue: '94',
9
+ magenta: '95',
10
+ pale_blue: '34',
11
+ underline: '4',
12
+ grey: '90'
13
+ }
14
+
15
+ refine String do
16
+ def colorize(*opts)
17
+ "\e[#{opts.map{|o| ANSI[o]}*?;}m#{self}\e[0m"
18
+ end
19
+
20
+ def uncolorize
21
+ result = self.gsub /\e(\[|\])[0-9]+[0-9;]*m/, ''
22
+ result.nil? ? self : result
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,48 @@
1
+ require 'thor'
2
+ require 'eucalypt/errors'
3
+
4
+ module Eucalypt
5
+ module Helpers
6
+ module Gemfile
7
+ def gemfile_add(description, gems, directory)
8
+ gemfile = File.join(directory, 'Gemfile')
9
+ File.open gemfile do |f|
10
+ includes_gems = []
11
+ contents = f.read
12
+ gems.each do |gem, _|
13
+ includes_gems << true if contents.include? "gem '#{gem}'"
14
+ end
15
+ return unless includes_gems.empty?
16
+ end
17
+
18
+ append_to_file gemfile, "\n# #{description}\n"
19
+ gems.each_with_index do |gemdata, i|
20
+ gem, version = gemdata
21
+ gem_string = "gem '#{gem}', '#{version}'" << (i==gems.size-1 ? '' : "\n")
22
+ append_to_file gemfile, gem_string
23
+ end
24
+ end
25
+
26
+ class << self
27
+ def include?(gems, directory)
28
+ includes_gems = []
29
+ gemfile = File.join(directory, 'Gemfile')
30
+ File.open gemfile do |f|
31
+ contents = f.read
32
+ gems.each {|gem| includes_gems << contents.include?("gem '#{gem}'") }
33
+ end
34
+ includes_gems.all? {|present| present == true}
35
+ end
36
+
37
+ def check(gems, command, directory)
38
+ if include?(gems, directory)
39
+ true
40
+ else
41
+ Eucalypt::Error.no_gems(gems, command)
42
+ false
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,79 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+
4
+ module Eucalypt
5
+ module Helpers
6
+ class Inflect
7
+ class << self
8
+ def route(string)
9
+ string.
10
+ underscore.
11
+ parameterize(separator: ?-).
12
+ gsub(?_,?-).
13
+ sub(/(^\-+?)(?=[A-Za-z0-9])/,'').
14
+ reverse.
15
+ sub(/(^\-+?)(?=[A-Za-z0-9])/,'').
16
+ reverse.
17
+ gsub(/\-\-+/,?-)
18
+ end
19
+
20
+ def resource(string)
21
+ route(string).gsub(?-,?_).singularize
22
+ end
23
+
24
+ def resources(string)
25
+ route(string).gsub(?-,?_).pluralize
26
+ end
27
+
28
+ def resource_keep_inflection(string)
29
+ route(string).gsub(?-,?_)
30
+ end
31
+
32
+ def constant(string)
33
+ resource(string).camelize
34
+ end
35
+
36
+ def constant_pluralize(string)
37
+ resources(string).camelize
38
+ end
39
+
40
+ %i[controller helper policy].each do |type|
41
+ define_method type do |string|
42
+ s = resource(string.singularize)
43
+ if s.end_with? "_#{type}"
44
+ name = s.split("_#{type}").first
45
+ "#{name.singularize}_#{type}"
46
+ else
47
+ "#{s.singularize}_#{type}"
48
+ end
49
+ end
50
+ end
51
+
52
+ def model(string)
53
+ resource(string.singularize)
54
+ end
55
+ end
56
+
57
+ attr_reader :name,
58
+ :file_name, :file_path,
59
+ :spec_name, :spec_path,
60
+ :class_name, :route_name,
61
+ :resource, :resources,
62
+ :constant
63
+
64
+ def initialize(type, name)
65
+ type = type
66
+ @name = Inflect.send(type, name.to_s)
67
+ @file_name = "#{@name}.rb"
68
+ @file_path = File.join('app', type.to_s.pluralize, file_name)
69
+ @spec_name = "#{@name}_spec.rb"
70
+ @spec_path = File.join('spec', type.to_s.pluralize, spec_name)
71
+ @class_name = Inflect.constant(@name)
72
+ @route_name = Inflect.route(@name.gsub "_#{type}", '')
73
+ @resource = Inflect.resource(@route_name)
74
+ @resources = Inflect.resources(@route_name)
75
+ @constant = Inflect.constant(@route_name)
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,31 @@
1
+ require_relative 'colorize'
2
+ module Eucalypt
3
+ module Helpers
4
+ module Messages
5
+ module Out
6
+ using Eucalypt::Helpers::Colorize
7
+ METHODS = {
8
+ warning: [:bold, :yellow],
9
+ error: [:bold, :red],
10
+ info: [:bold]
11
+ }
12
+
13
+ class << self
14
+ METHODS.each do |method, opts|
15
+ define_method "#{method}_message" do |message = String.new|
16
+ "#{method.to_s.upcase.colorize(*opts)}: #{message}"
17
+ end
18
+
19
+ define_method method do |message = String.new|
20
+ puts self.send("#{method}_message", message)
21
+ end
22
+ end
23
+
24
+ def setup(message = String.new)
25
+ puts "\n#{message.colorize(:bold, :blue)}"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,85 @@
1
+ require 'thor'
2
+ require_relative 'messages'
3
+ require 'eucalypt/errors'
4
+ require 'eucalypt/helpers'
5
+
6
+ module Eucalypt
7
+ module Helpers
8
+ class Migration < Thor
9
+ include Thor::Actions
10
+ include Eucalypt::Helpers
11
+ include Eucalypt::Helpers::Messages
12
+ using Colorize
13
+ attr_reader :title, :template, :file, :base, :file_path
14
+
15
+ class << self
16
+ alias_method :[], :new
17
+ end
18
+
19
+ no_tasks do
20
+ def initialize(title:, template:)
21
+ @title = title
22
+ @template = template
23
+ @file = Time.now.utc.strftime("%Y%m%d%H%M%S_#{title}.rb")
24
+ @base = File.join 'db', 'migrate'
25
+ @file_path = File.join @base, @file
26
+ end
27
+
28
+ def exists?
29
+ Dir[File.join @base, '*.rb'].any? {|f| f.include? @title}
30
+ end
31
+
32
+ def create_anyway?
33
+ %w[y Y Yes YES].include? create_anyway_prompt
34
+ end
35
+ end
36
+
37
+ class Validation
38
+ attr_reader :invalid_declarations, :invalid_types
39
+
40
+ COLUMN_TYPES = %i[
41
+ binary boolean date datetime decimal float integer
42
+ bigint primary_key references string text time timestamp
43
+ ]
44
+
45
+ DECLARATION_REGEX = /\A[A-Za-z0-9_]+\:[a-z_]+\Z/
46
+
47
+ def initialize(columns)
48
+ @invalid_declarations = []
49
+ @invalid_types = []
50
+
51
+ columns.each do |column|
52
+ if self.class.valid_declaration? column
53
+ col, type = column.split ?:
54
+ @invalid_types << {column: col, type: type} unless COLUMN_TYPES.include? type.to_sym
55
+ else
56
+ @invalid_declarations << column
57
+ end
58
+ end
59
+ end
60
+
61
+ def any_invalid?
62
+ any_invalid = @invalid_declarations.any? || @invalid_types.any?
63
+ Eucalypt::Error.invalid_columns(@invalid_declarations, @invalid_types) if any_invalid
64
+ return any_invalid
65
+ end
66
+
67
+ def self.valid_declaration?(column)
68
+ DECLARATION_REGEX.match? column
69
+ end
70
+
71
+ def self.valid_type?(type)
72
+ valid_type = COLUMN_TYPES.include? type.to_sym
73
+ Eucalypt::Error.invalid_type(type) unless valid_type
74
+ return valid_type
75
+ end
76
+ end
77
+
78
+ private
79
+
80
+ def create_anyway_prompt
81
+ ask Out.warning_message("A #{@title.colorize(:bold)} migration already exists. Create anyway?"), limited_to: %w[y Y Yes YES n N No NO]
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,10 @@
1
+ module Eucalypt
2
+ module Helpers
3
+ module Numeric
4
+ def self.string?(string)
5
+ return true if string =~ /\A\d+\Z/
6
+ true if Float(string) rescue false
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'helpers/gemfile'
2
+ require_relative 'helpers/migration'
3
+ require_relative 'helpers/colorize'
4
+ require_relative 'helpers/messages'
5
+ require_relative 'helpers/inflect'
6
+ require_relative 'helpers/numeric'
@@ -0,0 +1,39 @@
1
+ require 'thor'
2
+ require 'eucalypt/app'
3
+ require 'eucalypt/helpers/colorize'
4
+
5
+ module Eucalypt
6
+ module List
7
+ include Eucalypt::Helpers
8
+ using Colorize
9
+
10
+ INDENT = 2.freeze
11
+
12
+ def help(shell, subcommand = false)
13
+ list = printable_commands(true, subcommand)
14
+ Thor::Util.thor_classes_in(self).each do |klass|
15
+ list += klass.printable_commands(false)
16
+ end
17
+
18
+ list.reject! do |l|
19
+ cmd = l.first
20
+ cmd.include?('help') || cmd.include?('-H')
21
+ end
22
+ list.map {|l| l.last.sub!(?#, '·'.colorize(:pale_blue, :bold)+'›')}
23
+
24
+ if defined?(@package_name) && @package_name
25
+ shell.say "#{@package_name} commands:"
26
+ else
27
+ shell.say
28
+ shell.say "#{"Commands".colorize(:bold)}:"
29
+ end
30
+
31
+ shell.print_table(list, indent: INDENT, truncate: false)
32
+ shell.say
33
+ class_options_help(shell)
34
+
35
+ shell.say "For more information about a specific command, use #{"eucalypt -H".colorize(:pale_blue)}."
36
+ shell.say "Example: eucalypt -H generate scaffold".colorize(:grey)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,48 @@
1
+ require 'eucalypt/helpers/inflect'
2
+ require 'json'
3
+ require 'yaml'
4
+
5
+ module Eucalypt
6
+ class Static
7
+ include Eucalypt::Helpers
8
+
9
+ FILE_TYPES = {yaml: %w[yml yaml], json: %w[json geojson]}
10
+
11
+ def initialize(directory, symbolize: false)
12
+ contents = Dir[File.join directory, '*']
13
+ files = contents.select {|f| File.file? f}
14
+ subdirectories = contents.select {|f| File.directory? f}
15
+ files.each {|f| define_file_accessor f, symbolize}
16
+ subdirectories.each {|s| define_subdirectory_accessor s, symbolize}
17
+ end
18
+
19
+ private
20
+
21
+ def define_file_accessor(file, symbolize)
22
+ file_name = File.basename file, '.*'
23
+ extension = File.extname(file).sub /\A./, ''
24
+ file_type = nil
25
+ FILE_TYPES.each {|t, e| file_type = t if e.include? extension}
26
+ raise TypeError.new("Unsupported extension: .#{extension}") if file_type.nil?
27
+ define_singleton_method Inflect.resource_keep_inflection(file_name) do
28
+ hash = parse(file_type, file)
29
+ hash = hash ? hash : {}
30
+ symbolize ? hash.deep_symbolize_keys : hash
31
+ end
32
+ end
33
+
34
+ def define_subdirectory_accessor(subdirectory, symbolize)
35
+ subdirectory_name = subdirectory.split(File::SEPARATOR).last
36
+ define_singleton_method Inflect.resource_keep_inflection(subdirectory_name) do
37
+ Static.new subdirectory, symbolize: symbolize
38
+ end
39
+ end
40
+
41
+ def parse(file_type, file)
42
+ case file_type
43
+ when :yaml then YAML.load_file(file)
44
+ when :json then JSON.parse(File.read file)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ module Eucalypt
2
+ VERSION = '0.1.0'
3
+ end
data/lib/eucalypt.rb ADDED
@@ -0,0 +1,19 @@
1
+ require 'eucalypt/version'
2
+ require 'eucalypt/eucalypt-core/cli/core'
3
+ require 'eucalypt/eucalypt-blog/namespaces/blog/cli/blog'
4
+ require 'eucalypt/eucalypt-generate/namespaces/generate/cli/generate'
5
+ require 'eucalypt/eucalypt-destroy/namespaces/destroy/cli/destroy'
6
+ require 'eucalypt/eucalypt-security/namespaces/security/cli/security'
7
+ require 'eucalypt/eucalypt-migration/namespaces/migration/cli/migration'
8
+ require 'eucalypt/static'
9
+ require 'eucalypt/controller'
10
+ require 'eucalypt/app'
11
+
12
+ module Eucalypt
13
+ class CLI < Thor
14
+ class << self
15
+ require 'eucalypt/list'
16
+ include Eucalypt::List
17
+ end
18
+ end
19
+ end