olson 0.0.2 → 0.0.3
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/Gemfile +8 -0
- data/Gemfile.lock +115 -0
- data/Guardfile +11 -0
- data/README.md +2 -0
- data/Rakefile +4 -0
- data/lib/olson.rb +1 -1
- data/lib/olson/class_methods.rb +24 -4
- data/lib/olson/instance_methods.rb +2 -2
- data/lib/olson/version.rb +1 -1
- data/spec/draper_initializer.rb +3 -0
- data/spec/fixtures/human.rb +19 -0
- data/spec/fixtures/user.rb +24 -0
- data/spec/olson_spec.rb +53 -0
- data/spec/spec_helper.rb +32 -0
- metadata +70 -5
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
GIT
|
2
|
+
remote: https://github.com/guard/guard.git
|
3
|
+
revision: 1e853b2f8c9b092e79addc0a652e4d1a34eda224
|
4
|
+
specs:
|
5
|
+
guard (1.7.0)
|
6
|
+
formatador (>= 0.2.4)
|
7
|
+
listen (>= 0.6.0)
|
8
|
+
lumberjack (>= 1.0.2)
|
9
|
+
pry (>= 0.9.10)
|
10
|
+
thor (>= 0.14.6)
|
11
|
+
|
12
|
+
PATH
|
13
|
+
remote: .
|
14
|
+
specs:
|
15
|
+
olson (0.0.3)
|
16
|
+
activesupport
|
17
|
+
|
18
|
+
GEM
|
19
|
+
remote: https://rubygems.org/
|
20
|
+
specs:
|
21
|
+
actionpack (3.2.13)
|
22
|
+
activemodel (= 3.2.13)
|
23
|
+
activesupport (= 3.2.13)
|
24
|
+
builder (~> 3.0.0)
|
25
|
+
erubis (~> 2.7.0)
|
26
|
+
journey (~> 1.0.4)
|
27
|
+
rack (~> 1.4.5)
|
28
|
+
rack-cache (~> 1.2)
|
29
|
+
rack-test (~> 0.6.1)
|
30
|
+
sprockets (~> 2.2.1)
|
31
|
+
activemodel (3.2.13)
|
32
|
+
activesupport (= 3.2.13)
|
33
|
+
builder (~> 3.0.0)
|
34
|
+
activesupport (3.2.13)
|
35
|
+
i18n (= 0.6.1)
|
36
|
+
multi_json (~> 1.0)
|
37
|
+
builder (3.0.4)
|
38
|
+
coderay (1.0.9)
|
39
|
+
colorize (0.5.8)
|
40
|
+
coveralls (0.6.3)
|
41
|
+
colorize
|
42
|
+
multi_json (~> 1.3)
|
43
|
+
rest-client
|
44
|
+
simplecov (>= 0.7)
|
45
|
+
thor
|
46
|
+
diff-lcs (1.2.1)
|
47
|
+
draper (1.1.0)
|
48
|
+
actionpack (>= 3.0)
|
49
|
+
activesupport (>= 3.0)
|
50
|
+
request_store (~> 1.0.3)
|
51
|
+
erubis (2.7.0)
|
52
|
+
formatador (0.2.4)
|
53
|
+
guard-rspec (2.5.1)
|
54
|
+
guard (>= 1.1)
|
55
|
+
rspec (~> 2.11)
|
56
|
+
guard-shell (0.5.1)
|
57
|
+
guard (>= 1.1.0)
|
58
|
+
hike (1.2.1)
|
59
|
+
i18n (0.6.1)
|
60
|
+
journey (1.0.4)
|
61
|
+
listen (0.7.3)
|
62
|
+
lumberjack (1.0.3)
|
63
|
+
method_source (0.8.1)
|
64
|
+
mime-types (1.21)
|
65
|
+
multi_json (1.7.2)
|
66
|
+
pry (0.9.12)
|
67
|
+
coderay (~> 1.0.5)
|
68
|
+
method_source (~> 0.8)
|
69
|
+
slop (~> 3.4)
|
70
|
+
rack (1.4.5)
|
71
|
+
rack-cache (1.2)
|
72
|
+
rack (>= 0.4)
|
73
|
+
rack-test (0.6.2)
|
74
|
+
rack (>= 1.0)
|
75
|
+
rake (10.0.4)
|
76
|
+
rb-fsevent (0.9.3)
|
77
|
+
request_store (1.0.5)
|
78
|
+
rest-client (1.6.7)
|
79
|
+
mime-types (>= 1.16)
|
80
|
+
rspec (2.13.0)
|
81
|
+
rspec-core (~> 2.13.0)
|
82
|
+
rspec-expectations (~> 2.13.0)
|
83
|
+
rspec-mocks (~> 2.13.0)
|
84
|
+
rspec-core (2.13.1)
|
85
|
+
rspec-expectations (2.13.0)
|
86
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
87
|
+
rspec-mocks (2.13.0)
|
88
|
+
simplecov (0.7.1)
|
89
|
+
multi_json (~> 1.0)
|
90
|
+
simplecov-html (~> 0.7.1)
|
91
|
+
simplecov-html (0.7.1)
|
92
|
+
slop (3.4.4)
|
93
|
+
sprockets (2.2.2)
|
94
|
+
hike (~> 1.2)
|
95
|
+
multi_json (~> 1.0)
|
96
|
+
rack (~> 1.0)
|
97
|
+
tilt (~> 1.1, != 1.3.0)
|
98
|
+
thor (0.18.0)
|
99
|
+
tilt (1.3.6)
|
100
|
+
|
101
|
+
PLATFORMS
|
102
|
+
ruby
|
103
|
+
|
104
|
+
DEPENDENCIES
|
105
|
+
activemodel
|
106
|
+
coveralls
|
107
|
+
draper
|
108
|
+
guard!
|
109
|
+
guard-rspec
|
110
|
+
guard-shell
|
111
|
+
olson!
|
112
|
+
pry
|
113
|
+
rake
|
114
|
+
rb-fsevent
|
115
|
+
rspec
|
data/Guardfile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec', cli: '--format doc --color', keep_failed: false, all_after_pass: false do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/olson_spec.rb" }
|
8
|
+
watch('spec/spec_helper.rb') { "spec" }
|
9
|
+
watch(%r{^spec/fixtures/.*\.rb$}) { "spec" }
|
10
|
+
end
|
11
|
+
|
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
*Apparently it's a reference to Mad Men and Draper...*
|
4
4
|
|
5
|
+
[](http://badge.fury.io/rb/olson)
|
6
|
+
[](https://coveralls.io/r/carnesmedia/olson)
|
5
7
|
[](https://codeclimate.com/github/carnesmedia/olson)
|
6
8
|
|
7
9
|
Olson is a tool to help display identifiers to users. It’s basically a way to turn your decorator in to a wrapper for `.humanize` with automatic built-in support for I18n.
|
data/Rakefile
CHANGED
data/lib/olson.rb
CHANGED
data/lib/olson/class_methods.rb
CHANGED
@@ -30,13 +30,16 @@ module ClassMethods
|
|
30
30
|
attr_options = :"#{ attr }_options"
|
31
31
|
define_singleton_method attr_options do # def status_options
|
32
32
|
options_for_select_with_i18n attr, # options_for_select_with_i18n 'status',
|
33
|
-
|
33
|
+
source_class.send(attr_options) # User.status_options
|
34
34
|
end # end
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
# Humanize an attribute using I18n, falling back to the humanized attributes value.
|
39
39
|
#
|
40
|
+
# The `.default_humanize` method can be overridden to configure how values are humanized
|
41
|
+
# when they are not found in I18n.
|
42
|
+
#
|
40
43
|
# I tend to store attributes like `status` or `role` as underscored strings (a string that
|
41
44
|
# would be suitable for a method/variable name) sometimes a simple .humanize will do the
|
42
45
|
# trick when it comes to displaying that value in the UI user but other times you need to
|
@@ -73,11 +76,28 @@ module ClassMethods
|
|
73
76
|
# @user.decorator.plan_status # => 'Current'
|
74
77
|
#
|
75
78
|
# @user.activation_status = 'inactive'
|
76
|
-
# @user.decorator.activation_status
|
77
|
-
def humanize(attribute,
|
78
|
-
i18n_with_scoped_defaults
|
79
|
+
# @user.decorator.activation_status # => 'Inactive'
|
80
|
+
def humanize(attribute, value, default = default_humanize(value))
|
81
|
+
i18n_with_scoped_defaults value, [model_name.i18n_key, attribute], default if value.present?
|
79
82
|
end
|
80
83
|
|
84
|
+
# The default way to humanize a value when not found in I18n.
|
85
|
+
#
|
86
|
+
# To configure the default humanization, you can override `.default_humanize` in your
|
87
|
+
# decorator. For example, to use `String#titleize` instead of `String#humanize`:
|
88
|
+
#
|
89
|
+
# # user_decorator.rb
|
90
|
+
# class UserDecorator < ApplicationDecorator
|
91
|
+
# decorates :user
|
92
|
+
#
|
93
|
+
# def self.default_humanize(value)
|
94
|
+
# value.to_s.titleize
|
95
|
+
# end
|
96
|
+
# end
|
97
|
+
#
|
98
|
+
def default_humanize(value)
|
99
|
+
value.to_s.humanize
|
100
|
+
end
|
81
101
|
|
82
102
|
# Try to translate a key with I18n and a scope but fallback to less-and-less scope.
|
83
103
|
# An example will explain more clearly:
|
@@ -2,7 +2,7 @@ module Olson
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
# See +ApplicationDecorator.humanize+
|
5
|
-
def humanize(attribute,
|
6
|
-
self.class.humanize attribute,
|
5
|
+
def humanize(attribute, value = model.send(attribute), default = self.class.default_humanize(value))
|
6
|
+
self.class.humanize attribute, value, default
|
7
7
|
end
|
8
8
|
end
|
data/lib/olson/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Human and HumanDecorator is an example without ActiveModel or Draper
|
2
|
+
|
3
|
+
|
4
|
+
class Human
|
5
|
+
attr_accessor :status
|
6
|
+
def self.model_name
|
7
|
+
OpenStruct.new(i18n_key: "human")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class HumanDecorator < SimpleDelegator
|
12
|
+
include Olson
|
13
|
+
humanizes :status
|
14
|
+
|
15
|
+
alias_method :model, :__getobj__
|
16
|
+
def self.model_name
|
17
|
+
Human.model_name
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# User and UserDecorator is an example with ActiveModel and Draper
|
2
|
+
|
3
|
+
class User
|
4
|
+
extend ActiveModel::Naming
|
5
|
+
attr_accessor :status
|
6
|
+
|
7
|
+
def self.status_options
|
8
|
+
%w[ approved rejected ]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class UserDecorator < Draper::Decorator
|
13
|
+
decorates :user
|
14
|
+
humanizes :status
|
15
|
+
end
|
16
|
+
|
17
|
+
class CustomUserDecorator < Draper::Decorator
|
18
|
+
decorates :user
|
19
|
+
humanizes :status
|
20
|
+
|
21
|
+
def self.default_humanize(value)
|
22
|
+
value.to_s.upcase
|
23
|
+
end
|
24
|
+
end
|
data/spec/olson_spec.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Olson do
|
4
|
+
context "when using Draper and ActiveModel" do
|
5
|
+
let(:object) { User.new }
|
6
|
+
let(:decorated) { UserDecorator.decorate(object) }
|
7
|
+
|
8
|
+
before { object.status = 'submitted' }
|
9
|
+
|
10
|
+
it "humanizes a field" do
|
11
|
+
decorated.status.should == "Submitted"
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'humanizes with I18n when specified' do
|
15
|
+
object.status = 'rejected'
|
16
|
+
decorated.status.should == 'OMG Fail'
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'humanizes options for select' do
|
20
|
+
UserDecorator.status_options.should == [
|
21
|
+
["Approved", "approved"],
|
22
|
+
["OMG Fail", "rejected"],
|
23
|
+
]
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'overriding the default behaviour' do
|
27
|
+
let(:decorated) { CustomUserDecorator.decorate(object) }
|
28
|
+
|
29
|
+
it "humanizes a field" do
|
30
|
+
decorated.status.should == "SUBMITTED"
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'humanizes options for select' do
|
34
|
+
CustomUserDecorator.status_options.should == [
|
35
|
+
["APPROVED", "approved"],
|
36
|
+
["OMG Fail", "rejected"],
|
37
|
+
]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'without draper' do
|
44
|
+
let(:object) { Human.new }
|
45
|
+
let(:decorated) { HumanDecorator.new(object) }
|
46
|
+
|
47
|
+
it 'humanizes a field' do
|
48
|
+
object.status = 'submitted'
|
49
|
+
decorated.status.should == 'Submitted'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
require 'simplecov'
|
3
|
+
require 'coveralls'
|
4
|
+
|
5
|
+
Coveralls.wear!
|
6
|
+
|
7
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
8
|
+
SimpleCov::Formatter::HTMLFormatter,
|
9
|
+
Coveralls::SimpleCov::Formatter,
|
10
|
+
]
|
11
|
+
|
12
|
+
SimpleCov.start
|
13
|
+
|
14
|
+
require 'rubygems'
|
15
|
+
require 'bundler/setup'
|
16
|
+
|
17
|
+
require 'olson'
|
18
|
+
require 'ostruct'
|
19
|
+
require 'active_model'
|
20
|
+
require 'draper'
|
21
|
+
require 'draper_initializer'
|
22
|
+
|
23
|
+
spec_dir = Pathname.new(__FILE__).dirname
|
24
|
+
|
25
|
+
Dir[spec_dir.join("fixtures/**/*.rb")].each { |f| require f }
|
26
|
+
Dir[spec_dir.join("support/**/*.rb")].each { |f| require f }
|
27
|
+
|
28
|
+
I18n.config.load_path << spec_dir.join('fixtures/en.yml')
|
29
|
+
|
30
|
+
RSpec.configure do |config|
|
31
|
+
# some (optional) config here
|
32
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: olson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-08-07 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -28,6 +28,38 @@ dependencies:
|
|
28
28
|
- - ! '>='
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: coveralls
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: activemodel
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
31
63
|
- !ruby/object:Gem::Dependency
|
32
64
|
name: rspec
|
33
65
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,6 +76,22 @@ dependencies:
|
|
44
76
|
- - ! '>='
|
45
77
|
- !ruby/object:Gem::Version
|
46
78
|
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: draper
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
47
95
|
description: Object-oriented humanize
|
48
96
|
email:
|
49
97
|
- kristian@kristianfreeman.com
|
@@ -57,9 +105,16 @@ files:
|
|
57
105
|
- lib/olson/version.rb
|
58
106
|
- lib/olson.rb
|
59
107
|
- Gemfile
|
108
|
+
- Gemfile.lock
|
109
|
+
- Guardfile
|
60
110
|
- LICENSE.txt
|
61
111
|
- Rakefile
|
62
112
|
- README.md
|
113
|
+
- spec/draper_initializer.rb
|
114
|
+
- spec/fixtures/human.rb
|
115
|
+
- spec/fixtures/user.rb
|
116
|
+
- spec/olson_spec.rb
|
117
|
+
- spec/spec_helper.rb
|
63
118
|
homepage: http://github.com/carnesmedia/olson
|
64
119
|
licenses: []
|
65
120
|
post_install_message:
|
@@ -72,20 +127,30 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
72
127
|
- - ! '>='
|
73
128
|
- !ruby/object:Gem::Version
|
74
129
|
version: '0'
|
130
|
+
segments:
|
131
|
+
- 0
|
132
|
+
hash: 2017626489828929657
|
75
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
134
|
none: false
|
77
135
|
requirements:
|
78
136
|
- - ! '>='
|
79
137
|
- !ruby/object:Gem::Version
|
80
138
|
version: '0'
|
139
|
+
segments:
|
140
|
+
- 0
|
141
|
+
hash: 2017626489828929657
|
81
142
|
requirements: []
|
82
143
|
rubyforge_project:
|
83
|
-
rubygems_version: 1.8.
|
144
|
+
rubygems_version: 1.8.25
|
84
145
|
signing_key:
|
85
146
|
specification_version: 3
|
86
147
|
summary: Olson is a tool to help display identifiers to users. It’s basically a way
|
87
148
|
to turn your decorator in to a wrapper for `.humanize` with automatic built-in support
|
88
149
|
for I18n. See [Using I18n and Draper to Render Database Attributes](http://blog.amielmartin.com/post/12341219947/using-i18n-and-draper-to-render-database-attributes)
|
89
150
|
to read more about this concept.
|
90
|
-
test_files:
|
91
|
-
|
151
|
+
test_files:
|
152
|
+
- spec/draper_initializer.rb
|
153
|
+
- spec/fixtures/human.rb
|
154
|
+
- spec/fixtures/user.rb
|
155
|
+
- spec/olson_spec.rb
|
156
|
+
- spec/spec_helper.rb
|