activerecord-userstamp 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/.rspec +2 -0
- data/.travis.yml +16 -0
- data/CHANGELOG +26 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +220 -0
- data/Rakefile +17 -0
- data/activerecord-userstamp.gemspec +34 -0
- data/lib/active_record/userstamp.rb +14 -0
- data/lib/active_record/userstamp/controller_additions.rb +41 -0
- data/lib/active_record/userstamp/migration_additions.rb +16 -0
- data/lib/active_record/userstamp/model_additions.rb +3 -0
- data/lib/active_record/userstamp/stampable.rb +174 -0
- data/lib/active_record/userstamp/stamper.rb +39 -0
- data/lib/active_record/userstamp/version.rb +4 -0
- data/lib/activerecord/userstamp.rb +1 -0
- data/spec/controllers/posts_controller_spec.rb +46 -0
- data/spec/controllers/users_controller_spec.rb +41 -0
- data/spec/coverage_helper.rb +65 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +13 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/controllers/posts_controller.rb +32 -0
- data/spec/dummy/app/controllers/users_controller.rb +18 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/comment.rb +6 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/models/foo.rb +3 -0
- data/spec/dummy/app/models/person.rb +4 -0
- data/spec/dummy/app/models/post.rb +13 -0
- data/spec/dummy/app/models/user.rb +4 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +30 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/schema.rb +55 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/lib/compatibility_stamping_spec.rb +69 -0
- data/spec/lib/migration_spec.rb +26 -0
- data/spec/lib/stamping_spec.rb +170 -0
- data/spec/lib/userstamp_spec.rb +7 -0
- data/spec/rails_helper.rb +7 -0
- data/spec/spec_helper.rb +97 -0
- data/spec/support/database_helpers.rb +22 -0
- data/spec/support/with_temporary_table.rb +50 -0
- metadata +276 -0
@@ -0,0 +1,174 @@
|
|
1
|
+
module ActiveRecord::Userstamp
|
2
|
+
# Determines what default columns to use for recording the current stamper.
|
3
|
+
# By default this is set to false, so the plug-in will use columns named
|
4
|
+
# <tt>creator_id</tt>, <tt>updater_id</tt>, and <tt>deleter_id</tt>.
|
5
|
+
#
|
6
|
+
# To turn compatibility mode on, place the following line in your environment.rb
|
7
|
+
# file:
|
8
|
+
#
|
9
|
+
# Ddb::Userstamp.compatibility_mode = true
|
10
|
+
#
|
11
|
+
# This will cause the plug-in to use columns named <tt>created_by</tt>,
|
12
|
+
# <tt>updated_by</tt>, and <tt>deleted_by</tt>.
|
13
|
+
mattr_accessor :compatibility_mode
|
14
|
+
@@compatibility_mode = false
|
15
|
+
|
16
|
+
# Extends the stamping functionality of ActiveRecord by automatically recording the model
|
17
|
+
# responsible for creating, updating, and deleting the current object. See the Stamper
|
18
|
+
# and Userstamp modules for further documentation on how the entire process works.
|
19
|
+
module Stampable
|
20
|
+
def self.included(base) #:nodoc:
|
21
|
+
super
|
22
|
+
|
23
|
+
base.extend(ClassMethods)
|
24
|
+
base.class_eval do
|
25
|
+
include InstanceMethods
|
26
|
+
|
27
|
+
# Should ActiveRecord record userstamps? Defaults to true.
|
28
|
+
class_attribute :record_userstamp
|
29
|
+
self.record_userstamp = true
|
30
|
+
|
31
|
+
# Which class is responsible for stamping? Defaults to :user.
|
32
|
+
class_attribute :stamper_class_name
|
33
|
+
|
34
|
+
# What column should be used for the creator stamp?
|
35
|
+
# Defaults to :creator_id when compatibility mode is off
|
36
|
+
# Defaults to :created_by when compatibility mode is on
|
37
|
+
class_attribute :creator_attribute
|
38
|
+
|
39
|
+
# What column should be used for the updater stamp?
|
40
|
+
# Defaults to :updater_id when compatibility mode is off
|
41
|
+
# Defaults to :updated_by when compatibility mode is on
|
42
|
+
class_attribute :updater_attribute
|
43
|
+
|
44
|
+
# What column should be used for the deleter stamp?
|
45
|
+
# Defaults to :deleter_id when compatibility mode is off
|
46
|
+
# Defaults to :deleted_by when compatibility mode is on
|
47
|
+
class_attribute :deleter_attribute
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
module ClassMethods
|
52
|
+
# This method is automatically called on for all classes that inherit from
|
53
|
+
# ActiveRecord, but if you need to customize how the plug-in functions, this is the
|
54
|
+
# method to use. Here's an example:
|
55
|
+
#
|
56
|
+
# class Post < ActiveRecord::Base
|
57
|
+
# stampable :stamper_class_name => :person,
|
58
|
+
# :creator_attribute => :create_user,
|
59
|
+
# :updater_attribute => :update_user,
|
60
|
+
# :deleter_attribute => :delete_user,
|
61
|
+
# :deleter => true,
|
62
|
+
# :with_deleted => true
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# The method will automatically setup all the associations,
|
66
|
+
# and create <tt>before_validation</tt> & <tt>before_destroy</tt> callbacks for doing the stamping.
|
67
|
+
#
|
68
|
+
# By default, the deleter association and before filter are not defined unless
|
69
|
+
# you set the :deleter_attribute or set the :deleter option to true.
|
70
|
+
#
|
71
|
+
# When using the new acts_as_paranoid gem (https://github.com/goncalossilva/rails3_acts_as_paranoid)
|
72
|
+
# the :with_deleted option can be used to setup the associations to return objects that have been soft deleted.
|
73
|
+
#
|
74
|
+
def stampable(options = {})
|
75
|
+
compatability = ActiveRecord::Userstamp.compatibility_mode
|
76
|
+
defaults = {
|
77
|
+
:stamper_class_name => :user,
|
78
|
+
:creator_attribute => (compatability ? :created_by : :creator_id),
|
79
|
+
:updater_attribute => (compatability ? :updated_by : :updater_id),
|
80
|
+
:deleter_attribute => (compatability ? :deleted_by : :deleter_id),
|
81
|
+
:deleter => options.has_key?(:deleter_attribute),
|
82
|
+
:with_deleted => false
|
83
|
+
}.merge(options)
|
84
|
+
|
85
|
+
self.stamper_class_name = defaults[:stamper_class_name].to_sym
|
86
|
+
self.creator_attribute = defaults[:creator_attribute].to_sym
|
87
|
+
self.updater_attribute = defaults[:updater_attribute].to_sym
|
88
|
+
self.deleter_attribute = defaults[:deleter_attribute].to_sym
|
89
|
+
|
90
|
+
class_eval do
|
91
|
+
klass = "::#{stamper_class_name.to_s.singularize.camelize}"
|
92
|
+
|
93
|
+
if defaults[:with_deleted]
|
94
|
+
belongs_to :creator, :class_name => klass, :foreign_key => creator_attribute, :with_deleted => true
|
95
|
+
belongs_to :updater, :class_name => klass, :foreign_key => updater_attribute, :with_deleted => true
|
96
|
+
else
|
97
|
+
belongs_to :creator, :class_name => klass, :foreign_key => creator_attribute
|
98
|
+
belongs_to :updater, :class_name => klass, :foreign_key => updater_attribute
|
99
|
+
end
|
100
|
+
|
101
|
+
before_validation :set_updater_attribute
|
102
|
+
before_validation :set_creator_attribute, :on => :create
|
103
|
+
before_save :set_updater_attribute
|
104
|
+
before_save :set_creator_attribute, :on => :create
|
105
|
+
|
106
|
+
if defaults[:deleter]
|
107
|
+
if defaults[:with_deleted]
|
108
|
+
belongs_to :deleter, :class_name => klass, :foreign_key => deleter_attribute, :with_deleted => true
|
109
|
+
else
|
110
|
+
belongs_to :deleter, :class_name => klass, :foreign_key => deleter_attribute
|
111
|
+
end
|
112
|
+
|
113
|
+
before_destroy :set_deleter_attribute
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# Temporarily allows you to turn stamping off. For example:
|
120
|
+
#
|
121
|
+
# Post.without_stamps do
|
122
|
+
# post = Post.find(params[:id])
|
123
|
+
# post.update_attributes(params[:post])
|
124
|
+
# post.save
|
125
|
+
# end
|
126
|
+
def without_stamps
|
127
|
+
original_value = self.record_userstamp
|
128
|
+
self.record_userstamp = false
|
129
|
+
yield
|
130
|
+
ensure
|
131
|
+
self.record_userstamp = original_value
|
132
|
+
end
|
133
|
+
|
134
|
+
def stamper_class #:nodoc:
|
135
|
+
stamper_class_name.to_s.camelize.constantize rescue nil
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
module InstanceMethods #:nodoc:
|
140
|
+
private
|
141
|
+
def has_stamper?
|
142
|
+
!self.class.stamper_class.nil? && !self.class.stamper_class.stamper.nil? rescue false
|
143
|
+
end
|
144
|
+
|
145
|
+
def set_creator_attribute
|
146
|
+
return unless self.record_userstamp
|
147
|
+
if respond_to?(self.creator_attribute.to_sym) && has_stamper?
|
148
|
+
if self.send(self.creator_attribute.to_sym).blank?
|
149
|
+
self.send("#{self.creator_attribute}=".to_sym, self.class.stamper_class.stamper)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def set_updater_attribute
|
155
|
+
return unless self.record_userstamp
|
156
|
+
# only set updater if the record is new or has changed
|
157
|
+
# or contains a serialized attribute (in which case the attribute value is always updated)
|
158
|
+
return unless self.new_record? || self.changed? || self.class.serialized_attributes.present?
|
159
|
+
if respond_to?(self.updater_attribute.to_sym) && has_stamper?
|
160
|
+
self.send("#{self.updater_attribute}=".to_sym, self.class.stamper_class.stamper)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def set_deleter_attribute
|
165
|
+
return unless self.record_userstamp
|
166
|
+
if respond_to?(self.deleter_attribute.to_sym) && has_stamper?
|
167
|
+
self.send("#{self.deleter_attribute}=".to_sym, self.class.stamper_class.stamper)
|
168
|
+
save
|
169
|
+
end
|
170
|
+
end
|
171
|
+
#end private
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module ActiveRecord::Userstamp
|
2
|
+
module Stamper
|
3
|
+
def self.included(base) # :nodoc:
|
4
|
+
base.extend(ClassMethods)
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def model_stamper
|
9
|
+
# don't allow multiple calls
|
10
|
+
return if self.included_modules.include?(ActiveRecord::Userstamp::Stamper::InstanceMethods)
|
11
|
+
send(:extend, ActiveRecord::Userstamp::Stamper::InstanceMethods)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module InstanceMethods
|
16
|
+
# Used to set the stamper for a particular request. See the Userstamp module for more
|
17
|
+
# details on how to use this method.
|
18
|
+
def stamper=(object)
|
19
|
+
object_stamper = if object.is_a?(ActiveRecord::Base)
|
20
|
+
object.send("#{object.class.primary_key}".to_sym)
|
21
|
+
else
|
22
|
+
object
|
23
|
+
end
|
24
|
+
|
25
|
+
Thread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"] = object_stamper
|
26
|
+
end
|
27
|
+
|
28
|
+
# Retrieves the existing stamper for the current request.
|
29
|
+
def stamper
|
30
|
+
Thread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"]
|
31
|
+
end
|
32
|
+
|
33
|
+
# Sets the stamper back to +nil+ to prepare for the next request.
|
34
|
+
def reset_stamper
|
35
|
+
Thread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"] = nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'active_record/userstamp'
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe PostsController, type: :controller do
|
4
|
+
controller do
|
5
|
+
end
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
reset_to_defaults
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when updating a Post' do
|
12
|
+
it 'sets the correct updater' do
|
13
|
+
request.session = { person_id: @delynn.id }
|
14
|
+
post :update, id: @first_post.id, post: { title: 'Different' }
|
15
|
+
|
16
|
+
expect(response.status).to eq(200)
|
17
|
+
expect(controller.instance_variable_get(:@post).title).to eq('Different')
|
18
|
+
expect(controller.instance_variable_get(:@post).updater).to eq(@delynn)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when handling multiple requests' do
|
23
|
+
def simulate_second_request
|
24
|
+
old_request_session = request.session
|
25
|
+
request.session = { person_id: @nicole.id }
|
26
|
+
|
27
|
+
post :update, id: @first_post.id, post: { title: 'Different Second'}
|
28
|
+
expect(controller.instance_variable_get(:@post).updater).to eq(@nicole)
|
29
|
+
ensure
|
30
|
+
request.session = old_request_session
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'sets the correct updater' do
|
34
|
+
request.session = { person_id: @delynn.id }
|
35
|
+
get :edit, id: @first_post.id
|
36
|
+
expect(response.status).to eq(200)
|
37
|
+
|
38
|
+
simulate_second_request
|
39
|
+
|
40
|
+
post :update, id: @first_post.id, post: { title: 'Different' }
|
41
|
+
expect(response.status).to eq(200)
|
42
|
+
expect(controller.instance_variable_get(:@post).title).to eq('Different')
|
43
|
+
expect(controller.instance_variable_get(:@post).updater).to eq(@delynn)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe UsersController, type: :controller do
|
4
|
+
controller do
|
5
|
+
end
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
reset_to_defaults
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when updating a User' do
|
12
|
+
it 'sets the correct updater' do
|
13
|
+
request.session = { user_id: @hera.id }
|
14
|
+
patch :update, id: @hera.id, user: { name: 'Different'}
|
15
|
+
|
16
|
+
expect(response.status).to eq(200)
|
17
|
+
expect(controller.instance_variable_get(:@user).name).to eq('Different')
|
18
|
+
expect(controller.instance_variable_get(:@user).updater).to eq(@hera)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when handling multiple requests' do
|
23
|
+
def simulate_second_request
|
24
|
+
old_request_session = request.session
|
25
|
+
request.session = { user_id: @zeus.id }
|
26
|
+
|
27
|
+
post :update, id: @hera.id, user: { name: 'Different Second' }
|
28
|
+
expect(controller.instance_variable_get(:@user).updater).to eq(@zeus)
|
29
|
+
ensure
|
30
|
+
request.session = old_request_session
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'sets the correct updater' do
|
34
|
+
request.session = { user_id: @hera.id }
|
35
|
+
get :edit, id: @hera.id
|
36
|
+
expect(response.status).to eq(200)
|
37
|
+
|
38
|
+
simulate_second_request
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Simultaneous code coverage reporting to Coveralls and Code Climate.
|
2
|
+
# Latest version can be found at https://gist.github.com/lowjoel/6c2f2d3a08bb3786994f
|
3
|
+
require 'simplecov'
|
4
|
+
|
5
|
+
module CoverageHelper
|
6
|
+
class << self
|
7
|
+
# Helper to include Coveralls/Code Climate coverage, but not require developers to install the
|
8
|
+
# gem.
|
9
|
+
#
|
10
|
+
# @param [String] name The name of the module to require.
|
11
|
+
# @param [Proc] initializer The block to execute when the module is required successfully.
|
12
|
+
def load(name, &initializer)
|
13
|
+
old_formatter = SimpleCov.formatter
|
14
|
+
require name
|
15
|
+
initializer.call
|
16
|
+
|
17
|
+
merge_formatters(old_formatter, SimpleCov.formatter)
|
18
|
+
rescue LoadError => e
|
19
|
+
if e.path == name
|
20
|
+
puts format('Cannot find \'%s\', ignoring', name) if ENV['CI']
|
21
|
+
else
|
22
|
+
raise e
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# Merge two SimpleCov formatters into a single MultiFormatter.
|
29
|
+
#
|
30
|
+
# This method is idempotent if the old and new formatters are the same.
|
31
|
+
def merge_formatters(old_formatter, new_formatter)
|
32
|
+
return if old_formatter == new_formatter
|
33
|
+
|
34
|
+
old_formatter = [*expand_formatter(old_formatter)]
|
35
|
+
new_formatter = [*expand_formatter(new_formatter)]
|
36
|
+
formatters = old_formatter + new_formatter
|
37
|
+
|
38
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[*formatters]
|
39
|
+
end
|
40
|
+
|
41
|
+
# Extracts the formatters from a MultiFormatter so we do not nest them.
|
42
|
+
def expand_formatter(formatter)
|
43
|
+
return formatter unless formatter.is_a?(SimpleCov::Formatter::MultiFormatter)
|
44
|
+
formatter.formatters
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
if ENV['CI']
|
50
|
+
# Coveralls
|
51
|
+
CoverageHelper.load('coveralls') do
|
52
|
+
Coveralls.wear!('rails')
|
53
|
+
end
|
54
|
+
|
55
|
+
# Code Climate
|
56
|
+
CoverageHelper.load('codeclimate-test-reporter') do
|
57
|
+
CodeClimate::TestReporter.start
|
58
|
+
end
|
59
|
+
|
60
|
+
# Code coverage exclusions
|
61
|
+
SimpleCov.start do
|
62
|
+
# SimpleCov configuration
|
63
|
+
# add_filter '/lib/extensions/active_record/connection_adapters/table_definition.rb'
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
== README
|
2
|
+
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
4
|
+
application up and running.
|
5
|
+
|
6
|
+
Things you may want to cover:
|
7
|
+
|
8
|
+
* Ruby version
|
9
|
+
|
10
|
+
* System dependencies
|
11
|
+
|
12
|
+
* Configuration
|
13
|
+
|
14
|
+
* Database creation
|
15
|
+
|
16
|
+
* Database initialization
|
17
|
+
|
18
|
+
* How to run the test suite
|
19
|
+
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
21
|
+
|
22
|
+
* Deployment instructions
|
23
|
+
|
24
|
+
* ...
|
25
|
+
|
26
|
+
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
28
|
+
<tt>rake doc:app</tt>.
|
data/spec/dummy/Rakefile
ADDED
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
+
* file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|