bower-rails-pt 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.md +110 -0
- data/lib/bower-rails.rb +4 -0
- data/lib/bower-rails/dsl.rb +108 -0
- data/lib/bower-rails/railtie.rb +30 -0
- data/lib/generators/bower_rails/initialize/initialize_generator.rb +15 -0
- data/lib/generators/bower_rails/initialize/templates/bower.json +12 -0
- data/lib/tasks/bower.rake +123 -0
- metadata +86 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2012 Ross Harrison
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
bower-rails
|
2
|
+
===========
|
3
|
+
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/bower-rails.png)](http://badge.fury.io/rb/bower-rails)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/42dev/bower-rails.png)](https://codeclimate.com/github/42dev/bower-rails)
|
6
|
+
[![Dependency Status](https://gemnasium.com/SergeyKishenin/bower-rails.png)](https://gemnasium.com/SergeyKishenin/bower-rails)
|
7
|
+
[![Build Status](https://travis-ci.org/42dev/bower-rails.png?branch=master)](https://travis-ci.org/42dev/bower-rails)
|
8
|
+
[![Coverage Status](https://coveralls.io/repos/42dev/bower-rails/badge.png)](https://coveralls.io/r/42dev/bower-rails)
|
9
|
+
|
10
|
+
Bower support for Rails projects. Dependency file is bower.json in Rails root dir or Bowerfile if you use DSL.
|
11
|
+
Check out Changelog.md for the latest changes and releases.
|
12
|
+
|
13
|
+
**Requirements**
|
14
|
+
|
15
|
+
* [node](http://nodejs.org) ([on github](https://github.com/joyent/node))
|
16
|
+
* [bower](https://github.com/bower/bower) (>= 0.10.0) installed with npm
|
17
|
+
|
18
|
+
**Install**
|
19
|
+
|
20
|
+
in Gemfile
|
21
|
+
|
22
|
+
``` Ruby
|
23
|
+
gem "bower-rails", "~> 0.5.0"
|
24
|
+
```
|
25
|
+
|
26
|
+
**Initialize**
|
27
|
+
|
28
|
+
To add an empty bower.json file to the project root.
|
29
|
+
|
30
|
+
``` Bash
|
31
|
+
rails g bower_rails:initialize
|
32
|
+
```
|
33
|
+
|
34
|
+
##JSON configuration
|
35
|
+
|
36
|
+
The bower.json file is two seperate bower [component.js](https://github.com/twitter/bower#defining-a-package) files. Defining a package in lib and vendor will install those packages to the corresponding directories.
|
37
|
+
|
38
|
+
**example bower.json file**
|
39
|
+
|
40
|
+
``` javascript
|
41
|
+
{
|
42
|
+
"lib": {
|
43
|
+
"name": "bower-rails generated lib assets",
|
44
|
+
"dependencies": {
|
45
|
+
"threex" : "git@github.com:rharriso/threex.git",
|
46
|
+
"gsvpano.js" : "https://github.com/rharriso/GSVPano.js/blob/master/src/GSVPano.js"
|
47
|
+
}
|
48
|
+
},
|
49
|
+
"vendor": {
|
50
|
+
"name": "bower-rails generated vendor assets",
|
51
|
+
"dependencies": {
|
52
|
+
"three.js" : "https://raw.github.com/mrdoob/three.js/master/build/three.js"
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
```
|
57
|
+
|
58
|
+
##Ruby DSL configuration
|
59
|
+
|
60
|
+
The Ruby DSL configuration is a Bowerfile at the project's root with DSL syntax similar to Bundler.
|
61
|
+
|
62
|
+
**Example Bowerfile**
|
63
|
+
|
64
|
+
By default assets are put to `./vendor/assets/bower_components` directory:
|
65
|
+
|
66
|
+
``` ruby
|
67
|
+
|
68
|
+
# Puts to ./vendor/assets/bower_components
|
69
|
+
asset "backbone"
|
70
|
+
asset "moment"
|
71
|
+
```
|
72
|
+
|
73
|
+
But the default value can be overridden by `assets_path` method:
|
74
|
+
|
75
|
+
``` ruby
|
76
|
+
assets_path "assets/my_javascripts"
|
77
|
+
|
78
|
+
# Puts to ./vendor/assets/my_javascripts/bower_components
|
79
|
+
asset "backbone"
|
80
|
+
asset "moment"
|
81
|
+
```
|
82
|
+
|
83
|
+
And finally, the `assets_path` method can be overridden by an option in a `group` call:
|
84
|
+
|
85
|
+
``` ruby
|
86
|
+
assets_path "assets/javascript"
|
87
|
+
|
88
|
+
# Puts files under ./vendor/assets/js/bower_components
|
89
|
+
group :vendor, :assets_path => "assets/js" do
|
90
|
+
asset "jquery" # Assummes it's latests
|
91
|
+
asset "backbone", "1.2"
|
92
|
+
end
|
93
|
+
|
94
|
+
# Puts files under ./lib/assets/javascript/bower_components
|
95
|
+
group :lib do
|
96
|
+
asset "jquery"
|
97
|
+
asset "backbone", "1.2"
|
98
|
+
end
|
99
|
+
```
|
100
|
+
NOTE: All the assets should be stored in `/assets` subdirectory so putting it under `./vendor/js` directory is unavailable
|
101
|
+
|
102
|
+
##Rake tasks
|
103
|
+
|
104
|
+
Once you are done with `bower.json` or `Bowerfile` you can run
|
105
|
+
|
106
|
+
* `rake bower:install` to install js components
|
107
|
+
* `rake bower:install:force` to install with force option
|
108
|
+
* `rake bower:update` to update js components
|
109
|
+
* `rake bower:update:prune` to update components and uninstall extraneous packages
|
110
|
+
* `rake bower:list` to list all packages
|
data/lib/bower-rails.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module BowerRails
|
5
|
+
class Dsl
|
6
|
+
|
7
|
+
def self.evalute(filename)
|
8
|
+
new.tap { |dsl| dsl.eval_file(File.join(dsl.root_path, filename)) }
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :dependencies, :root_path
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@dependencies = {}
|
15
|
+
@root_path ||= defined?(Rails) ? Rails.root : Dir.pwd
|
16
|
+
@assets_path ||= "assets"
|
17
|
+
end
|
18
|
+
|
19
|
+
def eval_file(file)
|
20
|
+
instance_eval(File.open(file, "rb") { |f| f.read }, file.to_s)
|
21
|
+
end
|
22
|
+
|
23
|
+
def directories
|
24
|
+
@dependencies.keys
|
25
|
+
end
|
26
|
+
|
27
|
+
def group(name, options = {}, &block)
|
28
|
+
if custom_assets_path = options[:assets_path]
|
29
|
+
assert_asset_path custom_assets_path
|
30
|
+
end
|
31
|
+
add_group(name, options)
|
32
|
+
yield if block_given?
|
33
|
+
end
|
34
|
+
|
35
|
+
def asset(name, version = "latest")
|
36
|
+
groups.each do |g|
|
37
|
+
g_norm = normalize_location_path(g.first, group_assets_path(g))
|
38
|
+
@dependencies[g_norm] ||= {}
|
39
|
+
@dependencies[g_norm][name] = version
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_json(location)
|
44
|
+
dependencies_to_json @dependencies[normalize_location_path(location)]
|
45
|
+
end
|
46
|
+
|
47
|
+
def write_bower_json
|
48
|
+
@dependencies.each do |dir,data|
|
49
|
+
FileUtils.mkdir_p dir unless File.directory? dir
|
50
|
+
File.open(File.join(dir,"bower.json"), "w") do |f|
|
51
|
+
f.write(dependencies_to_json(data))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def write_dotbowerrc
|
57
|
+
groups.map do |g|
|
58
|
+
g_norm = normalize_location_path(g.first, group_assets_path(g))
|
59
|
+
File.open(File.join(g_norm, ".bowerrc"), "w") do |f|
|
60
|
+
f.write(JSON.pretty_generate({:directory => "bower_components/pt"}))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def final_assets_path
|
66
|
+
groups.map do |g|
|
67
|
+
[g.first.to_s, group_assets_path(g)]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def group_assets_path group
|
72
|
+
group_options = Hash === group.last ? group.last : {:assets_path => @assets_path}
|
73
|
+
group_options[:assets_path]
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def add_group(*group)
|
79
|
+
@groups = (groups << group)
|
80
|
+
end
|
81
|
+
|
82
|
+
def groups
|
83
|
+
@groups ||= [[:vendor, { :assets_path => @assets_path }]]
|
84
|
+
end
|
85
|
+
|
86
|
+
def dependencies_to_json(data)
|
87
|
+
JSON.pretty_generate({
|
88
|
+
:name => "dsl-generated dependencies",
|
89
|
+
:dependencies => data
|
90
|
+
})
|
91
|
+
end
|
92
|
+
|
93
|
+
def assets_path(assets_path)
|
94
|
+
assert_asset_path assets_path
|
95
|
+
@assets_path = assets_path
|
96
|
+
end
|
97
|
+
|
98
|
+
def assert_asset_path(path)
|
99
|
+
if !path.start_with?('assets', '/assets')
|
100
|
+
raise ArgumentError, "Assets should be stored in /assets directory, try assets_path 'assets/#{path}' instead"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def normalize_location_path(loc, assets_path)
|
105
|
+
File.join(@root_path, loc.to_s, assets_path)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'bower-rails'
|
2
|
+
require 'bower-rails/dsl'
|
3
|
+
require 'rails'
|
4
|
+
|
5
|
+
module BowerRails
|
6
|
+
class Railtie < Rails::Railtie
|
7
|
+
railtie_name :bower
|
8
|
+
@@bowerfile = File.join("Bowerfile")
|
9
|
+
|
10
|
+
if File.exist?(@@bowerfile)
|
11
|
+
config.before_initialize do |app|
|
12
|
+
@dsl = BowerRails::Dsl.evalute(@@bowerfile)
|
13
|
+
|
14
|
+
@dsl.final_assets_path.map do |assets_root, assets_path|
|
15
|
+
app.config.assets.paths << Rails.root.join(assets_root, assets_path, "bower_components")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
else
|
19
|
+
config.before_initialize do |app|
|
20
|
+
["lib", "vendor"].each do |dir|
|
21
|
+
app.config.assets.paths << Rails.root.join(dir, 'assets', 'bower_components')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
rake_tasks do
|
27
|
+
load "tasks/bower.rake"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module BowerRails
|
2
|
+
module Generators
|
3
|
+
class InitializeGenerator < Rails::Generators::Base
|
4
|
+
desc "Adds a boilerplate component.json file to root of rails project"
|
5
|
+
|
6
|
+
def self.source_root
|
7
|
+
@_bower_rails_source_root ||= File.expand_path("../templates", __FILE__)
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_initializer_file
|
11
|
+
template "bower.json", 'bower.json'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
namespace :bower do
|
5
|
+
desc "Install components from bower"
|
6
|
+
task :install do
|
7
|
+
perform do
|
8
|
+
sh 'bower install'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
namespace :install do
|
13
|
+
desc "Install components with -F option"
|
14
|
+
task :force do
|
15
|
+
perform do
|
16
|
+
sh 'bower install -F'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Update bower components"
|
22
|
+
task :update do
|
23
|
+
perform do
|
24
|
+
sh 'bower update'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "List bower components"
|
29
|
+
task :list do
|
30
|
+
perform false do
|
31
|
+
sh 'bower list'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
namespace :update do
|
36
|
+
desc "Update existing components and uninstalls extraneous components"
|
37
|
+
task :prune do
|
38
|
+
perform do
|
39
|
+
sh 'bower update && bower prune'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def perform remove_components = true, &block
|
46
|
+
entries = Dir.entries(get_bower_root_path)
|
47
|
+
|
48
|
+
if entries.include?('Bowerfile')
|
49
|
+
dsl_perform_command remove_components, &block
|
50
|
+
elsif entries.include?('bower.json')
|
51
|
+
perform_command remove_components, &block
|
52
|
+
else
|
53
|
+
raise LoadError, "No Bowerfile or bower.json file found. Make sure you have it at the root of your project"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_bower_root_path
|
58
|
+
if defined?(Rails)
|
59
|
+
return Rails.root
|
60
|
+
else
|
61
|
+
return Dir.pwd
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def dsl_perform_command remove_components = true, &block
|
66
|
+
dsl = BowerRails::Dsl.evalute("Bowerfile")
|
67
|
+
|
68
|
+
if remove_components
|
69
|
+
dsl.write_bower_json
|
70
|
+
dsl.write_dotbowerrc
|
71
|
+
puts "bower.js files generated"
|
72
|
+
end
|
73
|
+
|
74
|
+
if block_given?
|
75
|
+
dsl.directories.each do |dir|
|
76
|
+
Dir.chdir(dir) do
|
77
|
+
yield
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
#run the passed bower block in appropriate folders
|
84
|
+
def perform_command remove_components = true, &block
|
85
|
+
bower_root = get_bower_root_path
|
86
|
+
#load in bower json file
|
87
|
+
txt = File.read(File.join(bower_root, "bower.json"))
|
88
|
+
json = JSON.parse(txt)
|
89
|
+
|
90
|
+
["lib", "vendor"].each do |dir|
|
91
|
+
|
92
|
+
data = json[dir]
|
93
|
+
|
94
|
+
#check folder existence and create?
|
95
|
+
dir = File.join(bower_root, dir, "assets")
|
96
|
+
FileUtils.mkdir_p dir unless File.directory? dir
|
97
|
+
#go in to dir to act
|
98
|
+
Dir.chdir(dir) do
|
99
|
+
|
100
|
+
#remove old components
|
101
|
+
FileUtils.rm_rf("bower_components") if remove_components
|
102
|
+
|
103
|
+
#create bower json
|
104
|
+
File.open("bower.json", "w") do |f|
|
105
|
+
f.write(data.to_json)
|
106
|
+
end
|
107
|
+
|
108
|
+
#create .bowerrc
|
109
|
+
File.open(".bowerrc", "w") do |f|
|
110
|
+
f.write(JSON.pretty_generate({:directory => "bower_components"}))
|
111
|
+
end
|
112
|
+
|
113
|
+
#run command
|
114
|
+
yield if block_given?
|
115
|
+
|
116
|
+
#remove bower file
|
117
|
+
FileUtils.rm("bower.json")
|
118
|
+
|
119
|
+
#remove .bowerrc
|
120
|
+
FileUtils.rm(".bowerrc")
|
121
|
+
end if data && !data["dependencies"].empty?
|
122
|
+
end
|
123
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bower-rails-pt
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ross Harrison
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-09-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: Rails integration for bower.
|
47
|
+
email: rtharrison86@gmail.com
|
48
|
+
executables: []
|
49
|
+
extensions: []
|
50
|
+
extra_rdoc_files: []
|
51
|
+
files:
|
52
|
+
- lib/generators/bower_rails/initialize/templates/bower.json
|
53
|
+
- lib/generators/bower_rails/initialize/initialize_generator.rb
|
54
|
+
- lib/bower-rails.rb
|
55
|
+
- lib/tasks/bower.rake
|
56
|
+
- lib/bower-rails/dsl.rb
|
57
|
+
- lib/bower-rails/railtie.rb
|
58
|
+
- MIT-LICENSE
|
59
|
+
- README.md
|
60
|
+
homepage: https://github.com/cj/bower-rails-pt
|
61
|
+
licenses:
|
62
|
+
- MIT
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
requirements: []
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 1.8.25
|
82
|
+
signing_key:
|
83
|
+
specification_version: 3
|
84
|
+
summary: Bower for Rails
|
85
|
+
test_files: []
|
86
|
+
has_rdoc:
|