sass-buddy 1.1.1
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.
- checksums.yaml +7 -0
- data/lib/sass-buddy.rb +92 -0
- data/spec/sass-buddy-spec.rb +140 -0
- metadata +75 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b0862e7491cb3f26b426c45c0fb94e7e91649053
|
4
|
+
data.tar.gz: 43b48af7a82676150db685a36f04d299fa0beebc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4be2c16565657ab90c564cc0af3f0fd1b8ad78d2e750625ead611d2c6c2d3806bd9e8d1897db7b6cd958b54e19550e2987e6d841dbc35aece261e1d74e44280c
|
7
|
+
data.tar.gz: 264c56527043ffeecdb8ac71aa6eab75c7fa85756fee3a1c214ad987d35db01429c37b0b69223e1d60efbbda70a39de1cf9ebe0537180389774780df159f395e
|
data/lib/sass-buddy.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# rubocop:disable Style/FileName
|
2
|
+
require 'json'
|
3
|
+
require 'sassc'
|
4
|
+
|
5
|
+
# Pass either a file or a string containing scss and
|
6
|
+
# recieve a compiled string of css with or without
|
7
|
+
# style tags.
|
8
|
+
class SassBuddy
|
9
|
+
def initialize(opts)
|
10
|
+
@file = opts[:file]
|
11
|
+
@string, = opts[:string]
|
12
|
+
@container = opts[:container]
|
13
|
+
@additions = opts[:additions]
|
14
|
+
@require_paths = opts[:require_paths]
|
15
|
+
@manifest = opts[:rev_manifest] ? get_manifest(opts[:rev_manifest]) : {}
|
16
|
+
@syntax = opts[:sass] ? :sass : :scss
|
17
|
+
end
|
18
|
+
attr_reader :file, :string, :additions, :container, :require_paths, :manifest
|
19
|
+
|
20
|
+
def compile
|
21
|
+
revved(compiled_css) if compiled_css
|
22
|
+
end
|
23
|
+
|
24
|
+
def compile_html
|
25
|
+
"<style>#{revved(compiled_css)}</style>" if compiled_css
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def get_manifest(file)
|
31
|
+
JSON.parse(File.open(file).read)
|
32
|
+
end
|
33
|
+
|
34
|
+
def revved(css)
|
35
|
+
manifest.each do |k, v|
|
36
|
+
css.gsub!(k, v)
|
37
|
+
end
|
38
|
+
|
39
|
+
css
|
40
|
+
end
|
41
|
+
|
42
|
+
def compiled_css
|
43
|
+
SassC::Engine.new(
|
44
|
+
stringed_additions + contents,
|
45
|
+
syntax: @syntax,
|
46
|
+
importer: ImportBuddy,
|
47
|
+
filename: file,
|
48
|
+
require_paths: require_paths
|
49
|
+
).render
|
50
|
+
rescue SassC::SyntaxError
|
51
|
+
false
|
52
|
+
end
|
53
|
+
|
54
|
+
def stringed_additions
|
55
|
+
return '' unless additions
|
56
|
+
|
57
|
+
additions.inject('') do |out, (k, v)|
|
58
|
+
out + "$#{k}:##{v};"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def contents
|
63
|
+
@contents ||= begin
|
64
|
+
scss = file ? File.open(file).read : string
|
65
|
+
scss = "#{container} {#{scss}}" if container
|
66
|
+
scss
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# :nodoc:
|
72
|
+
class ImportBuddy < SassC::Importer
|
73
|
+
def imports(path, _parent_path)
|
74
|
+
if path_match(path)
|
75
|
+
SassC::Importer::Import.new(path_match(path))
|
76
|
+
else
|
77
|
+
SassC::Importer::Import.new(path)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def path_match(path)
|
82
|
+
custom_require_path.each do |k, v|
|
83
|
+
return File.join(v, path) unless (Regexp.new(k.to_s) =~ path).nil?
|
84
|
+
end
|
85
|
+
|
86
|
+
false
|
87
|
+
end
|
88
|
+
|
89
|
+
def custom_require_path
|
90
|
+
@custom_require_path ||= options[:require_paths]
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require_relative '../lib/sass-buddy.rb'
|
2
|
+
require 'tmpdir'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
RSpec.describe SassBuddy do
|
6
|
+
it 'compiles scss with given headers' do
|
7
|
+
styles = Tempfile.new("style.scss")
|
8
|
+
begin
|
9
|
+
styles.write(".hi { color: $var1; }")
|
10
|
+
styles.rewind
|
11
|
+
|
12
|
+
subject = described_class.new({
|
13
|
+
file: styles.path,
|
14
|
+
additions: {
|
15
|
+
"var1": "14a2d4"
|
16
|
+
}
|
17
|
+
})
|
18
|
+
|
19
|
+
expect(subject.compile).to eq(".hi {\n color: #14a2d4; }\n")
|
20
|
+
ensure
|
21
|
+
styles.close
|
22
|
+
styles.unlink
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'compiles scss from obscure paths' do
|
27
|
+
begin
|
28
|
+
tmp_dir = File.expand_path "#{Dir.pwd}/#{Time.now.to_i}#{rand(1000)}/"
|
29
|
+
FileUtils.mkdir_p tmp_dir
|
30
|
+
|
31
|
+
styles = Tempfile.new("style.scss")
|
32
|
+
external = Tempfile.new(['external', '.scss'], tmp_dir)
|
33
|
+
FileUtils.mv external.path, "#{tmp_dir}/external.scss"
|
34
|
+
|
35
|
+
styles.write("@import 'external'")
|
36
|
+
external.write(".hi { color: $var1; }")
|
37
|
+
|
38
|
+
external.rewind
|
39
|
+
styles.rewind
|
40
|
+
|
41
|
+
subject = described_class.new({
|
42
|
+
file: styles.path,
|
43
|
+
additions: {
|
44
|
+
"var1": "14a2d4"
|
45
|
+
},
|
46
|
+
require_paths: {
|
47
|
+
"external": tmp_dir + '/'
|
48
|
+
}
|
49
|
+
})
|
50
|
+
|
51
|
+
expect(subject.compile).to eq(".hi {\n color: #14a2d4; }\n")
|
52
|
+
ensure
|
53
|
+
styles.close
|
54
|
+
styles.unlink
|
55
|
+
external.close
|
56
|
+
external.unlink
|
57
|
+
FileUtils.rm_rf( tmp_dir ) if File.exists?( tmp_dir )
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'revves according to a manifest' do
|
62
|
+
styles = Tempfile.new("style.scss")
|
63
|
+
manifest = Tempfile.new("manifest.json")
|
64
|
+
begin
|
65
|
+
manifest.write("{\"images/fart.jpg\":\"images/fart-1234.jpg\"}")
|
66
|
+
manifest.rewind
|
67
|
+
styles.write(".hi { color: $var1; background-image: image-url('images/fart.jpg'); }")
|
68
|
+
styles.rewind
|
69
|
+
|
70
|
+
subject = described_class.new({
|
71
|
+
file: styles.path,
|
72
|
+
additions: {
|
73
|
+
"var1": "14a2d4"
|
74
|
+
},
|
75
|
+
rev_manifest: manifest.path
|
76
|
+
})
|
77
|
+
|
78
|
+
expect(subject.compile).to eq(".hi {\n color: #14a2d4;\n background-image: image-url(\"images/fart-1234.jpg\"); }\n")
|
79
|
+
ensure
|
80
|
+
styles.close
|
81
|
+
styles.unlink
|
82
|
+
manifest.close
|
83
|
+
manifest.unlink
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'compiles strings and contains them' do
|
88
|
+
string = 'h1 { color: blue }'
|
89
|
+
container = '#content'
|
90
|
+
|
91
|
+
subject = described_class.new({
|
92
|
+
string: string,
|
93
|
+
container: container
|
94
|
+
})
|
95
|
+
|
96
|
+
expect(subject.compile).to eq("#content h1 {\n color: blue; }\n")
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'creates html tags' do
|
100
|
+
string = 'h1 { color: blue }'
|
101
|
+
container = '#content'
|
102
|
+
|
103
|
+
subject = described_class.new({
|
104
|
+
string: string,
|
105
|
+
container: container
|
106
|
+
})
|
107
|
+
|
108
|
+
expect(subject.compile_html).to eq("<style>#content h1 {\n color: blue; }\n</style>")
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'compiles sass' do
|
112
|
+
string = "$color: red
|
113
|
+
|
114
|
+
=my-border($color)
|
115
|
+
border: 1px solid $color
|
116
|
+
|
117
|
+
body
|
118
|
+
background: $color
|
119
|
+
+my-border(green)"
|
120
|
+
|
121
|
+
subject = described_class.new({
|
122
|
+
string: string,
|
123
|
+
sass: true
|
124
|
+
})
|
125
|
+
|
126
|
+
expect(subject.compile).to eq("body {\n background: red;\n border: 1px solid green; }\n")
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'returns false for bad css' do
|
130
|
+
string = 'h1 { color: blue } adi8q3d9n'
|
131
|
+
container = '#content'
|
132
|
+
|
133
|
+
subject = described_class.new({
|
134
|
+
string: string,
|
135
|
+
container: container
|
136
|
+
})
|
137
|
+
|
138
|
+
expect(subject.compile_html).to eq(nil)
|
139
|
+
end
|
140
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sass-buddy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jesse Abramson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sassc
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: SassBuddy is a Sass compiler that uses the SassC engine to dynamically
|
42
|
+
assemble css
|
43
|
+
email: jesse@influitive.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- lib/sass-buddy.rb
|
49
|
+
- spec/sass-buddy-spec.rb
|
50
|
+
homepage:
|
51
|
+
licenses:
|
52
|
+
- MIT
|
53
|
+
metadata: {}
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options: []
|
56
|
+
require_paths:
|
57
|
+
- lib
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirements: []
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 2.4.8
|
71
|
+
signing_key:
|
72
|
+
specification_version: 4
|
73
|
+
summary: SassBuddy is a Sass compiler that uses the SassC engine to dynamically assemble
|
74
|
+
css
|
75
|
+
test_files: []
|