phrase 0.3.4 → 0.3.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ext/all.rb +3 -0
- data/lib/ext/hash.rb +8 -0
- data/lib/ext/object.rb +130 -0
- data/lib/ext/try.rb +57 -0
- data/lib/phrase.rb +1 -2
- data/lib/phrase/adapters/fast_gettext.rb +6 -3
- data/lib/phrase/adapters/i18n.rb +2 -1
- data/lib/phrase/api/client.rb +2 -1
- data/lib/phrase/backend/phrase_service.rb +0 -1
- data/lib/phrase/delegate/fast_gettext.rb +2 -2
- data/lib/phrase/delegate/i18n.rb +5 -1
- data/lib/phrase/version.rb +1 -1
- data/lib/phrase/view_helpers.rb +2 -3
- data/phrase.gemspec +1 -2
- metadata +61 -28
data/lib/ext/all.rb
ADDED
data/lib/ext/hash.rb
ADDED
data/lib/ext/object.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class Object
|
4
|
+
# An object is blank if it's false, empty, or a whitespace string.
|
5
|
+
# For example, "", " ", +nil+, [], and {} are all blank.
|
6
|
+
#
|
7
|
+
# This simplifies:
|
8
|
+
#
|
9
|
+
# if address.nil? || address.empty?
|
10
|
+
#
|
11
|
+
# ...to:
|
12
|
+
#
|
13
|
+
# if address.blank?
|
14
|
+
def blank?
|
15
|
+
respond_to?(:empty?) ? empty? : !self
|
16
|
+
end
|
17
|
+
|
18
|
+
# An object is present if it's not <tt>blank?</tt>.
|
19
|
+
def present?
|
20
|
+
!blank?
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns object if it's <tt>present?</tt> otherwise returns +nil+.
|
24
|
+
# <tt>object.presence</tt> is equivalent to <tt>object.present? ? object : nil</tt>.
|
25
|
+
#
|
26
|
+
# This is handy for any representation of objects where blank is the same
|
27
|
+
# as not present at all. For example, this simplifies a common check for
|
28
|
+
# HTTP POST/query parameters:
|
29
|
+
#
|
30
|
+
# state = params[:state] if params[:state].present?
|
31
|
+
# country = params[:country] if params[:country].present?
|
32
|
+
# region = state || country || 'US'
|
33
|
+
#
|
34
|
+
# ...becomes:
|
35
|
+
#
|
36
|
+
# region = params[:state].presence || params[:country].presence || 'US'
|
37
|
+
def presence
|
38
|
+
self if present?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class NilClass
|
43
|
+
# +nil+ is blank:
|
44
|
+
#
|
45
|
+
# nil.blank? # => true
|
46
|
+
#
|
47
|
+
def blank?
|
48
|
+
true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class FalseClass
|
53
|
+
# +false+ is blank:
|
54
|
+
#
|
55
|
+
# false.blank? # => true
|
56
|
+
#
|
57
|
+
def blank?
|
58
|
+
true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class TrueClass
|
63
|
+
# +true+ is not blank:
|
64
|
+
#
|
65
|
+
# true.blank? # => false
|
66
|
+
#
|
67
|
+
def blank?
|
68
|
+
false
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class Array
|
73
|
+
# An array is blank if it's empty:
|
74
|
+
#
|
75
|
+
# [].blank? # => true
|
76
|
+
# [1,2,3].blank? # => false
|
77
|
+
#
|
78
|
+
alias_method :blank?, :empty?
|
79
|
+
end
|
80
|
+
|
81
|
+
class Hash
|
82
|
+
# A hash is blank if it's empty:
|
83
|
+
#
|
84
|
+
# {}.blank? # => true
|
85
|
+
# {:key => 'value'}.blank? # => false
|
86
|
+
#
|
87
|
+
alias_method :blank?, :empty?
|
88
|
+
end
|
89
|
+
|
90
|
+
class String
|
91
|
+
if defined?(Encoding) && "".respond_to?(:encode)
|
92
|
+
def encoding_aware?
|
93
|
+
true
|
94
|
+
end
|
95
|
+
else
|
96
|
+
def encoding_aware?
|
97
|
+
false
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# 0x3000: fullwidth whitespace
|
102
|
+
NON_WHITESPACE_REGEXP = %r![^\s#{[0x3000].pack("U")}]!
|
103
|
+
|
104
|
+
# A string is blank if it's empty or contains whitespaces only:
|
105
|
+
#
|
106
|
+
# "".blank? # => true
|
107
|
+
# " ".blank? # => true
|
108
|
+
# " ".blank? # => true
|
109
|
+
# " something here ".blank? # => false
|
110
|
+
#
|
111
|
+
def blank?
|
112
|
+
# 1.8 does not takes [:space:] properly
|
113
|
+
if encoding_aware?
|
114
|
+
self !~ /[^[:space:]]/
|
115
|
+
else
|
116
|
+
self !~ NON_WHITESPACE_REGEXP
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class Numeric #:nodoc:
|
122
|
+
# No number is blank:
|
123
|
+
#
|
124
|
+
# 1.blank? # => false
|
125
|
+
# 0.blank? # => false
|
126
|
+
#
|
127
|
+
def blank?
|
128
|
+
false
|
129
|
+
end
|
130
|
+
end
|
data/lib/ext/try.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
class Object
|
2
|
+
# Invokes the method identified by the symbol +method+, passing it any arguments
|
3
|
+
# and/or the block specified, just like the regular Ruby <tt>Object#send</tt> does.
|
4
|
+
#
|
5
|
+
# *Unlike* that method however, a +NoMethodError+ exception will *not* be raised
|
6
|
+
# and +nil+ will be returned instead, if the receiving object is a +nil+ object or NilClass.
|
7
|
+
#
|
8
|
+
# If try is called without a method to call, it will yield any given block with the object.
|
9
|
+
#
|
10
|
+
# Please also note that +try+ is defined on +Object+, therefore it won't work with
|
11
|
+
# subclasses of +BasicObject+. For example, using try with +SimpleDelegator+ will
|
12
|
+
# delegate +try+ to target instead of calling it on delegator itself.
|
13
|
+
#
|
14
|
+
# ==== Examples
|
15
|
+
#
|
16
|
+
# Without +try+
|
17
|
+
# @person && @person.name
|
18
|
+
# or
|
19
|
+
# @person ? @person.name : nil
|
20
|
+
#
|
21
|
+
# With +try+
|
22
|
+
# @person.try(:name)
|
23
|
+
#
|
24
|
+
# +try+ also accepts arguments and/or a block, for the method it is trying
|
25
|
+
# Person.try(:find, 1)
|
26
|
+
# @people.try(:collect) {|p| p.name}
|
27
|
+
#
|
28
|
+
# Without a method argument try will yield to the block unless the receiver is nil.
|
29
|
+
# @person.try { |p| "#{p.first_name} #{p.last_name}" }
|
30
|
+
#--
|
31
|
+
# +try+ behaves like +Object#send+, unless called on +NilClass+.
|
32
|
+
def try(*a, &b)
|
33
|
+
if a.empty? && block_given?
|
34
|
+
yield self
|
35
|
+
else
|
36
|
+
__send__(*a, &b)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class NilClass
|
42
|
+
# Calling +try+ on +nil+ always returns +nil+.
|
43
|
+
# It becomes specially helpful when navigating through associations that may return +nil+.
|
44
|
+
#
|
45
|
+
# === Examples
|
46
|
+
#
|
47
|
+
# nil.try(:name) # => nil
|
48
|
+
#
|
49
|
+
# Without +try+
|
50
|
+
# @person && !@person.children.blank? && @person.children.first.name
|
51
|
+
#
|
52
|
+
# With +try+
|
53
|
+
# @person.try(:children).try(:first).try(:name)
|
54
|
+
def try(*args)
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
data/lib/phrase.rb
CHANGED
@@ -7,16 +7,19 @@ module FastGettext
|
|
7
7
|
def __with_phrase(*args)
|
8
8
|
Phrase::Delegate::FastGettext.new(:_, *args)
|
9
9
|
end
|
10
|
-
|
10
|
+
alias_method :__without_phrase, :_
|
11
|
+
alias_method :_, :__with_phrase
|
11
12
|
|
12
13
|
def n__with_phrase(*args)
|
13
14
|
Phrase::Delegate::FastGettext.new(:n_, *args)
|
14
15
|
end
|
15
|
-
|
16
|
+
alias_method :n__without_phrase, :n_
|
17
|
+
alias_method :n_, :n__with_phrase
|
16
18
|
|
17
19
|
def s__with_phrase(*args)
|
18
20
|
Phrase::Delegate::FastGettext.new(:s_, *args)
|
19
21
|
end
|
20
|
-
|
22
|
+
alias_method :s__without_phrase, :s_
|
23
|
+
alias_method :s_, :s__with_phrase
|
21
24
|
end
|
22
25
|
end if defined? FastGettext::Translation
|
data/lib/phrase/adapters/i18n.rb
CHANGED
@@ -5,7 +5,8 @@ module I18n
|
|
5
5
|
def translate_with_phrase(*args)
|
6
6
|
Phrase.backend.translate(*args)
|
7
7
|
end
|
8
|
-
|
8
|
+
alias_method :translate_without_phrase, :translate
|
9
|
+
alias_method :translate, :translate_with_phrase
|
9
10
|
alias_method :t, :translate
|
10
11
|
end
|
11
12
|
end if defined?(I18n)
|
data/lib/phrase/api/client.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
3
|
require 'cgi'
|
4
|
+
require 'json'
|
4
5
|
require 'net/http'
|
5
6
|
require 'net/https'
|
6
7
|
require 'phrase'
|
@@ -191,7 +192,7 @@ private
|
|
191
192
|
client = Net::HTTP.new(Phrase::Api::Config.api_host, Phrase::Api::Config.api_port)
|
192
193
|
client.use_ssl = true if Phrase::Api::Config.api_use_ssl?
|
193
194
|
client.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
194
|
-
client.ca_file = File.join(File.dirname(__FILE__), "..", "..", "cacert.pem")
|
195
|
+
client.ca_file = File.join(File.dirname(__FILE__), "..", "..", "..", "cacert.pem")
|
195
196
|
client
|
196
197
|
end
|
197
198
|
|
@@ -15,7 +15,7 @@ private
|
|
15
15
|
when :_
|
16
16
|
{msgid: args.first}
|
17
17
|
when :n_
|
18
|
-
{msgid: args.first, msgid_plural: args
|
18
|
+
{msgid: args.first, msgid_plural: args[1], count: args.last}
|
19
19
|
when :s_
|
20
20
|
{msgid: args.first}
|
21
21
|
else
|
@@ -24,4 +24,4 @@ private
|
|
24
24
|
end
|
25
25
|
params
|
26
26
|
end
|
27
|
-
end
|
27
|
+
end
|
data/lib/phrase/delegate/i18n.rb
CHANGED
@@ -112,6 +112,10 @@ private
|
|
112
112
|
if @key == "helpers.label.#{entry}" # http://apidock.com/rails/v3.1.0/ActionView/Helpers/FormHelper/label
|
113
113
|
@fallback_keys << "activerecord.attributes.#{entry}"
|
114
114
|
end
|
115
|
+
|
116
|
+
if @key.start_with?("simple_form.") # special treatment for simple form
|
117
|
+
@fallback_keys << "activerecord.attributes.#{item.to_s}"
|
118
|
+
end
|
115
119
|
end
|
116
120
|
end
|
117
121
|
|
@@ -156,4 +160,4 @@ private
|
|
156
160
|
end unless (data.is_a?(String) || data.nil?)
|
157
161
|
key_names
|
158
162
|
end
|
159
|
-
end
|
163
|
+
end
|
data/lib/phrase/version.rb
CHANGED
data/lib/phrase/view_helpers.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
module Phrase::ViewHelpers
|
2
|
-
|
3
2
|
def phrase_javascript(auth_token=nil)
|
4
3
|
return "" unless Phrase.enabled?
|
5
4
|
|
@@ -15,6 +14,6 @@ module Phrase::ViewHelpers
|
|
15
14
|
})();
|
16
15
|
//]]>
|
17
16
|
</script>}
|
18
|
-
js.html_safe
|
17
|
+
js.respond_to?(:html_safe) ? js.html_safe : js
|
19
18
|
end
|
20
|
-
end
|
19
|
+
end
|
data/phrase.gemspec
CHANGED
@@ -19,8 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.files = git_files
|
20
20
|
s.test_files = s.files.grep(%r{^(spec)/})
|
21
21
|
s.executables = %w(phrase)
|
22
|
-
s.require_paths = ["lib"]
|
23
|
-
s.add_dependency('activesupport', '~> 3.0')
|
22
|
+
s.require_paths = ["lib"]
|
24
23
|
s.add_dependency('colorize')
|
25
24
|
s.add_dependency('json')
|
26
25
|
s.add_development_dependency('rake')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phrase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,33 +9,27 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement:
|
15
|
+
name: colorize
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: colorize
|
27
|
-
requirement: &70288255847400 !ruby/object:Gem::Requirement
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
25
|
none: false
|
29
26
|
requirements:
|
30
27
|
- - ! '>='
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: '0'
|
33
|
-
type: :runtime
|
34
|
-
prerelease: false
|
35
|
-
version_requirements: *70288255847400
|
36
30
|
- !ruby/object:Gem::Dependency
|
37
31
|
name: json
|
38
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
39
33
|
none: false
|
40
34
|
requirements:
|
41
35
|
- - ! '>='
|
@@ -43,10 +37,15 @@ dependencies:
|
|
43
37
|
version: '0'
|
44
38
|
type: :runtime
|
45
39
|
prerelease: false
|
46
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
47
46
|
- !ruby/object:Gem::Dependency
|
48
47
|
name: rake
|
49
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
50
49
|
none: false
|
51
50
|
requirements:
|
52
51
|
- - ! '>='
|
@@ -54,10 +53,15 @@ dependencies:
|
|
54
53
|
version: '0'
|
55
54
|
type: :development
|
56
55
|
prerelease: false
|
57
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
58
62
|
- !ruby/object:Gem::Dependency
|
59
63
|
name: rspec
|
60
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
61
65
|
none: false
|
62
66
|
requirements:
|
63
67
|
- - ! '>='
|
@@ -65,10 +69,15 @@ dependencies:
|
|
65
69
|
version: '0'
|
66
70
|
type: :development
|
67
71
|
prerelease: false
|
68
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: i18n
|
71
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
72
81
|
none: false
|
73
82
|
requirements:
|
74
83
|
- - ! '>='
|
@@ -76,10 +85,15 @@ dependencies:
|
|
76
85
|
version: '0'
|
77
86
|
type: :development
|
78
87
|
prerelease: false
|
79
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
80
94
|
- !ruby/object:Gem::Dependency
|
81
95
|
name: webmock
|
82
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
83
97
|
none: false
|
84
98
|
requirements:
|
85
99
|
- - ! '>='
|
@@ -87,10 +101,15 @@ dependencies:
|
|
87
101
|
version: '0'
|
88
102
|
type: :development
|
89
103
|
prerelease: false
|
90
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
91
110
|
- !ruby/object:Gem::Dependency
|
92
111
|
name: vcr
|
93
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
94
113
|
none: false
|
95
114
|
requirements:
|
96
115
|
- - ! '>='
|
@@ -98,10 +117,15 @@ dependencies:
|
|
98
117
|
version: '0'
|
99
118
|
type: :development
|
100
119
|
prerelease: false
|
101
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
102
126
|
- !ruby/object:Gem::Dependency
|
103
127
|
name: timecop
|
104
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
105
129
|
none: false
|
106
130
|
requirements:
|
107
131
|
- - ! '>='
|
@@ -109,7 +133,12 @@ dependencies:
|
|
109
133
|
version: '0'
|
110
134
|
type: :development
|
111
135
|
prerelease: false
|
112
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
113
142
|
description: phrase allows you to edit translations in-place on the page itself. More
|
114
143
|
information at phraseapp.com
|
115
144
|
email:
|
@@ -129,6 +158,10 @@ files:
|
|
129
158
|
- Rakefile
|
130
159
|
- bin/phrase
|
131
160
|
- cacert.pem
|
161
|
+
- lib/ext/all.rb
|
162
|
+
- lib/ext/hash.rb
|
163
|
+
- lib/ext/object.rb
|
164
|
+
- lib/ext/try.rb
|
132
165
|
- lib/phrase.rb
|
133
166
|
- lib/phrase/adapters/fast_gettext.rb
|
134
167
|
- lib/phrase/adapters/i18n.rb
|
@@ -200,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
233
|
version: 1.3.6
|
201
234
|
requirements: []
|
202
235
|
rubyforge_project: phrase
|
203
|
-
rubygems_version: 1.8.
|
236
|
+
rubygems_version: 1.8.24
|
204
237
|
signing_key:
|
205
238
|
specification_version: 3
|
206
239
|
summary: The best way to manage i18n.
|