heartwood 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +28 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +4 -0
  8. data/Rakefile +20 -0
  9. data/app/controllers/cambium/base_controller.rb +3 -0
  10. data/app/models/concerns/idx.rb +28 -0
  11. data/app/models/concerns/image_cropper.rb +24 -0
  12. data/app/models/concerns/publishable.rb +57 -0
  13. data/app/models/concerns/slug.rb +56 -0
  14. data/app/models/concerns/tags.rb +33 -0
  15. data/bin/rails +12 -0
  16. data/config/routes.rb +2 -0
  17. data/heartwood.gemspec +43 -0
  18. data/lib/generators/cambium/app_generator.rb +205 -0
  19. data/lib/generators/cambium/controller_generator.rb +81 -0
  20. data/lib/generators/cambium/gemfile_generator.rb +36 -0
  21. data/lib/generators/cambium/install_generator.rb +19 -0
  22. data/lib/generators/cambium/user_generator.rb +40 -0
  23. data/lib/generators/helpers/_autoloader.rb +12 -0
  24. data/lib/generators/helpers/generators_helper.rb +235 -0
  25. data/lib/generators/templates/Gemfile.erb +78 -0
  26. data/lib/generators/templates/app/assets/javascripts/application.js.coffee +24 -0
  27. data/lib/generators/templates/app/assets/javascripts/routers/router.js.coffee +23 -0
  28. data/lib/generators/templates/app/assets/javascripts/templates/.keep +0 -0
  29. data/lib/generators/templates/app/assets/javascripts/views/default_helpers.js.coffee +16 -0
  30. data/lib/generators/templates/app/assets/stylesheets/admin/admin.scss +3 -0
  31. data/lib/generators/templates/app/assets/stylesheets/application.scss +9 -0
  32. data/lib/generators/templates/app/controllers/admin/controller.rb.erb +2 -0
  33. data/lib/generators/templates/app/controllers/application_controller.rb +11 -0
  34. data/lib/generators/templates/app/models/user.rb +14 -0
  35. data/lib/generators/templates/app/views/application/_status.html.erb +3 -0
  36. data/lib/generators/templates/app/views/home/index.html.erb +7 -0
  37. data/lib/generators/templates/app/views/layouts/application.html.erb +24 -0
  38. data/lib/generators/templates/config/application.rb +17 -0
  39. data/lib/generators/templates/config/initializers/_hash.rb +23 -0
  40. data/lib/generators/templates/config/initializers/_settings.rb +18 -0
  41. data/lib/generators/templates/config/initializers/assets.rb +3 -0
  42. data/lib/generators/templates/config/initializers/heartwood.rb +25 -0
  43. data/lib/generators/templates/config/private.yml +16 -0
  44. data/lib/generators/templates/config/routes.rb +54 -0
  45. data/lib/generators/templates/config/settings.yml +16 -0
  46. data/lib/generators/templates/db/seeds.rb +25 -0
  47. data/lib/generators/templates/gitignore +30 -0
  48. data/lib/heartwood/configuration.rb +29 -0
  49. data/lib/heartwood/engine.rb +28 -0
  50. data/lib/heartwood/support/array.rb +9 -0
  51. data/lib/heartwood/support/false_class.rb +9 -0
  52. data/lib/heartwood/support/fixnum.rb +13 -0
  53. data/lib/heartwood/support/float.rb +5 -0
  54. data/lib/heartwood/support/hash.rb +22 -0
  55. data/lib/heartwood/support/nil_class.rb +19 -0
  56. data/lib/heartwood/support/string.rb +28 -0
  57. data/lib/heartwood/support/true_class.rb +9 -0
  58. data/lib/heartwood/version.rb +3 -0
  59. data/lib/heartwood.rb +11 -0
  60. data/lib/help/heartwood_prereqs.txt +13 -0
  61. data/lib/help/pg_search_post_install.txt +13 -0
  62. data/lib/tasks/db.rake +22 -0
  63. data/lib/tasks/rename.rake +28 -0
  64. data/spec/dummy/README.rdoc +28 -0
  65. data/spec/dummy/Rakefile +6 -0
  66. data/spec/dummy/app/assets/images/.keep +0 -0
  67. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  68. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  69. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  70. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  71. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  72. data/spec/dummy/app/mailers/.keep +0 -0
  73. data/spec/dummy/app/models/.keep +0 -0
  74. data/spec/dummy/app/models/concerns/.keep +0 -0
  75. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  76. data/spec/dummy/bin/bundle +3 -0
  77. data/spec/dummy/bin/rails +4 -0
  78. data/spec/dummy/bin/rake +4 -0
  79. data/spec/dummy/bin/setup +29 -0
  80. data/spec/dummy/config/application.rb +32 -0
  81. data/spec/dummy/config/boot.rb +5 -0
  82. data/spec/dummy/config/database.yml +25 -0
  83. data/spec/dummy/config/environment.rb +5 -0
  84. data/spec/dummy/config/environments/development.rb +41 -0
  85. data/spec/dummy/config/environments/production.rb +79 -0
  86. data/spec/dummy/config/environments/test.rb +42 -0
  87. data/spec/dummy/config/initializers/assets.rb +11 -0
  88. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  89. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  90. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  91. data/spec/dummy/config/initializers/inflections.rb +16 -0
  92. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  93. data/spec/dummy/config/initializers/session_store.rb +3 -0
  94. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  95. data/spec/dummy/config/locales/en.yml +23 -0
  96. data/spec/dummy/config/routes.rb +4 -0
  97. data/spec/dummy/config/secrets.yml +22 -0
  98. data/spec/dummy/config.ru +4 -0
  99. data/spec/dummy/db/development.sqlite3 +0 -0
  100. data/spec/dummy/db/heartwood_development.sqlite3 +0 -0
  101. data/spec/dummy/db/heartwood_test.sqlite3 +0 -0
  102. data/spec/dummy/db/schema.rb +15 -0
  103. data/spec/dummy/db/test.sqlite3 +0 -0
  104. data/spec/dummy/lib/assets/.keep +0 -0
  105. data/spec/dummy/log/.keep +0 -0
  106. data/spec/dummy/log/development.log +78 -0
  107. data/spec/dummy/log/test.log +3050 -0
  108. data/spec/dummy/public/404.html +67 -0
  109. data/spec/dummy/public/422.html +67 -0
  110. data/spec/dummy/public/500.html +66 -0
  111. data/spec/dummy/public/favicon.ico +0 -0
  112. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1i/1ii3yPGPbB0S_BkYiwVDC7qlKvhKF5P0zr7QiaTpgV4.cache +0 -0
  113. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5L/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +0 -0
  114. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7k/7kqdQ5LCh-fs6HP4CUqWvk9w7HRuj6ZT_zkC-hUUMHU.cache +0 -0
  115. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8M/8Mpbgok-UsQPhrJQKqd6hVtQogD8YuU6GMn-2KVhC3E.cache +1 -0
  116. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Au/AuOTcA4Uen3sMQjy8Mi6nooP_8gMgvlFsjqr8mHpMIs.cache +0 -0
  117. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FG/FGeBOdRSmza-XfWb8ERFQydMrExKmdlz2_eksYO3y4Q.cache +1 -0
  118. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MB/MBqa7cQSBGYszhtbC7r7yiDA0gjwriFrAaNiQnMbfFw.cache +1 -0
  119. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ML/MLT6NKtdybeBwpm6H1d7XzkomTyZnMge5E8EEQkhtrc.cache +1 -0
  120. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OI/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +0 -0
  121. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R2/R2IjUuzOFtsZdvjOQOrasVwjaCegvj-lE6jkTQFL9xs.cache +1 -0
  122. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WB/WB2XiMJ4O7--cvm29FJ4zeUyMpU15sqdYtfduF0YeT0.cache +1 -0
  123. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YT/YTDOaZ9qOx03chcaLrJy-Ch0Rtn4Nik102vwxZ2a-k8.cache +1 -0
  124. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aB/aBAdNO31MRRIPsReAdfHmtSFswygiBIFctx6fBhTTdc.cache +0 -0
  125. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fK/fKCgrNQR1G7Gf6VTItx7NTaKXquuw-ufNT5nGlxvBV4.cache +0 -0
  126. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hZ/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +0 -0
  127. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hr/hrKDaC8EYPX0veGxFTXgYt7IynAdYyeBjYjzcPazQkk.cache +1 -0
  128. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/i4/i4-E3GFC6rOjx1w5H9W14IbdPm4ouzkqixHmsK27kmo.cache +0 -0
  129. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jE/jEmEy4r1QfD5kzXcHSPcAaAgBwet1M0ZIWQuzyT9TXw.cache +0 -0
  130. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/l7/l7FREFh3W4tfuo0mF7DdkXKth9VT4R2hiiiq0KS4xpI.cache +1 -0
  131. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/o8/o8getMbwHiM68k4uUk4shsyjKnDbV_hmifAWyvO-E50.cache +1 -0
  132. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +0 -0
  133. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wA/wAjBFweHcRdsYa4zx9mayhvC0RDVqaI5gM0LcoCv7a4.cache +1 -0
  134. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xW/xWmlGxKNxc1ViyjTyokcbCu6WjNIGDIqPVPXsBwdveA.cache +1 -0
  135. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zP/zPn9M5I_yf8ko0-lpbDwTWjG6wpRvXkA77hDUPzAFZ8.cache +0 -0
  136. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zd/zd90ZPTG89ScoQQ_PzPAAe2669wzpdyZuzn7qmr9e3s.cache +0 -0
  137. data/spec/lib/support/array_spec.rb +14 -0
  138. data/spec/lib/support/false_class_spec.rb +17 -0
  139. data/spec/lib/support/fixnum_spec.rb +23 -0
  140. data/spec/lib/support/float_spec.rb +18 -0
  141. data/spec/lib/support/hash_spec.rb +21 -0
  142. data/spec/lib/support/nil_class_spec.rb +23 -0
  143. data/spec/lib/support/string_spec.rb +44 -0
  144. data/spec/lib/support/true_class_spec.rb +17 -0
  145. data/spec/rails_helper.rb +183 -0
  146. data/spec/spec_helper.rb +99 -0
  147. data/vendor/assets/javascripts/backbone.js +1920 -0
  148. data/vendor/assets/javascripts/modernizr.js +4 -0
  149. data/vendor/assets/javascripts/underscore.js +1548 -0
  150. data/vendor/assets/stylesheets/normalize.scss +406 -0
  151. metadata +425 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: de123a1818a074db261ed098f4eb3439c0d51bef
4
+ data.tar.gz: 9ec3510f0f9a4d01f013bb0fb4f90b8f56cd563b
5
+ SHA512:
6
+ metadata.gz: 4dc0ea26ee1de4d636255ef34d7456ad54e00072789b274ef2c9c76f64894d79747526b55be521c597a93708c4b3610e4e6bbae47aba41f639165035d0d47334
7
+ data.tar.gz: 426edc2d985fb326659f009e11fd34883157d7459aa816706cc10a1053f793247e88eda485b4bcf482cafd7061aeced7472b9fd720c1c3fc78856e5fdd81f223
data/.gitignore ADDED
@@ -0,0 +1,28 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ tmp
15
+ *.bundle
16
+ *.so
17
+ *.o
18
+ *.a
19
+ mkmf.log
20
+ *.DS_Store
21
+
22
+ # Dummy App for Testing
23
+ spec/dummy/db/*.sqlite3
24
+ spec/dummy/db/*.sqlite3-journal
25
+ spec/dummy/log/*.log
26
+ spec/dummy/tmp/
27
+ spec/dummy/.sass-cache
28
+ spec/reports
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.3
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.3.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in heartwood.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014-2015 Sean C Davis, Warren Harrison
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ Heartwood
2
+ ==========
3
+
4
+ Development in progress ...
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
9
+ load 'rails/tasks/engine.rake'
10
+
11
+ Bundler::GemHelper.install_tasks
12
+
13
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
14
+
15
+ require 'rspec/core'
16
+ require 'rspec/core/rake_task'
17
+
18
+ desc "Run all specs in spec directory (excluding plugin specs)"
19
+ RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
20
+ task :default => :spec
@@ -0,0 +1,3 @@
1
+ class Heartwood::BaseController < ActionController::Base
2
+ protect_from_forgery
3
+ end
@@ -0,0 +1,28 @@
1
+ module Idx
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+
6
+ # ------------------------------------------ Scopes
7
+
8
+ scope :by_idx, -> { reorder('idx asc') }
9
+
10
+ # ------------------------------------------ Callbacks
11
+
12
+ after_create :create_idx
13
+
14
+ end
15
+
16
+ # ------------------------------------------ Instance Methods
17
+
18
+ def to_param
19
+ idx.to_s
20
+ end
21
+
22
+ def create_idx
23
+ last_obj = self.idx_class.send(self.class.table_name).by_idx.last
24
+ idx = last_obj.idx + 1
25
+ update_columns(:idx => idx)
26
+ end
27
+
28
+ end
@@ -0,0 +1,24 @@
1
+ module ImageCropper
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+
6
+ # We use these accessors to pass values to CarrierWave and RMagick without
7
+ # needing to store them in the database.
8
+ #
9
+ attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
10
+
11
+ # Like the accessors, this is used for cropping images.
12
+ #
13
+ after_update :crop_image
14
+ end
15
+
16
+ # This simply makes carrierwave and rmagick recreate all its versions. We only
17
+ # call it if the `crop_x` attribute is present, as we use that as our trigger.
18
+ # Otherwise, we're recreating versions without changing anything.
19
+ #
20
+ def crop_image
21
+ filename.recreate_versions! if crop_x.present?
22
+ end
23
+
24
+ end
@@ -0,0 +1,57 @@
1
+ module Publishable
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+
6
+ # --------------------------------- Attributes
7
+
8
+ attr_accessor :active, :active_date, :active_time, :inactive_date,
9
+ :inactive_time
10
+
11
+ # --------------------------------- Scopes
12
+
13
+ scope :published, -> { where("(active_at <= ? AND inactive_at > ?) OR
14
+ (active_at <= ? AND inactive_at IS ?)",
15
+ Time.now, Time.now, Time.now, nil) }
16
+ scope :unpublished, -> { where("active_at > ? OR inactive_at < ? OR
17
+ (active_at IS ? AND inactive_at IS ?)",
18
+ Time.now, Time.now, nil, nil) }
19
+
20
+ end
21
+
22
+ # --------------------------------- Instance Methods
23
+
24
+ def published?
25
+ return false if active_at.nil?
26
+ (active_at <= Time.now and inactive_at == nil) or
27
+ (active_at <= Time.now and inactive_at >= Time.now)
28
+ end
29
+
30
+ def formatted_active_date
31
+ formatted_date(active_at)
32
+ end
33
+
34
+ def formatted_inactive_date
35
+ formatted_date(inactive_at)
36
+ end
37
+
38
+ def formatted_date(date)
39
+ return '' if date.nil?
40
+ date.strftime("%d %B, %Y")
41
+ end
42
+
43
+ def formatted_active_time
44
+ return '' if active_at.nil?
45
+ active_at.strftime("%l:%M %p")
46
+ end
47
+
48
+ def formatted_inactive_time
49
+ return '' if inactive_at.nil?
50
+ inactive_at.strftime("%l:%M %p")
51
+ end
52
+
53
+ def publish!
54
+ update_column :active_at, Time.now
55
+ end
56
+
57
+ end
@@ -0,0 +1,56 @@
1
+ module Slug
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ after_save :sluggify_slug
6
+
7
+ def self.find(input)
8
+ input.to_i == 0 ? find_by_slug(input) : super
9
+ end
10
+ end
11
+
12
+ def sluggify_slug
13
+ if slug.blank?
14
+ update_column(:slug, create_slug)
15
+ else
16
+ new_slug = slug.gsub(/[^a-zA-Z0-9 \-]/, "") # remove all bad characters
17
+ new_slug.gsub!(/\ /, "-") # replace spaces with underscores
18
+ new_slug.gsub!(/\-+/, "-") # replace repeating underscores
19
+ update_column(:slug, new_slug) unless slug == new_slug
20
+ end
21
+ end
22
+
23
+ def create_slug
24
+ slug = self.title.downcase.gsub(/\&/, ' and ') # & -> and
25
+ slug.gsub!(/[^a-zA-Z0-9 \-]/, "") # remove all bad characters
26
+ slug.gsub!(/\ /, "-") # replace spaces with underscores
27
+ slug.gsub!(/\-+/, "-") # replace repeating underscores
28
+
29
+ dups = self.class.name.constantize.where(:slug => slug)
30
+ if dups.count == 1 and dups.first != self
31
+ if self.idx.present?
32
+ slug = "#{slug}-#{self.idx}"
33
+ else
34
+ slug = "#{slug}-#{self.id}"
35
+ end
36
+ end
37
+ slug
38
+ end
39
+
40
+ def make_slug_unique(slug)
41
+ dups = self.class.name.constantize.where(:slug => slug)
42
+ if dups.count == 1 and dups.first != self
43
+ if self.idx.present?
44
+ slug = "#{slug}-#{self.idx}"
45
+ else
46
+ slug = "#{slug}-#{self.id}"
47
+ end
48
+ end
49
+ slug
50
+ end
51
+
52
+ def to_param
53
+ slug
54
+ end
55
+
56
+ end
@@ -0,0 +1,33 @@
1
+ module Tags
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ has_many :taggings, :as => :taggable
6
+ has_many :tags, :through => :taggings
7
+
8
+ attr_accessor :tag_list
9
+
10
+ after_save :update_tags!
11
+ end
12
+
13
+ def update_tags!
14
+ unless tag_list.nil?
15
+ self.tags = []
16
+ used_tags = []
17
+ tag_list.split(',').each do |name|
18
+ name.strip!
19
+ if !used_tags.include?(name) && name.present?
20
+ used_tags << name
21
+ tag = Tag.where(:ci_name => name.downcase).first
22
+ if tag.nil?
23
+ tag = Tag.create(:name => name)
24
+ else
25
+ tag.update(:name => name) unless name == tag.name
26
+ end
27
+ self.tags << tag
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ end
data/bin/rails ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application.
3
+
4
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
5
+ ENGINE_PATH = File.expand_path('../../lib/heartwood/engine', __FILE__)
6
+
7
+ # Set up gems listed in the Gemfile.
8
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
9
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
10
+
11
+ require 'rails/all'
12
+ require 'rails/engine/commands'
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ Heartwood::Engine.routes.draw do
2
+ end
data/heartwood.gemspec ADDED
@@ -0,0 +1,43 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'heartwood/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "heartwood"
8
+ spec.version = Heartwood::VERSION
9
+ spec.authors = ["Sean C Davis", "Warren Harrison"]
10
+ spec.email = ["scdavis41@gmail.com", "warren@hungry-media.com"]
11
+ spec.summary = %q{Rails generators to facilitate development.}
12
+ spec.description = %q{}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.test_files = Dir["spec/**/*"]
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency 'bundler', '~> 1.14'
21
+ spec.add_development_dependency 'capybara-screenshot'
22
+ spec.add_development_dependency 'capybara'
23
+ spec.add_development_dependency 'database_cleaner'
24
+ spec.add_development_dependency 'factory_girl_rails'
25
+ spec.add_development_dependency 'guard-rspec'
26
+ spec.add_development_dependency 'poltergeist'
27
+ spec.add_development_dependency 'rspec-rails'
28
+ spec.add_development_dependency 'sqlite3'
29
+
30
+ # spec.add_dependency 'ancestry'
31
+ # spec.add_dependency 'bones-rails', '>= 1.1.3'
32
+ # spec.add_dependency 'dragonfly'
33
+ # spec.add_dependency 'kaminari'
34
+ # spec.add_dependency 'mark_it_zero', '~> 0.3.0'
35
+ # spec.add_dependency 'paper_trail'
36
+ # spec.add_dependency 'pg_search'
37
+ # spec.add_dependency 'pickadate-rails'
38
+ spec.add_dependency 'rails', '~> 5.0.0'
39
+ spec.add_dependency 'rake'
40
+ # spec.add_dependency 'superslug', '~> 1.3.0'
41
+ # spec.add_dependency 'trumbowyg_rails'
42
+
43
+ end
@@ -0,0 +1,205 @@
1
+ require 'rake'
2
+ require 'rails/generators'
3
+ require File.expand_path('../../helpers/_autoloader.rb', __FILE__)
4
+
5
+ module Heartwood
6
+ class AppGenerator < Rails::Generators::Base
7
+
8
+ desc "Add all the pieces to your application per your configuration."
9
+
10
+ source_root File.expand_path('../../templates', __FILE__)
11
+
12
+ class_option(
13
+ :config_check,
14
+ :type => :boolean,
15
+ :default => true,
16
+ :description => "Verify config at config/initializers/heartwood.rb"
17
+ )
18
+
19
+ # If there is no configuration file tell the user to run
20
+ # that generator first (unless user has manually
21
+ # overridden).
22
+ #
23
+ def verify_configuration
24
+ if options.config_check?
25
+ unless File.exists?("#{Rails.root}/config/initializers/heartwood.rb")
26
+ help_message('heartwood_prereqs')
27
+ exit
28
+ end
29
+ end
30
+ end
31
+
32
+ # Wrap our config values up in an easier-to-type
33
+ # variable
34
+ #
35
+ def set_config
36
+ @config = Heartwood.configuration
37
+ end
38
+
39
+ # Set root url for mailer in development and production
40
+ #
41
+ def set_url_config
42
+ environment(
43
+ "config.action_mailer.default_url_options = { :host => '#{@config.development_url}' }",
44
+ :env => "development"
45
+ )
46
+ environment(
47
+ "config.action_mailer.default_url_options = { :host => '#{@config.production_url}' }",
48
+ :env => "production"
49
+ )
50
+ end
51
+
52
+ # Add modernizr to our list of assets to precompile when
53
+ # we're ready to deploy
54
+ #
55
+ def set_precompiled_assets
56
+ environment(
57
+ "config.assets.precompile += %w( modernizr.js )",
58
+ :env => "production"
59
+ )
60
+ end
61
+
62
+ # Add settings to application config file
63
+ # (config/application.rb)
64
+ #
65
+ def add_application_config
66
+ environment { file_contents("config/application.rb") }
67
+ end
68
+
69
+ # Assets initializer for Rails 4.1+
70
+ #
71
+ def add_assets_initializer
72
+ file = "config/initializers/assets.rb"
73
+ template(file, file)
74
+ end
75
+
76
+ # Add custom gitignore file
77
+ #
78
+ def add_gitignore
79
+ remove_file ".gitignore"
80
+ template "gitignore", ".gitignore"
81
+ end
82
+
83
+ # Add a default public controller, so we have a working
84
+ # home page when we're done.
85
+ #
86
+ def add_home_controller
87
+ generate "controller home index"
88
+ end
89
+
90
+ # Add our default public views
91
+ #
92
+ def add_public_views
93
+ directory "app/views/application"
94
+ directory "app/views/home", :force => true
95
+ end
96
+
97
+ # Our layouts are templated so we can start with
98
+ # some custom information.
99
+ #
100
+ def add_layouts
101
+ app = "app/views/layouts/application.html.erb"
102
+ template app, app, :force => true
103
+ end
104
+
105
+ # We're going to automatically install backbone unless
106
+ # the user has disabled it
107
+ #
108
+ def add_js_framework
109
+ directory("app/assets/javascripts", "app/assets/javascripts")
110
+ end
111
+
112
+ # Next, we need to replace our application.js file to add
113
+ # backbone and its dependencies, along with our default
114
+ # scripts.
115
+ #
116
+ def add_js_manifest
117
+ app_js = "app/assets/javascripts/application.js"
118
+ remove_file app_js
119
+ app_js += ".coffee"
120
+ template app_js, app_js
121
+ end
122
+
123
+ # Add our application.scss file. Since we don't know what
124
+ # file exists, we look for and delete all and replace with
125
+ # ours.
126
+ #
127
+ def add_public_manifest
128
+ ['css','scss','scss.css'].each do |ext|
129
+ file = "app/assets/stylesheets/application.#{ext}"
130
+ remove_file(file) if File.exists?(file)
131
+ end
132
+ manifest_file = "app/assets/stylesheets/application.scss"
133
+ template manifest_file, manifest_file
134
+ end
135
+
136
+ # Go through standard Devise installation
137
+ #
138
+ def install_devise
139
+ generate "devise:install"
140
+ end
141
+
142
+ # Add a User model
143
+ #
144
+ def add_devise_user_model
145
+ generate "devise User"
146
+ end
147
+
148
+ # Copy our custom user model template into the app
149
+ #
150
+ def add_user_model_file
151
+ copy_file "app/models/user.rb", "app/models/user.rb", :force => true
152
+ end
153
+
154
+ # Override Devise's default redirects and sign in/out
155
+ #
156
+ def add_application_controller_redirects
157
+ insert_into_file(
158
+ "app/controllers/application_controller.rb",
159
+ template_snippet("app/controllers/application_controller.rb"),
160
+ :after => ":exception"
161
+ )
162
+ end
163
+
164
+ # Install Simple Form automatically
165
+ #
166
+ def install_simple_form
167
+ generate "simple_form:install"
168
+ end
169
+
170
+ # Add ruby class overrides and additions
171
+ #
172
+ def add_ruby_class_overrides
173
+ template "config/initializers/_hash.rb", "config/initializers/_hash.rb"
174
+ end
175
+
176
+ # Add our settings and private settings files
177
+ #
178
+ def add_settings_files
179
+ template "config/initializers/_settings.rb",
180
+ "config/initializers/_settings.rb"
181
+ ['settings','private'].each do |s|
182
+ template "config/#{s}.yml", "config/#{s}.yml"
183
+ end
184
+ end
185
+
186
+ # Add the custom seed generator, which loads content
187
+ # from CSV into the database.
188
+ #
189
+ def add_seed_generator
190
+ remove_file "db/seeds.rb"
191
+ template "db/seeds.rb", "db/seeds.rb"
192
+ end
193
+
194
+ # Add our default routes file, which is commented out
195
+ # except for the root path to the home controller.
196
+ #
197
+ # We don't override routes here in case the user started
198
+ # to edit their routes file before running this generator.
199
+ #
200
+ def add_default_routes
201
+ template "config/routes.rb", "config/routes.rb", :force => true
202
+ end
203
+
204
+ end
205
+ end
@@ -0,0 +1,81 @@
1
+ require 'rake'
2
+ require 'rails/generators'
3
+ require File.expand_path('../../helpers/_autoloader.rb', __FILE__)
4
+
5
+ module Heartwood
6
+ class ControllerGenerator < Rails::Generators::Base
7
+
8
+ desc "Installs a controller to use in Heartwood's CMS."
9
+
10
+ source_root File.expand_path('../../templates', __FILE__)
11
+
12
+ argument :model, :type => :string
13
+
14
+ # class_option(
15
+ # :config_check,
16
+ # :type => :boolean,
17
+ # :default => true,
18
+ # :description => "Verify config at config/initializers/heartwood.rb"
19
+ # )
20
+
21
+ # If there is no configuration file tell the user to run
22
+ # that generator first (unless user has manually
23
+ # overridden).
24
+ #
25
+ # def verify_configuration
26
+ # if options.config_check?
27
+ # unless File.exists?("#{Rails.root}/config/initializers/heartwood.rb")
28
+ # help_message('heartwood_prereqs')
29
+ # exit
30
+ # end
31
+ # end
32
+ # end
33
+
34
+ def confirm_model
35
+ @model = model.classify.singularize.constantize
36
+ # rescue
37
+ # puts "Can't find the model: #{model}"
38
+ # exit
39
+ end
40
+
41
+ def set_model_attrs
42
+ @model_pl = @model.to_s.tableize.downcase.pluralize
43
+ @columns = @model.columns.reject { |col|
44
+ ['id','created_at','updated_at'].include?(col.name) }
45
+ end
46
+
47
+ def generate_controller
48
+ generate "controller admin/#{@model_pl}"
49
+ template(
50
+ "app/controllers/admin/controller.rb.erb",
51
+ "app/controllers/admin/#{@model_pl}_controller.rb",
52
+ :force => true
53
+ )
54
+ end
55
+
56
+ def add_routes
57
+ route = " namespace :admin do\n"
58
+ route += " resources :#{@model_pl}\n"
59
+ route += " end\n"
60
+ insert_into_file(
61
+ "config/routes.rb",
62
+ route,
63
+ :after => /mount\ Heartwood\:(.*)\n/
64
+ )
65
+ end
66
+
67
+ def add_config_file
68
+ template "config/admin/controller.yml.erb", "config/admin/#{@model_pl}.yml"
69
+ end
70
+
71
+ def add_sidebar_item
72
+ config = "#{@model_pl}:\n"
73
+ config += " label: #{@model_pl.titleize}\n"
74
+ config += " route: main_app.admin_#{@model_pl}\n"
75
+ config += " icon: cog\n"
76
+ config += " controllers: ['#{@model_pl}']\n"
77
+ append_to_file("config/admin/sidebar.yml", config)
78
+ end
79
+
80
+ end
81
+ end