sass-import_once 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +5 -0
- data/CHANGELOG.markdown +3 -0
- data/Gemfile +7 -0
- data/README.markdown +22 -0
- data/Rakefile +11 -0
- data/lib/sass-import_once.rb +1 -0
- data/lib/sass/import_once.rb +7 -0
- data/lib/sass/import_once/importer.rb +141 -0
- data/lib/sass/import_once/monkey_patches.rb +11 -0
- data/lib/sass/import_once/version.rb +5 -0
- data/sass-import_once.gemspec +30 -0
- data/test/fixtures/partials/_imported.scss +3 -0
- data/test/fixtures/test.scss +13 -0
- data/test/sass_import_once_test.rb +25 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZTEyNDNkMmE1YTQwN2QwMzk5MWViYTRhMjhmMDYxMDBlYzQ2YjY2NA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YjhjMjc0NGRkNjJhMzY3M2JkNzgzMWJiMjY1YTRkMGYwYTNiMjI0Yw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZTliNDgwNWM1YWU2Yzk1NjIxM2NiOWRkOTM4ZDM4M2VkNTM2NjdjODBiMGRh
|
10
|
+
YTQ2MjUwYzY1YWQwOTFkM2ZkMmVlZDVmNTBhNTE5Mzc1NWZiZjQ5MDYxYjM2
|
11
|
+
YWQ4YzlmN2E4MDJjNGIyMzVjNmNhYjVkYjc5M2QyNGJmNTAxMTk=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YjMzMGY4MDA1ZjdmMTAyM2VkMzU4NWY3ZmNjMGEyMmJhMGQwM2QwMzMwNWM3
|
14
|
+
OWMyZjY3OGNjMzViYmQ3OWFhZjY0NDM5YTE2MTJkNmI2ZTAwMzBiYTNhNzdm
|
15
|
+
YWEyNDI3NThiNmE0ZDVmN2FlNjI4MmNiN2U4ZGJhOWQ1N2U3NmM=
|
data/.gitignore
ADDED
data/CHANGELOG.markdown
ADDED
data/Gemfile
ADDED
data/README.markdown
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Sass Import Once Plugin
|
2
|
+
|
3
|
+
Sass import_once changes the behaviour of the sass @import directive making never require the same file twice.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
$ gem install sass-import_once
|
8
|
+
|
9
|
+
## Use with the Sass command line
|
10
|
+
|
11
|
+
$ sass -r sass-import_once --watch sass_dir:css_dir
|
12
|
+
|
13
|
+
## Use with compass
|
14
|
+
|
15
|
+
Add the following to your compass configuration:
|
16
|
+
|
17
|
+
$ gem install 'compass-import_once'
|
18
|
+
require 'compass-import_once'
|
19
|
+
|
20
|
+
## Stylesheet Syntax
|
21
|
+
|
22
|
+
The same as always :)
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'sass/import_once'
|
@@ -0,0 +1,141 @@
|
|
1
|
+
class Sass::ImportOnce::Importer < ::Sass::Importers::Filesystem
|
2
|
+
|
3
|
+
attr_accessor :root, :staleness_check, :imported, :original_filename
|
4
|
+
|
5
|
+
@@DEBUG = false
|
6
|
+
|
7
|
+
# Creates a new filesystem importer that imports files relative to a given path.
|
8
|
+
#
|
9
|
+
# @param root [String] The root path.
|
10
|
+
# This importer will import files relative to this path.
|
11
|
+
def initialize(root)
|
12
|
+
@imported = []
|
13
|
+
super(root)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Same as Sass
|
17
|
+
COLORS = { :red => 31, :green => 32, :yellow => 33 }
|
18
|
+
|
19
|
+
def color(color, str)
|
20
|
+
raise "[BUG] Unrecognized color #{color}" unless COLORS[color]
|
21
|
+
|
22
|
+
# Almost any real Unix terminal will support color,
|
23
|
+
# so we just filter for Windows terms (which don't set TERM)
|
24
|
+
# and not-real terminals, which aren't ttys.
|
25
|
+
return str if ENV["TERM"].nil? || ENV["TERM"].empty? || !STDOUT.tty?
|
26
|
+
return "\e[#{COLORS[color]}m#{str}\e[0m"
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.DEBUG=(value)
|
30
|
+
@@DEBUG = value
|
31
|
+
end
|
32
|
+
|
33
|
+
def debug(text, level = 1)
|
34
|
+
if @@DEBUG
|
35
|
+
puts "__ DEBUG: " + text.to_s
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def update_imported_list(options)
|
40
|
+
@original_filename ||= options[:original_filename]
|
41
|
+
|
42
|
+
if @original_filename != options[:original_filename]
|
43
|
+
@imported = []
|
44
|
+
@original_filename = options[:original_filename]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def staleness_check?(options)
|
49
|
+
# as per sass/importers/filesystem.rb : 135, 148
|
50
|
+
# quote: "If options[:_line] exists, we're here due to an actual import in an import_node
|
51
|
+
# Otherwise, we're here via StalenessChecker."
|
52
|
+
# But it's not true, place two @import's to file A inside a file B and both will have _line set.
|
53
|
+
# So, unfortunately, for now, we'll have to check the stack
|
54
|
+
|
55
|
+
Kernel.caller.each {|call|
|
56
|
+
return true if call.include? "staleness_checker"
|
57
|
+
}
|
58
|
+
|
59
|
+
return false
|
60
|
+
end
|
61
|
+
|
62
|
+
# @see Base#find_relative
|
63
|
+
def find_relative(name, base, options)
|
64
|
+
update_imported_list options
|
65
|
+
debug color(:yellow, " finding relative ") + color(:green, name)
|
66
|
+
just_checking = staleness_check? options
|
67
|
+
|
68
|
+
# get the real file
|
69
|
+
real_file, syntax = Sass::Util.destructure(find_real_file(File.dirname(base), name, options))
|
70
|
+
|
71
|
+
if !real_file
|
72
|
+
raise color(:red, "Could not find a RELATIVE file '#{name}'. Imported at #{options[:original_filename]}:#{options[:_line]}")
|
73
|
+
return nil
|
74
|
+
end
|
75
|
+
|
76
|
+
unless just_checking
|
77
|
+
|
78
|
+
if @imported.include? real_file
|
79
|
+
debug color(:red, " already included")
|
80
|
+
|
81
|
+
return empty(options)
|
82
|
+
end
|
83
|
+
|
84
|
+
else
|
85
|
+
debug " Just checking"
|
86
|
+
end
|
87
|
+
|
88
|
+
f = _find(File.dirname(base), name, options)
|
89
|
+
|
90
|
+
if f
|
91
|
+
debug color(:yellow, " imported: ") + color(:green, real_file) unless just_checking
|
92
|
+
@imported << real_file unless just_checking
|
93
|
+
end
|
94
|
+
|
95
|
+
return f
|
96
|
+
end
|
97
|
+
|
98
|
+
# @see Base#find
|
99
|
+
def find(name, options)
|
100
|
+
debug color(:red, "find called")
|
101
|
+
update_imported_list options
|
102
|
+
debug "finding absolute " + color(:green, name)
|
103
|
+
just_checking = staleness_check? options
|
104
|
+
|
105
|
+
# get the real file
|
106
|
+
real_file, syntax = Sass::Util.destructure(find_real_file(@root, name, options))
|
107
|
+
|
108
|
+
if !real_file
|
109
|
+
raise color(:red, "Could not find file '#{name}'. Imported at #{options[:original_filename]}:#{options[:_line]}")
|
110
|
+
return nil
|
111
|
+
end
|
112
|
+
|
113
|
+
unless just_checking
|
114
|
+
|
115
|
+
if @imported.include? real_file
|
116
|
+
debug color(:red, "already included")
|
117
|
+
return empty(options)
|
118
|
+
end
|
119
|
+
|
120
|
+
else
|
121
|
+
debug "Just checking", 2
|
122
|
+
end
|
123
|
+
|
124
|
+
f = _find(@root, name, options)
|
125
|
+
|
126
|
+
if f
|
127
|
+
debug " imported: " + color(:green, real_file) unless just_checking
|
128
|
+
@imported << real_file unless just_checking
|
129
|
+
else
|
130
|
+
debug color(:red, "NOT FOUND!")
|
131
|
+
end
|
132
|
+
|
133
|
+
return f
|
134
|
+
end
|
135
|
+
|
136
|
+
protected
|
137
|
+
|
138
|
+
def empty(options)
|
139
|
+
return Sass::Engine.new("", options)
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path("../lib/sass/import_once/version", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "sass-import_once"
|
6
|
+
s.version = Sass::ImportOnce::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ["The Blacksmith (a.k.a. Saulo Vallory)"]
|
9
|
+
s.email = ["me@saulovallory.com"]
|
10
|
+
s.homepage = "http://theblacksmithhq.com/"
|
11
|
+
s.summary = %q{Makes Sass @import directives only import a file once.}
|
12
|
+
s.description = %q{
|
13
|
+
Sass ImportOnce Importer
|
14
|
+
|
15
|
+
This gem will MODIFY the default behaviour of Sass.
|
16
|
+
|
17
|
+
Sass @import directive imports the file requested everytime it's called
|
18
|
+
this has been default behaviour, as far as I know, from the beginning of
|
19
|
+
Sass's life. But sometimes, or most of the time, this behaviour isn't
|
20
|
+
desireable. When working with modularized sass styles and sass frameworks
|
21
|
+
out there we usually want a file to be imported only once.
|
22
|
+
}
|
23
|
+
|
24
|
+
s.files = `git ls-files`.split("\n")
|
25
|
+
s.test_files = `git ls-files -- test/*`.split("\n")
|
26
|
+
s.require_paths = ["lib"]
|
27
|
+
|
28
|
+
s.add_runtime_dependency 'sass', '>= 3.1'
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// Let's import a file
|
2
|
+
@import "partials/imported";
|
3
|
+
|
4
|
+
// add some rules
|
5
|
+
$blue: #3bbfce;
|
6
|
+
|
7
|
+
div.bleue {
|
8
|
+
background-color: $blue;
|
9
|
+
}
|
10
|
+
|
11
|
+
// And import the same file again
|
12
|
+
// even if we change the way we reference the file, it shouldn't be imported
|
13
|
+
@import "partials/imported.scss";
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'sass'
|
3
|
+
require 'sass-import_once'
|
4
|
+
|
5
|
+
class SassImportOnceTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_will_import_file_once
|
8
|
+
css = render_file("test.scss")
|
9
|
+
assert_equal 1, css.scan(/#i\.was\.imported/).count
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def render_file(filename)
|
14
|
+
fixtures_dir = File.expand_path("fixtures", File.dirname(__FILE__))
|
15
|
+
full_filename = File.expand_path(filename, fixtures_dir)
|
16
|
+
syntax = File.extname(full_filename)[1..-1].to_sym
|
17
|
+
engine = Sass::Engine.new(File.read(full_filename),
|
18
|
+
:syntax => syntax,
|
19
|
+
:filename => full_filename,
|
20
|
+
:cache => false,
|
21
|
+
:read_cache => false,
|
22
|
+
:load_paths => [fixtures_dir])
|
23
|
+
engine.render
|
24
|
+
end
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sass-import_once
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Blacksmith (a.k.a. Saulo Vallory)
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sass
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.1'
|
27
|
+
description: ! "\n Sass ImportOnce Importer\n\n This gem will MODIFY the default
|
28
|
+
behaviour of Sass.\n\n Sass @import directive imports the file requested everytime
|
29
|
+
it's called\n this has been default behaviour, as far as I know, from the beginning
|
30
|
+
of\n Sass's life. But sometimes, or most of the time, this behaviour isn't \n
|
31
|
+
\ desireable. When working with modularized sass styles and sass frameworks\n
|
32
|
+
\ out there we usually want a file to be imported only once.\n "
|
33
|
+
email:
|
34
|
+
- me@saulovallory.com
|
35
|
+
executables: []
|
36
|
+
extensions: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
files:
|
39
|
+
- .gitignore
|
40
|
+
- CHANGELOG.markdown
|
41
|
+
- Gemfile
|
42
|
+
- README.markdown
|
43
|
+
- Rakefile
|
44
|
+
- lib/sass-import_once.rb
|
45
|
+
- lib/sass/import_once.rb
|
46
|
+
- lib/sass/import_once/importer.rb
|
47
|
+
- lib/sass/import_once/monkey_patches.rb
|
48
|
+
- lib/sass/import_once/version.rb
|
49
|
+
- sass-import_once.gemspec
|
50
|
+
- test/fixtures/partials/_imported.scss
|
51
|
+
- test/fixtures/test.scss
|
52
|
+
- test/sass_import_once_test.rb
|
53
|
+
homepage: http://theblacksmithhq.com/
|
54
|
+
licenses: []
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 2.1.10
|
73
|
+
signing_key:
|
74
|
+
specification_version: 4
|
75
|
+
summary: Makes Sass @import directives only import a file once.
|
76
|
+
test_files:
|
77
|
+
- test/fixtures/partials/_imported.scss
|
78
|
+
- test/fixtures/test.scss
|
79
|
+
- test/sass_import_once_test.rb
|