swig 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5c1d3f94a3dab8e4f1abec68f314d07baae8fc1c
4
+ data.tar.gz: 571cfabdaea4e56e084f0b706dcb39f4a1e4730b
5
+ SHA512:
6
+ metadata.gz: 6cc66f2a52994fdab262e23f923a8f97f7fa00e4d73b92fd25ba3c649537d63ad22de658554525bea544459006e3673e7f27ada49815a64d31a36fcc321ec65c
7
+ data.tar.gz: a8730c523463038c2ccf9236007edd1acbf2c6a1c0a62e7512a0c1d82f40f6d2956dd79cf4190d666476ed4992c8211201cb441c1bff86da280138963c5f4cd8
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .bundle
2
+ pkg
3
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,30 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ swig (0.0.1)
5
+ colorize
6
+ trollop
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ colorize (0.6.0)
12
+ diff-lcs (1.2.5)
13
+ rake (10.1.1)
14
+ rspec (2.14.1)
15
+ rspec-core (~> 2.14.0)
16
+ rspec-expectations (~> 2.14.0)
17
+ rspec-mocks (~> 2.14.0)
18
+ rspec-core (2.14.7)
19
+ rspec-expectations (2.14.5)
20
+ diff-lcs (>= 1.1.3, < 2.0)
21
+ rspec-mocks (2.14.5)
22
+ trollop (2.0)
23
+
24
+ PLATFORMS
25
+ ruby
26
+
27
+ DEPENDENCIES
28
+ rake
29
+ rspec
30
+ swig!
data/README.md ADDED
@@ -0,0 +1,28 @@
1
+ Swig
2
+ ====
3
+
4
+ Install it with
5
+
6
+ ```
7
+ gem install swig
8
+ ```
9
+
10
+ Make a file called `swig_file.rb` containing
11
+
12
+ ```ruby
13
+ require 'swig/all'
14
+
15
+ Swig.new_task(:concat) do
16
+ read("spec/fixtures/*.js").
17
+ then(Concat, name: "app.js").
18
+ write("tmp")
19
+ end
20
+ ```
21
+
22
+ Then run this from the command line
23
+
24
+ ```
25
+ swig concat
26
+ ```
27
+
28
+ And see magic!
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/TODO.markdown ADDED
@@ -0,0 +1,14 @@
1
+ Todos
2
+ =====
3
+
4
+ General
5
+ -------
6
+
7
+ - Move files into the right folders
8
+ - Tests
9
+
10
+ Features
11
+ --------
12
+
13
+ - Way of removing files from stream (maybe all files that match a pattern)
14
+ - Add files to the stream
data/bin/swig ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'swig/all'
4
+ require 'trollop'
5
+
6
+ opts = Trollop::options do
7
+ banner <<-EOS
8
+ Swig is a streaming task runner
9
+
10
+ Usage:
11
+ swig [options] <task name>
12
+
13
+ where [options] are:
14
+
15
+ EOS
16
+ opt :tasks, "Show tasks", default: false
17
+ end
18
+
19
+ # Go to config file
20
+ begin
21
+ Swig.cd_to_config_file
22
+ eval File.read("swig_file.rb")
23
+ rescue Swig::NoSwigFile
24
+ puts "Hit edge of file system searching for swig file"
25
+ exit 1
26
+ end
27
+
28
+ # Show tasks
29
+ if opts[:tasks]
30
+ Swig.tasks.keys.each do |name|
31
+ puts "swig #{name}"
32
+ end
33
+
34
+ exit 0
35
+ end
36
+
37
+ # Run task
38
+ puts Swig.divider
39
+ if ARGV.empty?
40
+ Swig.tasks.keys.each do |task|
41
+ Swig.invoke(task)
42
+ end
43
+ else
44
+ Swig.invoke(ARGV.first.to_sym)
45
+ end
data/lib/swig/all.rb ADDED
@@ -0,0 +1,4 @@
1
+ Dir.glob("lib/swig/**/*.rb").each do |path|
2
+ file = path.match(/lib\/(?<file>.*?)\.rb/)[:file]
3
+ require file
4
+ end
@@ -0,0 +1,17 @@
1
+ require 'swig/swig'
2
+
3
+ class Swig
4
+ class FileInStream
5
+ def initialize(*args)
6
+ @basename, @content = args
7
+ end
8
+
9
+ def basename
10
+ File.basename(@basename)
11
+ end
12
+
13
+ def read
14
+ @content
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,46 @@
1
+ require 'swig/swig'
2
+ require 'fileutils'
3
+
4
+ class Swig
5
+ class Stream
6
+ attr_reader :files
7
+
8
+ def initialize
9
+ @files = []
10
+ end
11
+
12
+ def read(path_or_paths)
13
+ Dir.glob(path_or_paths).each do |path|
14
+ basename = File.basename(path)
15
+ content = File.read(path)
16
+ @files << Swig::FileInStream.new(basename, content)
17
+ end
18
+
19
+ self
20
+ end
21
+
22
+ def write(path)
23
+ FileUtils.mkdir_p(path)
24
+
25
+ @files.each do |file|
26
+ File.write(File.join(path, file.basename), file.read)
27
+ end
28
+
29
+ self
30
+ end
31
+
32
+ def clean(pattern = //)
33
+ @files = @files.reject do |file|
34
+ pattern =~ file.basename
35
+ end
36
+
37
+ self
38
+ end
39
+
40
+ def then(klass, options = {})
41
+ @files = klass.new(options).eval(@files)
42
+
43
+ self
44
+ end
45
+ end
46
+ end
data/lib/swig/swig.rb ADDED
@@ -0,0 +1,56 @@
1
+ require 'colorize'
2
+ require 'benchmark'
3
+ require 'swig/stream'
4
+ require 'swig/file_in_stream'
5
+
6
+ class Swig
7
+ class NoSuchTask < Exception; end
8
+ class NoSwigFile < Exception; end
9
+
10
+ def self.new_task(name, &block)
11
+ @@tasks ||= {}
12
+
13
+ @@tasks[name] = block
14
+ end
15
+
16
+ def self.invoke(name)
17
+ @@tasks ||= {}
18
+
19
+ block = @@tasks.fetch(name)
20
+
21
+ time = (Benchmark.realtime do
22
+ Swig::Stream.new.instance_eval(&block)
23
+ end * 1000).round(2)
24
+
25
+ show_message(name, time)
26
+ rescue KeyError
27
+ raise NoSuchTask.new("task named \"#{name}\" doesn't exist")
28
+ end
29
+
30
+ def self.cd_to_config_file
31
+ until File.exists?("swig_file.rb")
32
+ Dir.chdir("../")
33
+
34
+ raise NoSwigFile if Dir.pwd == "/"
35
+ end
36
+ end
37
+
38
+ def self.tasks
39
+ @@tasks
40
+ end
41
+
42
+ def self.divider
43
+ "=======================================".green
44
+ end
45
+
46
+ private
47
+
48
+ def self.show_message(name, time)
49
+ print "swig: ".blue
50
+ print "#{name}, "
51
+ puts "#{time} milliseconds"
52
+ print divider
53
+ print "\n"
54
+ end
55
+
56
+ end
@@ -0,0 +1,7 @@
1
+ class Swig
2
+ class Worker
3
+ def initialize(options)
4
+ @options = options
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ require 'swig/file_in_stream'
2
+ require 'swig/worker'
3
+
4
+ class Concat < Swig::Worker
5
+ def eval(files)
6
+ [Swig::FileInStream.new(@options[:name], concatenated_content(files))]
7
+ end
8
+
9
+ private
10
+
11
+ def concatenated_content(files)
12
+ files.inject("") { |acc, file| acc += file.read }
13
+ end
14
+ end
@@ -0,0 +1 @@
1
+ alert('bar');
@@ -0,0 +1 @@
1
+ console.log('foo');
@@ -0,0 +1 @@
1
+ body { background: red; }
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+ require 'fileutils'
3
+ require 'swig/all'
4
+
5
+ describe Swig::Stream do
6
+ let(:stream) { Swig::Stream.new }
7
+ let(:css_file) { "spec/fixtures/style.css" }
8
+ let(:all_js_files) { "spec/fixtures/*.js" }
9
+ let(:js_file) { "spec/fixtures/init.js" }
10
+
11
+ after { FileUtils.rm_rf("tmp") }
12
+
13
+ it "can read one file" do
14
+ stream.read(css_file)
15
+
16
+ stream.should have(1).files
17
+ end
18
+
19
+ it "can read several files" do
20
+ stream.read([all_js_files, css_file])
21
+
22
+ stream.should have(3).files
23
+ end
24
+
25
+ it "can write its files to a directory" do
26
+ filename = File.basename(css_file)
27
+ stream.read(css_file)
28
+ stream.write("tmp")
29
+
30
+ File.exists?("tmp/#{filename}").should be_true
31
+ File.read("tmp/#{filename}").should eq File.read("spec/fixtures/#{filename}")
32
+ end
33
+
34
+ describe "#clean" do
35
+ before do
36
+ stream.read(js_file)
37
+ stream.read(css_file)
38
+ end
39
+
40
+ it "can clean away all files" do
41
+ stream.clean
42
+
43
+ stream.should have(0).files
44
+ end
45
+
46
+ it "can clean away matching files" do
47
+ stream.clean(/.*\.js/)
48
+
49
+ stream.should have(1).files
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+ require 'fileutils'
3
+ require 'swig/all'
4
+
5
+ describe Swig do
6
+ it "blows up when you try to invoke an undefined task" do
7
+ expect do
8
+ Swig.invoke(:no_task)
9
+ end.to raise_error(Swig::NoSuchTask, "task named \"no_task\" doesn't exist")
10
+ end
11
+
12
+ context "a task that just moves files" do
13
+ it "moves files" do
14
+ Swig.new_task(:move) do
15
+ read("spec/fixtures/init.js").
16
+ write("tmp")
17
+ end
18
+
19
+ Swig.invoke(:move)
20
+
21
+ File.exists?("tmp/init.js").should be_true
22
+ end
23
+ end
24
+
25
+ context "a task that concatenates files" do
26
+ it "concatenates files and saves" do
27
+ Swig.new_task(:concat) do
28
+ read("spec/fixtures/*.js").
29
+ then(Concat, name: "app.js").
30
+ write("tmp")
31
+ end
32
+
33
+ Swig.invoke(:concat)
34
+
35
+ File.exists?("tmp/app.js").should be_true
36
+ end
37
+ end
38
+
39
+ context "finding the config file" do
40
+ after(:each) do
41
+ FileUtils.rm_rf("swig_file.rb") if File.exists?("swig_file.rb")
42
+ end
43
+
44
+ it "finds it when it is in the same dir" do
45
+ File.write("swig_file.rb", "require 'swig/all'")
46
+
47
+ Swig.cd_to_config_file
48
+ File.exists?("swig_file.rb").should be_true
49
+ end
50
+
51
+ it "finds it when it is in a lower dir" do
52
+ File.write("swig_file.rb", "require 'swig/all'")
53
+ Dir.chdir("spec/fixtures/")
54
+
55
+ Swig.cd_to_config_file
56
+
57
+ File.exists?("swig_file.rb").should be_true
58
+ end
59
+
60
+ it "raises and error if it hits the edge of the file system" do
61
+ expect do
62
+ Swig.cd_to_config_file
63
+ end.to raise_error Swig::NoSwigFile
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require 'fileutils'
3
+ require 'swig/all'
4
+
5
+ describe Concat do
6
+ let(:stream) { Swig::Stream.new }
7
+ let(:content) { File.read("spec/fixtures/init.js") + File.read("spec/fixtures/script.js") }
8
+
9
+ before do
10
+ stream.read("spec/fixtures/init.js")
11
+ stream.read("spec/fixtures/script.js")
12
+
13
+ stream.then(Concat, name: "foo.css")
14
+ end
15
+
16
+ it "merges the files" do
17
+ stream.should have(1).files
18
+ end
19
+
20
+ it "concatenates the files content" do
21
+ stream.files.first.read.should eq content
22
+ end
23
+
24
+ it "sets the name of the file" do
25
+ stream.files.first.basename.should eq "foo.css"
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+ end
data/swig.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'swig'
3
+ s.version = '0.0.1'
4
+ s.date = '2014-02-08'
5
+ s.summary = "Task runner"
6
+ s.description = "Task runner"
7
+ s.authors = ["David Pedersen"]
8
+ s.email = 'david.pdrsn@gmail.com'
9
+ s.homepage = 'http://github.com/davidpdrsn/swig'
10
+ s.license = 'MIT'
11
+
12
+ s.add_development_dependency 'rake'
13
+ s.add_development_dependency 'rspec'
14
+
15
+ s.add_runtime_dependency 'trollop'
16
+ s.add_runtime_dependency 'colorize'
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ end
data/swig_file.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'swig/all'
2
+
3
+ Swig.new_task(:concat) do
4
+ read("spec/fixtures/*.js").
5
+ then(Concat, name: "app.js").
6
+ write("tmp")
7
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: swig
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - David Pedersen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
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: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: trollop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: colorize
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Task runner
70
+ email: david.pdrsn@gmail.com
71
+ executables:
72
+ - swig
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".rspec"
78
+ - Gemfile
79
+ - Gemfile.lock
80
+ - README.md
81
+ - Rakefile
82
+ - TODO.markdown
83
+ - bin/swig
84
+ - lib/swig/all.rb
85
+ - lib/swig/file_in_stream.rb
86
+ - lib/swig/stream.rb
87
+ - lib/swig/swig.rb
88
+ - lib/swig/worker.rb
89
+ - lib/swig/workers/concat.rb
90
+ - spec/fixtures/init.js
91
+ - spec/fixtures/script.js
92
+ - spec/fixtures/style.css
93
+ - spec/lib/swig/stream_spec.rb
94
+ - spec/lib/swig/swig_spec.rb
95
+ - spec/lib/workers/concat_spec.rb
96
+ - spec/spec_helper.rb
97
+ - swig.gemspec
98
+ - swig_file.rb
99
+ homepage: http://github.com/davidpdrsn/swig
100
+ licenses:
101
+ - MIT
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 2.2.0
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: Task runner
123
+ test_files: []