rid 0.5.2 → 1.0.2
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.
- data/LICENSE +1 -1
- data/README +14 -0
- data/Rakefile +18 -33
- data/VERSION +1 -0
- data/bin/rid +3 -6
- data/lib/rid/app.rb +49 -0
- data/lib/rid/attachments.rb +6 -2
- data/lib/rid/commands.rb +61 -39
- data/lib/rid/core_ext/hash.rb +1 -1
- data/lib/rid/database.rb +69 -0
- data/lib/rid/document.rb +99 -0
- data/lib/rid.rb +14 -41
- data/rid.gemspec +49 -78
- data/spec/mock_app/_database +1 -0
- data/spec/rid/app_spec.rb +59 -0
- data/spec/rid/attachments_spec.rb +2 -2
- data/spec/rid/commands_spec.rb +14 -0
- data/spec/rid/database_spec.rb +25 -0
- data/spec/rid/document_spec.rb +36 -0
- data/spec/spec_helper.rb +6 -0
- metadata +127 -86
- data/.gitmodules +0 -3
- data/README.rdoc +0 -92
- data/lib/rid/actions/base.rb +0 -15
- data/lib/rid/actions/pull.rb +0 -28
- data/lib/rid/actions/push.rb +0 -53
- data/lib/rid/actions/routes.rb +0 -44
- data/lib/rid/commands/destroy.rb +0 -9
- data/lib/rid/commands/generate.rb +0 -9
- data/lib/rid/commands/pull.rb +0 -4
- data/lib/rid/commands/push.rb +0 -4
- data/lib/rid/commands/routes.rb +0 -4
- data/lib/rid/design_document.rb +0 -149
- data/lib/rid/generators/application/USAGE +0 -10
- data/lib/rid/generators/application/application_generator.rb +0 -56
- data/lib/rid/generators/application/templates/README +0 -1
- data/lib/rid/generators/application/templates/_attachments/index.html +0 -11
- data/lib/rid/generators/application/templates/_attachments/stylesheets/application.css +0 -25
- data/lib/rid/generators/application/templates/_id +0 -1
- data/lib/rid/generators/application/templates/gitignore +0 -0
- data/lib/rid/generators/application/templates/lib/mustache.js +0 -305
- data/lib/rid/generators/application/templates/lib/path.js +0 -5
- data/lib/rid/generators/application/templates/lib/templates/layout.mustache +0 -14
- data/lib/rid/generators/application/templates/ridrc +0 -1
- data/lib/rid/generators/application/templates/validate_doc_update.js +0 -3
- data/lib/rid/generators/base.rb +0 -66
- data/lib/rid/generators/list/USAGE +0 -8
- data/lib/rid/generators/list/list_generator.rb +0 -10
- data/lib/rid/generators/list/templates/index.mustache +0 -23
- data/lib/rid/generators/list/templates/list.js +0 -34
- data/lib/rid/generators/named_base.rb +0 -22
- data/lib/rid/generators/scaffold/USAGE +0 -10
- data/lib/rid/generators/scaffold/scaffold_generator.rb +0 -32
- data/lib/rid/generators/show/USAGE +0 -8
- data/lib/rid/generators/show/show_generator.rb +0 -13
- data/lib/rid/generators/show/templates/delete.mustache +0 -20
- data/lib/rid/generators/show/templates/deleted.mustache +0 -3
- data/lib/rid/generators/show/templates/form.mustache +0 -22
- data/lib/rid/generators/show/templates/show.js +0 -48
- data/lib/rid/generators/show/templates/show.mustache +0 -13
- data/lib/rid/generators/update/USAGE +0 -8
- data/lib/rid/generators/update/templates/update.js +0 -48
- data/lib/rid/generators/update/update_generator.rb +0 -9
- data/lib/rid/generators/validation/USAGE +0 -9
- data/lib/rid/generators/validation/templates/validate_doc_update.js +0 -3
- data/lib/rid/generators/validation/validation_generator.rb +0 -34
- data/lib/rid/generators/view/USAGE +0 -8
- data/lib/rid/generators/view/templates/map.js +0 -5
- data/lib/rid/generators/view/view_generator.rb +0 -17
- data/lib/rid/generators.rb +0 -63
- data/lib/rid/makros.rb +0 -114
- data/lib/rid/version.rb +0 -3
- data/spec/rid/design_document_spec.rb +0 -220
- data/spec/rid/makros_spec.rb +0 -94
- data/spec/rid_spec.rb +0 -7
data/README.rdoc
DELETED
@@ -1,92 +0,0 @@
|
|
1
|
-
= Rid
|
2
|
-
== Red in a different color
|
3
|
-
|
4
|
-
Standalone Couchdb Application Development Suite
|
5
|
-
|
6
|
-
With Rid you can easy build a standalone Couchdb application. Rid aims to bring some of the Rails beauty to Couchdb.
|
7
|
-
Currently Rid supports Rails style Generators you will love, using the same awesome Thor library used in Rails 3.
|
8
|
-
|
9
|
-
|
10
|
-
== Why?
|
11
|
-
|
12
|
-
Why do we need a new Couchdb Application Development Suite? We already have the powerful {CouchApp}[http://github.com/couchapp/couchapp].
|
13
|
-
|
14
|
-
I need more beauty. I want some elegance on the command line.
|
15
|
-
|
16
|
-
I know my attempt is almost a small little step towards the beauty I aspire.
|
17
|
-
I try to pilfer the most of now: From CouchApp and Ruby on Rails.
|
18
|
-
So here we go:
|
19
|
-
|
20
|
-
<em>Rid is designed to structure standalone Couchdb application development for maximum application portability.</em>
|
21
|
-
|
22
|
-
=== Web development that doesn't hurt
|
23
|
-
|
24
|
-
Rid is a set of open-source tools that's optimized for programmer happiness and sustainable productivity. It lets you write beautyful code by favoring convention over configuration.
|
25
|
-
|
26
|
-
=== Write apps using just Javascript and HTML
|
27
|
-
|
28
|
-
Render HTML documents using Javascript templates run by Couchdb. You'll get parallelism and cacheability, *using only HTML and Javascript*.
|
29
|
-
Building standalone Couchdb applications according to correct principles affords you options not found on other platforms.
|
30
|
-
|
31
|
-
|
32
|
-
== What comes next
|
33
|
-
|
34
|
-
At the moment, Rid supports generating a scaffold application, pushing to a Couchdb server and pulling from a Couchdb.
|
35
|
-
Rid injects the !code and !json makros introduced by CouchApp.
|
36
|
-
|
37
|
-
The very next steps are:
|
38
|
-
|
39
|
-
* add support for edit and delete
|
40
|
-
|
41
|
-
|
42
|
-
== I need your help!
|
43
|
-
|
44
|
-
The reason why I release that project in such an early state is that I beleave it's you, who invent that desired beauty!
|
45
|
-
|
46
|
-
|
47
|
-
== Prerequisites
|
48
|
-
|
49
|
-
All you need is Ruby and its packet manager RubyGems. If you do not have a Ruby environment,
|
50
|
-
|
51
|
-
apt-get install ruby rubygems
|
52
|
-
|
53
|
-
will probably install the required packages. If you run into any troubles, visit http://docs.rubygems.org/read/chapter/3 for in deapth installation notes for RubyGems, and http://www.ruby-lang.org/en/downloads/ for help on installing Ruby.
|
54
|
-
|
55
|
-
Of course, Rid relies on Couchdb. You do not have to install your own Couchdb server if you have access to a Couchdb database over the internet, but I recommend it for development.
|
56
|
-
If you are new to Couchdb, install it:
|
57
|
-
|
58
|
-
apt-get install couchdb
|
59
|
-
|
60
|
-
Take a look at the Couchdb Wiki, where the page http://wiki.apache.org/couchdb/Installation describes the installation for all common systems.
|
61
|
-
|
62
|
-
|
63
|
-
== Installation
|
64
|
-
|
65
|
-
Rid installation is easy.
|
66
|
-
Rid is available as RubyGem, hosted on http://rubygems.org/ (aka Gemcutter) and Rubyforge (http://rubyforge.org).
|
67
|
-
Install the gem with
|
68
|
-
|
69
|
-
gem install rid
|
70
|
-
|
71
|
-
|
72
|
-
== Gettings started
|
73
|
-
|
74
|
-
Once installed, your system will have the brand new +rid+ command.
|
75
|
-
So just type
|
76
|
-
|
77
|
-
rid
|
78
|
-
|
79
|
-
and relax.
|
80
|
-
|
81
|
-
|
82
|
-
== Note on Patches/Pull Requests
|
83
|
-
|
84
|
-
* Fork the project.
|
85
|
-
* Make your feature addition or bug fix.
|
86
|
-
* Commit, do not mess with rakefile, version, or history.
|
87
|
-
* Send me a pull request. Bonus points for topic branches.
|
88
|
-
|
89
|
-
|
90
|
-
== Copyright
|
91
|
-
|
92
|
-
Copyright (c) 2010 Johannes Jörg Schmidt, TF. See LICENSE for details.
|
data/lib/rid/actions/base.rb
DELETED
data/lib/rid/actions/pull.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'rid/actions/base'
|
2
|
-
require 'rid/design_document'
|
3
|
-
|
4
|
-
require "rest_client"
|
5
|
-
|
6
|
-
module Rid
|
7
|
-
module Actions
|
8
|
-
class Pull < Base
|
9
|
-
add_runtime_options!
|
10
|
-
|
11
|
-
def pull
|
12
|
-
doc = DesignDocument.new
|
13
|
-
say "Pulling %s" % doc.url
|
14
|
-
|
15
|
-
resp = RestClient.get doc.url(:attachments => true)
|
16
|
-
doc.json = resp.body
|
17
|
-
|
18
|
-
doc.write do |filename, content|
|
19
|
-
create_file filename, content
|
20
|
-
end
|
21
|
-
|
22
|
-
say "Checked out %s" % doc.rev
|
23
|
-
rescue RestClient::ResourceNotFound
|
24
|
-
say "Error: Document %s does not exist!" % doc.id
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
data/lib/rid/actions/push.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
require 'rid/actions/base'
|
2
|
-
require 'rid/design_document'
|
3
|
-
|
4
|
-
require 'pathname'
|
5
|
-
require "rest_client"
|
6
|
-
|
7
|
-
module Rid
|
8
|
-
module Actions
|
9
|
-
class Push < Base
|
10
|
-
def initialize(*args)
|
11
|
-
super
|
12
|
-
@doc = DesignDocument.new
|
13
|
-
end
|
14
|
-
|
15
|
-
def create_database_unless_exists
|
16
|
-
RestClient.put @doc.database, nil
|
17
|
-
say "Created database %s" % @doc.database
|
18
|
-
rescue RestClient::PreconditionFailed
|
19
|
-
end
|
20
|
-
|
21
|
-
def push
|
22
|
-
root = Pathname.new(destination_root)
|
23
|
-
filenames = Dir[root.join "**/*"]
|
24
|
-
filenames.map! { |file| Pathname.new file }
|
25
|
-
filenames.map! { |path| path.relative_path_from root }
|
26
|
-
filenames.delete_if { |path| !path.file? }
|
27
|
-
filenames.map!(&:to_s)
|
28
|
-
@doc.read(filenames) do |filename|
|
29
|
-
File.read File.join(destination_root, filename)
|
30
|
-
end
|
31
|
-
|
32
|
-
say "Pushing to %s" % @doc.url
|
33
|
-
|
34
|
-
resp = RestClient.put @doc.url, @doc.json
|
35
|
-
response = JSON.parse(resp.body)
|
36
|
-
|
37
|
-
if response["ok"]
|
38
|
-
@doc.rev = response["rev"]
|
39
|
-
File.open File.join(destination_root, "_rev"), "w" do |file|
|
40
|
-
file << @doc.rev
|
41
|
-
end
|
42
|
-
|
43
|
-
say "Pushed %s" % @doc.rev
|
44
|
-
else
|
45
|
-
say "Error occured: %s" % response.inspect
|
46
|
-
end
|
47
|
-
|
48
|
-
rescue RestClient::Conflict
|
49
|
-
say "Conflict! Try to pull first or delete ./_rev."
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
data/lib/rid/actions/routes.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'rid/actions/base'
|
2
|
-
|
3
|
-
module Rid
|
4
|
-
module Actions
|
5
|
-
class Routes < Base
|
6
|
-
def routes
|
7
|
-
static_files = Dir.glob(File.join(destination_root, "_attachments/*.html"))
|
8
|
-
longest_name = (%w[show list] + static_files.map { |f| File.basename(f, '.html') }).map(&:length).sort.last + 1
|
9
|
-
|
10
|
-
unless static_files.empty?
|
11
|
-
say 'Static'
|
12
|
-
static_files.each do |file|
|
13
|
-
say ' %s %s' % [(File.basename(file, '.html') + ":").ljust(longest_name), attachment_url(file)]
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
Dir.glob(File.join(destination_root, "views/*")).each do |model|
|
18
|
-
model_name = File.basename(model).singularize
|
19
|
-
say model_name.humanize
|
20
|
-
Dir.glob(File.join(destination_root, "shows/#{model_name}*")).each do |show|
|
21
|
-
say ' %s %s' % ["show:".ljust(longest_name), show_url(show, '/:id')]
|
22
|
-
end
|
23
|
-
Dir.glob(File.join(destination_root, "views/#{model_name}*")).each do |view|
|
24
|
-
say ' %s %s' % ["list:".ljust(longest_name), list_url(view, model)]
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
protected
|
30
|
-
|
31
|
-
def attachment_url(file)
|
32
|
-
File.join(Rid.database, '_design', File.basename(Rid.database), File.basename(file))
|
33
|
-
end
|
34
|
-
|
35
|
-
def list_url(view, list)
|
36
|
-
File.join(Rid.database, '_design', File.basename(Rid.database), '_list', File.basename(view), File.basename(list, '.js'))
|
37
|
-
end
|
38
|
-
|
39
|
-
def show_url(show, id = '/')
|
40
|
-
File.join(Rid.database, '_design', File.basename(Rid.database), '_show', File.basename(show, '.js'), id)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/lib/rid/commands/destroy.rb
DELETED
data/lib/rid/commands/pull.rb
DELETED
data/lib/rid/commands/push.rb
DELETED
data/lib/rid/commands/routes.rb
DELETED
data/lib/rid/design_document.rb
DELETED
@@ -1,149 +0,0 @@
|
|
1
|
-
require 'rid/core_ext/hash'
|
2
|
-
require 'rid/attachments'
|
3
|
-
require 'rid/makros'
|
4
|
-
|
5
|
-
require 'uri'
|
6
|
-
|
7
|
-
module Rid
|
8
|
-
class DesignDocument
|
9
|
-
# Files that should have a .js extension
|
10
|
-
JAVASCRIPT_FILES = %w[
|
11
|
-
validate_doc_update
|
12
|
-
lists/*
|
13
|
-
shows/*
|
14
|
-
updates/*
|
15
|
-
views/*/*
|
16
|
-
]
|
17
|
-
|
18
|
-
# Files that should not be included in document
|
19
|
-
EXCLUDE_FILES = %w[
|
20
|
-
README
|
21
|
-
]
|
22
|
-
|
23
|
-
include Attachments
|
24
|
-
include Makros
|
25
|
-
|
26
|
-
attr_accessor :hash
|
27
|
-
|
28
|
-
def initialize
|
29
|
-
@hash = {}
|
30
|
-
end
|
31
|
-
|
32
|
-
# Read document from a filesystem.
|
33
|
-
#
|
34
|
-
# Takes a filename,
|
35
|
-
# many filenames,
|
36
|
-
# or an array of filenames
|
37
|
-
# and assign the return value of a yielded block to the hash.
|
38
|
-
#
|
39
|
-
# Nested hashes
|
40
|
-
# like { "hash" => { "key" => "value" } }
|
41
|
-
# can be constructed if the filename contains a slash (/),
|
42
|
-
# eg "hash/key".
|
43
|
-
#
|
44
|
-
def read(*filenames, &block)
|
45
|
-
filenames.flatten.uniq.each do |filename|
|
46
|
-
# skip exclude files
|
47
|
-
next if EXCLUDE_FILES.include?(filename)
|
48
|
-
|
49
|
-
key = filename.dup
|
50
|
-
# strip extname from javascript files
|
51
|
-
key.sub!(/\.js$/, '') if filename =~ /#{JAVASCRIPT_FILES.join('|')}/
|
52
|
-
|
53
|
-
hash.update_at key, block.call(filename)
|
54
|
-
end
|
55
|
-
|
56
|
-
map_attachments!
|
57
|
-
inject_makros!
|
58
|
-
end
|
59
|
-
|
60
|
-
# Write document to a filesystem
|
61
|
-
#
|
62
|
-
# Takes a directoy as startpoint (default is nil),
|
63
|
-
# a document hash (default is the design documents hash)
|
64
|
-
# and recursively yields all keys and values to the given block.
|
65
|
-
#
|
66
|
-
# Nested hashes
|
67
|
-
# like { "hash" => { "key" => "value" } }
|
68
|
-
# will result in the yielded filename
|
69
|
-
# "hash/key".
|
70
|
-
#
|
71
|
-
# The key "_attachments" has a special meaning:
|
72
|
-
# the value holds base64 encoded data as well as other metadata.
|
73
|
-
# This data will gets decoded and used as value for the key.
|
74
|
-
#
|
75
|
-
def write(&block)
|
76
|
-
reduce_attachments!
|
77
|
-
reject_makros!
|
78
|
-
|
79
|
-
hash.flatten.each do |key, value|
|
80
|
-
filename = key.dup
|
81
|
-
# append extname to javascript files
|
82
|
-
filename << '.js' if filename =~ /#{JAVASCRIPT_FILES.join('|')}/
|
83
|
-
|
84
|
-
block.call(filename, value)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
# Returns a JSON string representation of the documents hash
|
89
|
-
#
|
90
|
-
def json
|
91
|
-
hash.to_json
|
92
|
-
end
|
93
|
-
|
94
|
-
# Build the documents hash from a JSON string
|
95
|
-
#
|
96
|
-
def json=(json)
|
97
|
-
self.hash = JSON.parse(json)
|
98
|
-
end
|
99
|
-
|
100
|
-
|
101
|
-
# Accessor for id
|
102
|
-
def id
|
103
|
-
hash["_id"] || Rid.id
|
104
|
-
end
|
105
|
-
|
106
|
-
# Accessor for rev
|
107
|
-
def rev
|
108
|
-
hash["_rev"] || Rid.rev
|
109
|
-
end
|
110
|
-
|
111
|
-
# Updates rev in documents hash
|
112
|
-
def rev=(new_rev)
|
113
|
-
hash["_rev"] = new_rev
|
114
|
-
end
|
115
|
-
|
116
|
-
|
117
|
-
# Accessor for rid database
|
118
|
-
def database
|
119
|
-
@database ||= Rid.database
|
120
|
-
end
|
121
|
-
|
122
|
-
# Base URL for document
|
123
|
-
def base_url
|
124
|
-
@base_url ||= File.join(database, id)
|
125
|
-
end
|
126
|
-
|
127
|
-
# URL for accessing design document
|
128
|
-
#
|
129
|
-
# Takes an optional options hash
|
130
|
-
# which gets converted to url encoded options
|
131
|
-
# and appended to the documents base url
|
132
|
-
#
|
133
|
-
def url(options = {})
|
134
|
-
base_url + build_options_string(options)
|
135
|
-
end
|
136
|
-
|
137
|
-
|
138
|
-
private
|
139
|
-
|
140
|
-
def build_options_string(options)
|
141
|
-
return '' if options.empty?
|
142
|
-
options_array = []
|
143
|
-
options.each do |key, value|
|
144
|
-
options_array << URI.escape([key, value].join('='))
|
145
|
-
end
|
146
|
-
'?' + options_array.join("&")
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
Description:
|
2
|
-
The 'application' generator creates a new Rid application
|
3
|
-
with a default directory structure and configuration
|
4
|
-
at the path you specify.
|
5
|
-
|
6
|
-
Example:
|
7
|
-
rid generate application ~/rid/weblog
|
8
|
-
|
9
|
-
This generates a skeletal Rid installation in ~/rid/weblog.
|
10
|
-
See the README in the newly created application to get going.
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module Rid::Generators
|
2
|
-
class ApplicationGenerator < Base
|
3
|
-
argument :app_path, :type => :string
|
4
|
-
|
5
|
-
def create_root
|
6
|
-
self.destination_root = File.expand_path(app_path, destination_root)
|
7
|
-
|
8
|
-
empty_directory '.'
|
9
|
-
FileUtils.cd(destination_root) if File.directory?(destination_root)
|
10
|
-
end
|
11
|
-
|
12
|
-
def create_root_files
|
13
|
-
template "ridrc", ".ridrc"
|
14
|
-
copy_file "README"
|
15
|
-
copy_file "gitignore", ".gitignore" unless options[:skip_git]
|
16
|
-
template "_id"
|
17
|
-
copy_file "validate_doc_update.js"
|
18
|
-
empty_directory "lists"
|
19
|
-
empty_directory "shows"
|
20
|
-
empty_directory "updates"
|
21
|
-
empty_directory "views"
|
22
|
-
end
|
23
|
-
|
24
|
-
def create_attachments_files
|
25
|
-
empty_directory "_attachments"
|
26
|
-
inside "_attachments" do
|
27
|
-
empty_directory "images"
|
28
|
-
empty_directory "javascripts"
|
29
|
-
directory "stylesheets"
|
30
|
-
template "index.html"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def create_lib_files
|
35
|
-
empty_directory "lib"
|
36
|
-
inside "lib" do
|
37
|
-
copy_file "mustache.js"
|
38
|
-
copy_file "path.js"
|
39
|
-
empty_directory "templates"
|
40
|
-
inside "templates" do
|
41
|
-
template "layout.mustache"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
protected
|
47
|
-
|
48
|
-
def app_name
|
49
|
-
@app_name ||= File.basename(destination_root)
|
50
|
-
end
|
51
|
-
|
52
|
-
def app_title
|
53
|
-
@app_title ||= app_name.humanize
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
# Welcome to Rid!
|
@@ -1,11 +0,0 @@
|
|
1
|
-
<!DOCTYPE HTML>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
5
|
-
<title><%= app_title %></title>
|
6
|
-
<link rel="stylesheet" href="stylesheets/application.css" type="text/css" media="screen" charset="utf-8">
|
7
|
-
</head>
|
8
|
-
<body>
|
9
|
-
<h1>Welcome to <%= app_title %>!</h1>
|
10
|
-
</body>
|
11
|
-
</html>
|
@@ -1,25 +0,0 @@
|
|
1
|
-
body {
|
2
|
-
background-color: #fff;
|
3
|
-
color: #333;
|
4
|
-
margin: 1cm 1.618cm;
|
5
|
-
}
|
6
|
-
|
7
|
-
body, p, ol, ul, td {
|
8
|
-
font-family: verdana, arial, helvetica, sans-serif;
|
9
|
-
font-size: 13px;
|
10
|
-
line-height: 18px;
|
11
|
-
}
|
12
|
-
|
13
|
-
pre {
|
14
|
-
background-color: #eee;
|
15
|
-
padding: 10px;
|
16
|
-
font-size: 11px;
|
17
|
-
}
|
18
|
-
|
19
|
-
a { color: #000; }
|
20
|
-
a:visited { color: #666; }
|
21
|
-
a:hover { color: #fff; background-color:#000; }
|
22
|
-
|
23
|
-
.notice {
|
24
|
-
color: green;
|
25
|
-
}
|
@@ -1 +0,0 @@
|
|
1
|
-
_design/<%= app_name %>
|
File without changes
|