sculptor 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +5 -13
  2. data/.editorconfig +10 -0
  3. data/Gemfile +0 -1
  4. data/Guardfile +5 -0
  5. data/Rakefile +1 -0
  6. data/bin/sculptor +14 -0
  7. data/features/create.feature +36 -0
  8. data/features/step_definitions/custom.rb +3 -0
  9. data/features/support/setup.rb +5 -0
  10. data/lib/sculptor/cli/create.rb +54 -0
  11. data/lib/sculptor/cli/init.rb +73 -0
  12. data/lib/sculptor/cli/server.rb +5 -0
  13. data/lib/sculptor/cli.rb +52 -0
  14. data/lib/sculptor/extensions/data_loaders.rb +53 -0
  15. data/lib/sculptor/extensions/model.rb +54 -0
  16. data/lib/sculptor/extensions/resource_helpers.rb +61 -0
  17. data/lib/sculptor/extensions.rb +8 -0
  18. data/lib/sculptor/load_paths.rb +53 -0
  19. data/lib/sculptor/method_missing.rb +6 -0
  20. data/lib/sculptor/templates/glyptotheque/.bowerrc +3 -0
  21. data/lib/sculptor/templates/glyptotheque/.editorconfig +10 -0
  22. data/lib/sculptor/templates/glyptotheque/.gitignore +1 -0
  23. data/lib/sculptor/templates/glyptotheque/Gemfile.tt +22 -0
  24. data/lib/sculptor/templates/glyptotheque/bower.json +11 -0
  25. data/lib/sculptor/templates/glyptotheque/config.tt +126 -0
  26. data/lib/sculptor/templates/glyptotheque/data/.gitkeep +0 -0
  27. data/lib/sculptor/templates/glyptotheque/source/assets/img/.gitkeep +0 -0
  28. data/lib/sculptor/templates/glyptotheque/source/assets/js/app.js +5 -0
  29. data/lib/sculptor/templates/glyptotheque/source/assets/js/glyptotheque/controllers.js +1 -0
  30. data/lib/sculptor/templates/glyptotheque/source/assets/js/glyptotheque/directives.js +29 -0
  31. data/lib/sculptor/templates/glyptotheque/source/assets/js/glyptotheque.js +3 -0
  32. data/lib/sculptor/templates/glyptotheque/source/assets/styles/glyptotheque/_$variables.scss +2 -0
  33. data/lib/sculptor/templates/glyptotheque/source/assets/styles/glyptotheque/_base.scss +14 -0
  34. data/lib/sculptor/templates/glyptotheque/source/assets/styles/glyptotheque/_model.scss +145 -0
  35. data/lib/sculptor/templates/glyptotheque/source/assets/styles/glyptotheque/_nav.scss +104 -0
  36. data/lib/sculptor/templates/glyptotheque/source/assets/styles/glyptotheque.scss +6 -0
  37. data/lib/sculptor/templates/glyptotheque/source/assets/styles/main.scss +14 -0
  38. data/lib/sculptor/templates/glyptotheque/source/assets/styles/pygments/borland.css +46 -0
  39. data/lib/sculptor/templates/glyptotheque/source/assets/styles/pygments/colorful.css +61 -0
  40. data/lib/sculptor/templates/glyptotheque/source/assets/styles/pygments/github.css +61 -0
  41. data/lib/sculptor/templates/glyptotheque/source/assets/styles/pygments/trac.css +59 -0
  42. data/lib/sculptor/templates/glyptotheque/source/index.html.slim +3 -0
  43. data/lib/sculptor/templates/glyptotheque/source/layouts/glyptotheque.slim +8 -0
  44. data/lib/sculptor/templates/glyptotheque/source/layouts/layout.slim +18 -0
  45. data/lib/sculptor/templates/glyptotheque/source/partials/glyptotheque/_model-index.slim +11 -0
  46. data/lib/sculptor/templates/glyptotheque/source/partials/glyptotheque/_model-source.slim +5 -0
  47. data/lib/sculptor/templates/glyptotheque/source/partials/glyptotheque/_model.slim +23 -0
  48. data/lib/sculptor/templates/glyptotheque/source/partials/glyptotheque/_nav.slim +14 -0
  49. data/lib/sculptor/templates/glyptotheque.rb +34 -0
  50. data/lib/sculptor/templates/model/data.tt +4 -0
  51. data/lib/sculptor/templates/model/index-template.tt +5 -0
  52. data/lib/sculptor/templates/model/styles.tt +12 -0
  53. data/lib/sculptor/templates/model/template.tt +34 -0
  54. data/lib/sculptor/templates.rb +1 -0
  55. data/lib/sculptor/version.rb +1 -1
  56. data/lib/sculptor.rb +6 -5
  57. data/sculptor.gemspec +13 -1
  58. metadata +240 -12
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZjFkOGFjZWVlYWVlODI1OWYwYzVhYzNiYzZiNzI4NjE4YzRjODZkMw==
5
- data.tar.gz: !binary |-
6
- NmYzYTM2Yjg3ZDlkMDJiYTYwMDVhNmRlODYwZGVlMjg4ZmJhOWI0ZA==
2
+ SHA1:
3
+ metadata.gz: e8892ec5089d558ff641359ff69733d048e314ef
4
+ data.tar.gz: 67d2fc8ee63e505b326ac3d7e656b7fc92ad4156
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NmNjYzgxNTc0NGEwMWM1MjM2Zjg1NzAxNWEyZmY4YTBhODdmMDQzMjI1NTY4
10
- NDVmOWI3NDU3Yjc3NmUyM2QyNTdjMDM2M2NmNjI5ZjU0Yjk0OWJiMWZjMTdl
11
- NmQ4OWZjMGE5Y2QwMjZiYjQ5OTVmN2E4MTI2MTJlZWI0OTEzMmY=
12
- data.tar.gz: !binary |-
13
- N2FjOWVlYzhjNjNmZmIyZGI2ZWNmODJjNzIwNzU1YTNkNDc5MjE0ZDM4MWQ4
14
- MDM1OTllNzVkYmQ1NmJlZmQxN2JhNDBmMmY2MzdkN2IyZTNlOGI3YjNlNmU1
15
- Yzg3ZGNhMjNlNjFjMGRhZTA0OTI2MTI1YWFlOThmM2FmN2Y5Njg=
6
+ metadata.gz: b88e45b635671467b563f201163d0a65e99315347f3044e0b3615a9eec54d6e6a25933850adf7cefc96fab4e7acf3e59d1ae9c259b37e74d42cdafe12ca481d5
7
+ data.tar.gz: 5080d19bf694387499df1975c8f889aa04d1b2d45fbbdc5b3657bd1226aff5ac7d9470edf8bfb87536d05e0870bb604dec41021c34474af420fd1ec0ce7927ea
data/.editorconfig ADDED
@@ -0,0 +1,10 @@
1
+ # editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ charset = utf-8
9
+ trim_trailing_whitespace = true
10
+ insert_final_newline = true
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in sculptor.gemspec
4
3
  gemspec
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'cucumber' do
2
+ watch(%r{^features/.+\.feature$})
3
+ watch(%r{^features/support/.+$}) { 'features' }
4
+ watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
5
+ end
data/Rakefile CHANGED
@@ -1 +1,2 @@
1
+ require 'rspec/core/rake_task'
1
2
  require "bundler/gem_tasks"
data/bin/sculptor ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'middleman-core/profiling'
4
+ if ARGV.include? '--profile'
5
+ Middleman::Profiling.profiler = Middleman::Profiling::RubyProfProfiler.new
6
+ end
7
+ Middleman::Profiling.start
8
+
9
+ require "sculptor/load_paths"
10
+ Sculptor.setup_load_paths
11
+
12
+ require 'sculptor/cli'
13
+
14
+ Sculptor::CLI::Base.start
@@ -0,0 +1,36 @@
1
+ Feature: Run `create` command
2
+ In order to create new models
3
+
4
+ Scenario: Create a new model scaffold
5
+ Given I run `sculptor create test` interactively
6
+ Then I wait for output to contain "Creating model: source/test"
7
+ And I wait for output to contain "Title"
8
+ Then I hit enter
9
+ And I wait for output to contain "Description"
10
+ Then I hit enter
11
+ And I wait for output to contain "Stylesheet"
12
+ Then I hit enter
13
+ And I wait for output to contain "Include data?"
14
+ Then I type "n"
15
+ And the exit status should be 0
16
+ Then the output should contain "create"
17
+
18
+ Scenario: Create a new model scaffold and set meta data
19
+ Given I run `sculptor create test` interactively
20
+ Then I wait for output to contain "Creating model: source/test"
21
+ And I wait for output to contain "Title"
22
+ Then I type "Hello World"
23
+ And I wait for output to contain "Description"
24
+ Then I type "My model description"
25
+ And I wait for output to contain "Stylesheet"
26
+ Then I type "styles"
27
+ And I wait for output to contain "Include data?"
28
+ Then I type "y"
29
+ And the exit status should be 0
30
+ Then the output should contain "create"
31
+ And a directory named "source/test" should exist
32
+ Then the file "source/test/test.html.slim" should contain "Hello World"
33
+ And the file "source/test/test.html.slim" should contain "My model description"
34
+ And the file "source/test/index.html.slim" should contain "'partials/glyptotheque/model-index', locals: { dir: '/test' }"
35
+ And the file "source/test/test.yaml" should contain "hello: World"
36
+ And the file "source/test/styles.scss" should contain "@import 'bourbon'"
@@ -0,0 +1,3 @@
1
+ Then /^I hit enter$/ do
2
+ type("\r")
3
+ end
@@ -0,0 +1,5 @@
1
+ require 'aruba/cucumber'
2
+
3
+ Before do
4
+ @aruba_timeout_seconds = 5
5
+ end
@@ -0,0 +1,54 @@
1
+ module Sculptor::CLI
2
+ class Create < Thor
3
+ include Thor::Actions
4
+
5
+ check_unknown_options!
6
+
7
+ namespace :create
8
+
9
+ def self.source_root
10
+ File.join(File.dirname(__FILE__), '..', 'templates', 'model')
11
+ end
12
+
13
+ def self.exit_on_failure?
14
+ true
15
+ end
16
+
17
+ desc 'create NAME', 'Create new model NAME'
18
+ def create(name)
19
+ model_path = "source/#{name}"
20
+
21
+ say(set_color("Creating model: ", :yellow) + set_color(model_path, :white, :bold))
22
+
23
+ is_subdir = name.split('/').count > 1
24
+ parent_path = is_subdir ? model_path.split('/')[0..-2].join('/') : model_path
25
+
26
+ @name = name
27
+ @title = options[:title] || ask('Title: ')
28
+ @description = options[:desc] || ask('Description: ')
29
+ @stylesheet = ask('Stylesheet: ')
30
+ @dir = is_subdir ? name.split('/')[0..-2].join('/') : name
31
+
32
+ @has_data = if yes?('Include data?')
33
+ @model_name = name.split('/').last
34
+ template 'data', (is_subdir ? model_path : File.join(model_path, name)) + '.yaml'
35
+ end
36
+
37
+ template 'template', (is_subdir ? model_path : File.join(model_path, name)) + '.html.slim'
38
+
39
+ has_index = File.file?(File.join(parent_path, 'index.html.slim'))
40
+ unless has_index
41
+ template 'index-template', (is_subdir ? File.join(parent_path, 'index') : File.join(model_path, 'index')) + '.html.slim'
42
+ end
43
+
44
+ unless @stylesheet.empty?
45
+ stylesheet_path = is_subdir ? Pathname(model_path).join("../#{@stylesheet}").to_s : File.join(model_path, "#{@stylesheet}")
46
+ template 'styles', "#{stylesheet_path}.scss" unless File.file? "#{stylesheet_path}.scss"
47
+ end
48
+ end
49
+
50
+ Base.map(
51
+ 'c' => 'create'
52
+ )
53
+ end
54
+ end
@@ -0,0 +1,73 @@
1
+ require 'sculptor/templates'
2
+
3
+ # Copied from `middleman-core/lib/middleman-core/cli/init.rb`
4
+ # in order to modify default template
5
+ module Middleman::Cli
6
+ # A thor task for creating new projects
7
+ class Init < Thor
8
+ check_unknown_options!
9
+
10
+ namespace :init
11
+
12
+ desc 'init NAME [options]', 'Create new project NAME'
13
+ available_templates = ::Middleman::Templates.registered.keys.join(', ')
14
+ method_option 'template',
15
+ aliases: '-T',
16
+ default: 'glyptotheque',
17
+ desc: "Use a project template: #{available_templates}"
18
+ method_option 'css_dir',
19
+ # :default => "stylesheets",
20
+ desc: 'The path to the css files'
21
+ method_option 'js_dir',
22
+ # :default => "javascripts",
23
+ desc: 'The path to the javascript files'
24
+ method_option 'images_dir',
25
+ # :default => "images",
26
+ desc: 'The path to the image files'
27
+ method_option 'rack',
28
+ type: :boolean,
29
+ default: false,
30
+ desc: 'Include a config.ru file'
31
+ method_option 'skip-gemfile',
32
+ type: :boolean,
33
+ default: false,
34
+ desc: "Don't create a Gemfile"
35
+ method_option 'skip-bundle',
36
+ type: :boolean,
37
+ aliases: '-B',
38
+ default: false,
39
+ desc: "Don't run bundle install"
40
+ method_option 'skip-git',
41
+ type: :boolean,
42
+ default: false,
43
+ desc: 'Skip Git ignores and keeps'
44
+ # The init task
45
+ # @param [String] name
46
+ def init(name='.')
47
+ key = options[:template].to_sym
48
+ unless ::Middleman::Templates.registered.key?(key)
49
+ raise Thor::Error, "Unknown project template '#{key}'"
50
+ end
51
+
52
+ thor_group = ::Middleman::Templates.registered[key]
53
+ thor_group.new([name], options).invoke_all
54
+ end
55
+ end
56
+
57
+ def self.exit_on_failure?
58
+ true
59
+ end
60
+
61
+ # Map "i", "new" and "n" to "init"
62
+ Base.map(
63
+ 'i' => 'init',
64
+ 'new' => 'init',
65
+ 'n' => 'init'
66
+ )
67
+ end
68
+
69
+ module Sculptor::CLI
70
+ class Init < Thor
71
+ register(Middleman::Cli::Init, :init, "init NAME", "Create new project NAME")
72
+ end
73
+ end
@@ -0,0 +1,5 @@
1
+ module Sculptor::CLI
2
+ class Server < Middleman::Cli::Server
3
+ register(Middleman::Cli::Server, :server, "server", "Run Middleman preview server")
4
+ end
5
+ end
@@ -0,0 +1,52 @@
1
+ require 'thor'
2
+ require 'middleman-core/version'
3
+ require 'middleman-core/cli'
4
+
5
+ module Sculptor
6
+ module CLI
7
+ class Base < Middleman::Cli::Base
8
+ desc 'version', 'Show version'
9
+ def version
10
+ say "Sculptor #{Sculptor::VERSION} (Middleman #{Middleman::VERSION})"
11
+ end
12
+
13
+ def help(meth=nil, subcommand=false)
14
+ if meth && !self.respond_to?(meth)
15
+ klass, task = Thor::Util.find_class_and_task_by_namespace("#{meth}:#{meth}")
16
+ klass.start(['-h', task].compact, shell: shell)
17
+ else
18
+ list = []
19
+ Thor::Util.thor_classes_in(Sculptor::CLI).each do |thor_class|
20
+ list += thor_class.printable_tasks(false)
21
+ end
22
+ list.sort! { |a, b| a[0] <=> b[0] }
23
+
24
+ shell.say "\n"
25
+ shell.print_table(list, ident: 2, truncate: true)
26
+ shell.say
27
+ end
28
+ end
29
+
30
+ # Intercept missing methods and search subtasks for them
31
+ # @param [Symbol] meth
32
+ def method_missing(meth, *args)
33
+ meth = meth.to_s
34
+ meth = self.class.map[meth] if self.class.map.key?(meth)
35
+
36
+ klass, task = Thor::Util.find_class_and_task_by_namespace("#{meth}:#{meth}")
37
+
38
+ if klass.nil?
39
+ raise Thor::Error, "There's no '#{meth}' command for Sculptor. Try 'sculptor help' for a list of commands."
40
+ else
41
+ args.unshift(task) if task
42
+ klass.start(args, shell: shell)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ require 'sculptor/version'
50
+ require 'sculptor/cli/create'
51
+ require 'sculptor/cli/init'
52
+ require 'sculptor/cli/server'
@@ -0,0 +1,53 @@
1
+ class Middleman::Extensions::DataLoaders < ::Middleman::Extension
2
+ def initialize(app, options_hash={})
3
+ super
4
+
5
+ require 'open-uri'
6
+ end
7
+
8
+ helpers do
9
+ def pwd
10
+ File.dirname(File.expand_path(current_page.path, root))
11
+ end
12
+
13
+ def load_data(path, options = nil)
14
+ resource = if path.start_with? 'http'
15
+ load_remote_data(path, options)
16
+ else
17
+ sitemap.find_resource_by_path(relative_dir(current_page.path, path).to_s)
18
+ end
19
+
20
+ raise "#{path} not found" unless resource
21
+
22
+ if ['.yaml', '.yml'].include? resource.ext
23
+ yaml = resource.render
24
+ elsif resource.ext == '.json'
25
+ json = resource.render
26
+ end
27
+
28
+ if json
29
+ JSON.parse(resource.render)
30
+ elsif yaml
31
+ YAML.load(resource.render)
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def load_remote_data(url, options)
38
+ begin
39
+ if(options)
40
+ resource = open(url, http_basic_authentication: [options[:user], options[:password]])
41
+ else
42
+ resource = open(url)
43
+ end
44
+ rescue
45
+ raise "Couldn't load the remote: #{url}."
46
+ end
47
+ {
48
+ ext: '.json',
49
+ render: resource.read
50
+ }
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,54 @@
1
+ class Middleman::Extensions::Model < ::Middleman::Extension
2
+ def initialize(app, options_hash={})
3
+ super
4
+
5
+ require 'open-uri'
6
+ require 'nokogiri'
7
+ end
8
+
9
+ helpers do
10
+ # Requires one of `&block` or `url + selector`
11
+ # Parameters:
12
+ # * `title` (optional) - Model title
13
+ # * `description` (optional) - Model description
14
+ # * `component_url` (optional) - Model URL
15
+ # * `component_selector` (required if `url` is provided)
16
+ # * `&block` (optional)
17
+ def model(options={}, &block)
18
+ [:title, :description].each { |k| options[k] ||= nil }
19
+
20
+ if block_given?
21
+ html = capture_html(&block)
22
+ metadata = options
23
+ elsif options[:component]
24
+ component_path = "components/#{options[:component]}"
25
+ resource = sitemap.find_resource_by_path("#{component_path}.html")
26
+ metadata = resource.metadata.page
27
+ html = resource.render
28
+ elsif options[:component_url] && options[:component_selector]
29
+ metadata = options
30
+ doc = Nokogiri::HTML(open(options[:component_url]))
31
+ result = doc.css(options[:component_selector])
32
+ if result.empty?
33
+ raise "Selector `#{options[:component_selector]}` not found in remote location`#{options[:component_url]}`"
34
+ end
35
+ html = result.to_html
36
+ else
37
+ raise "Model `#{options[:title]}`: No `component` of HTML block was given"
38
+ end
39
+
40
+ options.reverse_merge!(metadata.symbolize_keys!)
41
+ options[:html] = html
42
+
43
+ options[:source_code] = html unless options.has_key? :source_code
44
+ options[:source_type] ||= 'html'
45
+
46
+ partial('partials/glyptotheque/model', locals: options)
47
+ end
48
+
49
+ def model_source(type, &block)
50
+ source_code = capture_html(&block)
51
+ partial('partials/glyptotheque/model-source', locals: { source_type: type, source_code: source_code })
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,61 @@
1
+ class Middleman::Extensions::ResourceHelpers < ::Middleman::Extension
2
+ helpers do
3
+ def include_stylesheets(stylesheets)
4
+ return unless stylesheets && stylesheets.is_a?(Array) && stylesheets.length > 0
5
+ stylesheets.map { |s|
6
+ include_stylesheet(s)
7
+ }.join("\n")
8
+ end
9
+
10
+ def include_stylesheet(stylesheet)
11
+ return if stylesheet.empty?
12
+ stylesheet_link_tag(relative_dir(current_page.path, stylesheet)) + "\n"
13
+ end
14
+
15
+ def include_javascripts(javascripts)
16
+ return unless javascripts && javascripts.is_a?(Array) && javascripts.length > 0
17
+ javascripts.map { |j|
18
+ path = j.start_with?('http') ? j : relative_dir(current_page.path, j)
19
+ javascript_include_tag(path) + "\n"
20
+ }.join("\n")
21
+ end
22
+
23
+ # Constructs path relative to base path (first argument)
24
+ def relative_dir(path, *args)
25
+ relative_path = args ? args.join('/') : ''
26
+ Pathname(path).dirname.join(relative_path)
27
+ end
28
+
29
+ def resource_file(resource)
30
+ resource.path.split('/').last.gsub(resource.ext, '')
31
+ end
32
+
33
+ def resource_dir(resource)
34
+ resource.url.split('/').last
35
+ end
36
+
37
+ def subpages_for(dir, ext = 'html', exclude_indexes: false)
38
+ resources = sitemap.resources
39
+ .select {|r| r.ext == ".#{ext}"} # Select files only HTML files
40
+ .reject {|r| r.data.hidden} # reject hidden (Front matter)
41
+ .select {|r| r.url.start_with?(dir)} # Select files in the given dir
42
+ .sort_by(&:url) # Sort by URL (ensures indexes first)
43
+ .reject {|r| r.url == dir} # Exclude main directory index
44
+
45
+ if exclude_indexes
46
+ resources = resources.reject {|r| r.directory_index? } # Exclude all directory indexes
47
+ end
48
+
49
+ resources.reject {|r| r.path.end_with? ("-full#{r.ext}")} # Ignore proxied '-full' mode pages
50
+ end
51
+
52
+ # Use in layouts, in templates either Frontmatter or this method can be used
53
+ def append_class(block_name, appended_classes='')
54
+ current_page_classes = current_page.data[block_name] || ''
55
+ existing_classes_a = current_page_classes.split(' ')
56
+ appended_classes_a = appended_classes.split(' ')
57
+ classes = existing_classes_a.concat(appended_classes_a).reverse.join(' ')
58
+ content_for(block_name, classes)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,8 @@
1
+ require 'sculptor/extensions/model'
2
+ Middleman::Extensions::Model.register
3
+
4
+ require 'sculptor/extensions/data_loaders'
5
+ Middleman::Extensions::DataLoaders.register
6
+
7
+ require 'sculptor/extensions/resource_helpers'
8
+ Middleman::Extensions::ResourceHelpers.register
@@ -0,0 +1,53 @@
1
+ # Core Pathname library used for traversal
2
+ require 'pathname'
3
+
4
+ module Sculptor
5
+ class << self
6
+ def setup_load_paths
7
+ @_is_setup ||= begin
8
+
9
+ # Only look for config.rb if MM_ROOT isn't set
10
+ if !ENV['MM_ROOT'] && found_path = locate_root
11
+ ENV['MM_ROOT'] = found_path
12
+ end
13
+
14
+ is_bundler_setup = false
15
+
16
+ # If we've found the root, try to setup Bundler
17
+ if ENV['MM_ROOT']
18
+
19
+ root_gemfile = File.expand_path('Gemfile', ENV['MM_ROOT'])
20
+ ENV['BUNDLE_GEMFILE'] ||= root_gemfile
21
+
22
+ unless File.exist?(ENV['BUNDLE_GEMFILE'])
23
+ git_gemfile = Pathname.new(__FILE__).expand_path.parent.parent.parent + 'Gemfile'
24
+ ENV['BUNDLE_GEMFILE'] = git_gemfile.to_s
25
+ end
26
+
27
+ if File.exist?(ENV['BUNDLE_GEMFILE'])
28
+ is_bundler_setup = true
29
+ require 'bundler/setup'
30
+ end
31
+ end
32
+
33
+ # Automatically discover extensions in RubyGems
34
+ require 'middleman-core/extensions'
35
+
36
+ if is_bundler_setup
37
+ Bundler.require
38
+ else
39
+ ::Middleman.load_extensions_in_path
40
+ end
41
+
42
+ true
43
+ end
44
+ end
45
+
46
+ # Recursive method to find config.rb
47
+ def locate_root(cwd=Pathname.new(Dir.pwd))
48
+ return cwd.to_s if (cwd + 'config.rb').exist?
49
+ return false if cwd.root?
50
+ locate_root(cwd.parent)
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,6 @@
1
+ # Allow keys dot syntax
2
+ class Hash
3
+ def method_missing(sym, *args)
4
+ fetch(sym) { fetch(sym.to_s) { super } }
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ {
2
+ "directory" : "bower_components"
3
+ }
@@ -0,0 +1,10 @@
1
+ # editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ charset = utf-8
9
+ trim_trailing_whitespace = true
10
+ insert_final_newline = true
@@ -0,0 +1 @@
1
+ bower_components
@@ -0,0 +1,22 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'sculptor'
4
+ gem 'middleman'
5
+ gem 'nokogiri'
6
+ gem 'middleman-pry'
7
+ gem 'sass', '~>3.3'
8
+ gem 'compass', github: 'chriseppstein/compass'
9
+ gem 'sass-css-importer'
10
+ gem 'slim'
11
+ gem 'bourbon'
12
+ gem 'neat'
13
+
14
+ gem 'middleman-syntax', github: 'middleman/middleman-syntax'
15
+
16
+ # Custom LiveReload (animate transitions)
17
+ gem 'rack-livereload',
18
+ github: 'tyom/rack-livereload',
19
+ branch: 'livereload-animate'
20
+ gem 'middleman-livereload',
21
+ github: 'tyom/middleman-livereload',
22
+ branch: 'animate-transitions'
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "sculptor",
3
+ "version": "0.0.1",
4
+ "private": "true",
5
+ "dependencies": {
6
+ "normalize.css": "*",
7
+ "angular": "~1.2.16",
8
+ "lodash": "*",
9
+ "mousetrap": "~1.4.6"
10
+ }
11
+ }