linguist_ruby 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/lib/linguist_ruby.rb +16 -0
- data/lib/{linguist → linguist_ruby}/client.rb +20 -19
- data/lib/{linguist → linguist_ruby}/command.rb +3 -3
- data/lib/{linguist → linguist_ruby}/commands/auth.rb +7 -7
- data/lib/{linguist → linguist_ruby}/commands/base.rb +16 -15
- data/lib/linguist_ruby/commands/collaborator.rb +44 -0
- data/lib/{linguist → linguist_ruby}/commands/help.rb +22 -14
- data/lib/{linguist/commands/app.rb → linguist_ruby/commands/project.rb} +3 -6
- data/lib/linguist_ruby/commands/translations.rb +65 -0
- data/lib/{linguist → linguist_ruby}/commands/version.rb +0 -0
- data/lib/{linguist → linguist_ruby}/helpers.rb +0 -0
- data/lib/linguist_ruby/models/collaborator.rb +25 -0
- data/lib/linguist_ruby/models/project.rb +120 -0
- data/lib/{linguist → linguist_ruby}/models/projects.rb +1 -1
- data/lib/linguist_ruby/models/resource.rb +15 -0
- data/lib/{linguist → linguist_ruby}/models/user.rb +0 -0
- data/lib/linguist_ruby/rails3/railtie.rb +14 -0
- data/lib/linguist_ruby/version.rb +3 -0
- data/lib/patches/rails3/i18n/i18n.rb +48 -0
- metadata +64 -110
- data/lib/linguist.rb +0 -3
- data/lib/linguist/commands/translations.rb +0 -30
- data/lib/linguist/models/project.rb +0 -81
- data/lib/linguist/models/resource.rb +0 -26
- data/lib/linguist/version.rb +0 -3
@@ -0,0 +1,16 @@
|
|
1
|
+
require "linguist/client"
|
2
|
+
require "linguist/rails3/railtie" if defined?(Rails)
|
3
|
+
|
4
|
+
module Linguist
|
5
|
+
class << self
|
6
|
+
attr_accessor :environments, :protocol, :host, :username, :project
|
7
|
+
|
8
|
+
def configure
|
9
|
+
yield self
|
10
|
+
end
|
11
|
+
|
12
|
+
def default_value?(value)
|
13
|
+
value.start_with?(":")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rest_client'
|
2
2
|
require 'uri'
|
3
3
|
require 'time'
|
4
|
-
require '
|
4
|
+
require 'linguist_ruby/version'
|
5
5
|
require 'vendor/okjson'
|
6
6
|
require 'json'
|
7
7
|
require 'linguist/models/projects'
|
@@ -25,22 +25,27 @@ class Linguist::Client
|
|
25
25
|
"linguist-gem/#{version}"
|
26
26
|
end
|
27
27
|
|
28
|
-
attr_accessor :host, :user, :
|
28
|
+
attr_accessor :host, :user, :password
|
29
29
|
|
30
|
-
def self.auth(
|
31
|
-
client = new(
|
32
|
-
OkJson.decode client.post('/sessions', {
|
30
|
+
def self.auth(options)
|
31
|
+
client = new(options)
|
32
|
+
OkJson.decode client.post('/sessions', {}, :accept => 'json').to_s
|
33
33
|
end
|
34
34
|
|
35
|
-
def initialize(
|
36
|
-
@user =
|
37
|
-
@
|
38
|
-
@
|
35
|
+
def initialize(options)
|
36
|
+
@user = options[:username]
|
37
|
+
@password = options[:password]
|
38
|
+
@auth_token = options[:auth_token]
|
39
|
+
@host = options[:host] || 'lingui.st'
|
40
|
+
end
|
41
|
+
|
42
|
+
def credentials
|
43
|
+
@auth_token.nil? ? {:username => @user, :password => @password} : {:username => @auth_token, :password => ""}
|
39
44
|
end
|
40
45
|
|
41
46
|
def project(title)
|
42
47
|
project = self.projects[title]
|
43
|
-
raise(CommandFailed, "=== You aren't associated for a project named '#{title}'") if project.nil?
|
48
|
+
raise(Linguist::Command::CommandFailed, "=== You aren't associated for a project named '#{title}'") if project.nil?
|
44
49
|
project
|
45
50
|
end
|
46
51
|
|
@@ -68,27 +73,25 @@ class Linguist::Client
|
|
68
73
|
headers = linguist_headers.merge(extra_headers)
|
69
74
|
# payload = auth_params.merge(payload)
|
70
75
|
args = [method, payload, headers].compact
|
71
|
-
response = resource(uri).send(*args)
|
72
|
-
|
73
|
-
puts "RESPONSE #{response}"
|
76
|
+
response = resource(uri, credentials).send(*args)
|
74
77
|
|
75
78
|
# extract_warning(response)
|
76
79
|
response
|
77
80
|
end
|
78
81
|
|
79
|
-
def resource(uri)
|
82
|
+
def resource(uri, credentials)
|
80
83
|
|
81
84
|
RestClient.proxy = ENV['HTTP_PROXY'] || ENV['http_proxy']
|
82
85
|
if uri =~ /^https?/
|
83
86
|
# RestClient::Resource.new(uri, user, auth_token)
|
84
|
-
RestClient::Resource.new(uri)
|
87
|
+
RestClient::Resource.new(uri, :user => credentials[:username], :password => credentials[:password])
|
85
88
|
elsif host =~ /^https?/
|
86
89
|
# RestClient::Resource.new(host, user, auth_token)[uri]
|
87
|
-
RestClient::Resource.new(host)[uri]
|
90
|
+
RestClient::Resource.new(host, :user => credentials[:username], :password => credentials[:password])[uri]
|
88
91
|
else
|
89
92
|
# RestClient::Resource.new("https://api.#{host}", user, password)[uri]
|
90
93
|
# RestClient::Resource.new("http://localhost:3000/api/v1", user, auth_token)[uri]
|
91
|
-
RestClient::Resource.new("http://localhost:3000/api/v1")[uri]
|
94
|
+
RestClient::Resource.new("http://localhost:3000/api/v1", :user => credentials[:username], :password => credentials[:password])[uri]
|
92
95
|
end
|
93
96
|
end
|
94
97
|
|
@@ -107,8 +110,6 @@ class Linguist::Client
|
|
107
110
|
def linguist_headers # :nodoc:
|
108
111
|
{
|
109
112
|
'X-Linguist-API-Version' => '1',
|
110
|
-
'X-Linguist-User-Email' => user,
|
111
|
-
'X-Linguist-User-Auth-Token' => auth_token,
|
112
113
|
'User-Agent' => self.class.gem_version_string,
|
113
114
|
'X-Ruby-Version' => RUBY_VERSION,
|
114
115
|
'X-Ruby-Platform' => RUBY_PLATFORM,
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'linguist_ruby/helpers'
|
2
|
+
require 'linguist_ruby/commands/base'
|
3
3
|
|
4
4
|
Dir["#{File.dirname(__FILE__)}/commands/*.rb"].each { |c| require c }
|
5
5
|
|
@@ -53,7 +53,7 @@ module Linguist
|
|
53
53
|
begin
|
54
54
|
return eval("Linguist::Command::#{command.capitalize}"), :index
|
55
55
|
rescue NameError, NoMethodError
|
56
|
-
return Linguist::Command::
|
56
|
+
return Linguist::Command::Project, command.to_sym
|
57
57
|
end
|
58
58
|
else
|
59
59
|
begin
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "linguist_ruby/client"
|
2
2
|
|
3
3
|
module Linguist::Command
|
4
4
|
class Auth < Base
|
@@ -9,7 +9,7 @@ module Linguist::Command
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def init_linguist
|
12
|
-
client = Linguist::Client.new(user, auth_token, host)
|
12
|
+
client = Linguist::Client.new(:username => user, :auth_token => auth_token, :host => host)
|
13
13
|
# client.on_warning { |msg| self.display("\n#{msg}\n\n") }
|
14
14
|
client
|
15
15
|
end
|
@@ -20,7 +20,7 @@ module Linguist::Command
|
|
20
20
|
|
21
21
|
# just a stub; will raise if not authenticated
|
22
22
|
def check
|
23
|
-
client.
|
23
|
+
client.projects.all
|
24
24
|
end
|
25
25
|
|
26
26
|
def reauthorize
|
@@ -62,14 +62,14 @@ module Linguist::Command
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def ask_for_credentials
|
65
|
-
|
65
|
+
puts "Enter your Linguist credentials."
|
66
66
|
|
67
67
|
print "Email: "
|
68
|
-
user =
|
68
|
+
user = ask
|
69
69
|
|
70
70
|
print "Password: "
|
71
|
-
password =
|
72
|
-
api_key
|
71
|
+
password = running_on_windows? ? ask_for_password_on_windows : ask_for_password
|
72
|
+
api_key = Linguist::Client.auth(:username => user, :password => password, :host => host)['api_key']
|
73
73
|
|
74
74
|
[user, api_key]
|
75
75
|
end
|
@@ -10,30 +10,35 @@ module Linguist::Command
|
|
10
10
|
def initialize(args, linguist=nil)
|
11
11
|
@args = args
|
12
12
|
@linguist = linguist
|
13
|
-
@
|
13
|
+
@autodetected_project_name = false
|
14
14
|
end
|
15
15
|
|
16
16
|
def linguist
|
17
17
|
@linguist ||= Linguist::Command.run_internal('auth:client', args)
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
@autodetected_app = true
|
20
|
+
def project_title(force=true)
|
21
|
+
project_title = extract_project_title_from_args
|
22
|
+
unless project_title
|
23
|
+
project_title = extract_project_title_from_git || extract_project_title_from_dir_name ||
|
24
|
+
raise(CommandFailed, "No project specified.\nRun this command from project folder or set it adding --project <title>") if force
|
25
|
+
@autodetected_project_name = true
|
27
26
|
end
|
28
|
-
|
27
|
+
project_title
|
29
28
|
end
|
30
29
|
|
31
|
-
def
|
30
|
+
def extract_project_title_from_args
|
31
|
+
project_title = extract_option('--project', false)
|
32
|
+
raise(CommandFailed, "You must specify a project title after --project") if project_title == false
|
33
|
+
project_title
|
34
|
+
end
|
35
|
+
|
36
|
+
def extract_project_title_from_dir_name
|
32
37
|
dir = Dir.pwd
|
33
38
|
File.basename(dir)
|
34
39
|
end
|
35
40
|
|
36
|
-
def
|
41
|
+
def extract_project_title_from_git
|
37
42
|
dir = Dir.pwd
|
38
43
|
return unless remotes = git_remotes(dir)
|
39
44
|
|
@@ -101,10 +106,6 @@ module Linguist::Command
|
|
101
106
|
title ||= project_title
|
102
107
|
@project ||= linguist.project(title)
|
103
108
|
end
|
104
|
-
|
105
|
-
def project_title
|
106
|
-
(args.first && !args.first =~ /^\-\-/) ? args.first : extract_app
|
107
|
-
end
|
108
109
|
end
|
109
110
|
|
110
111
|
class BaseWithApp < Base
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Linguist::Command
|
2
|
+
class Collaborator < Base
|
3
|
+
def list
|
4
|
+
list = project.collaborators
|
5
|
+
if list.size > 0
|
6
|
+
display "Collaborators:\n"
|
7
|
+
list.each { |c| display("- #{c.display_name} | #{c.email} | #{c.permissions}") }
|
8
|
+
else
|
9
|
+
display "No collaborators found"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def invite
|
14
|
+
email = extract_email_from_args
|
15
|
+
project.invite_collaborator(email)
|
16
|
+
|
17
|
+
display("Invitation sent to #{email}")
|
18
|
+
rescue RestClient::BadRequest
|
19
|
+
display("Error sending invitation to '#{email}'")
|
20
|
+
end
|
21
|
+
|
22
|
+
def remove
|
23
|
+
email = extract_email_from_args
|
24
|
+
collaborator = project.collaborators.find { |c| c.email == email }
|
25
|
+
|
26
|
+
if collaborator.nil?
|
27
|
+
display("Collaborator with email '#{email}' not found")
|
28
|
+
else
|
29
|
+
collaborator.destroy
|
30
|
+
display("Collaborator with email #{email} was removed")
|
31
|
+
end
|
32
|
+
rescue RestClient::BadRequest
|
33
|
+
display("Error removing collaborator with email '#{email}'")
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def extract_email_from_args
|
39
|
+
email = args.shift
|
40
|
+
raise(CommandFailed, "You must specify a invitee email after --email") if email == false
|
41
|
+
email
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -36,23 +36,31 @@ module Linguist::Command
|
|
36
36
|
group.command 'help', 'show this usage'
|
37
37
|
group.command 'version', 'show the gem version'
|
38
38
|
group.space
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
group.command 'list', 'list your projects'
|
43
|
-
|
44
|
-
group.command 'info',
|
45
|
-
group.command 'open',
|
46
|
-
group.command 'rename <newname>',
|
47
|
-
group.command 'destroy',
|
39
|
+
end
|
40
|
+
|
41
|
+
group 'Project Commands' do |group|
|
42
|
+
group.command 'project:list', 'list your projects'
|
43
|
+
group.command 'project:create <name>', 'create a new project'
|
44
|
+
group.command 'project:info <name>', 'show project info, like web url and number of translations'
|
45
|
+
group.command 'project:open <name>', 'open the project in a web browser'
|
46
|
+
group.command 'project:rename <oldname> <newname>', 'rename the project'
|
47
|
+
group.command 'project:destroy <name', 'destroy the project permanently'
|
48
48
|
group.space
|
49
49
|
end
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
51
|
+
group 'Collaborator Commands' do |group|
|
52
|
+
group.command 'collaborator:list', 'list project collaborators'
|
53
|
+
group.command 'collaborator:invite <email>', 'invite the collaborator'
|
54
|
+
group.command 'collaborator:remove <email>', 'remove the collaborator'
|
55
|
+
group.space
|
56
|
+
end
|
57
|
+
|
58
|
+
group 'Translation Commands' do |group|
|
59
|
+
group.command 'translation:down --all --directory <path>', 'download all resource files'
|
60
|
+
group.command 'translation:down <file1> <file2> ... --directory <path>', 'download specific resource files'
|
61
|
+
group.command 'translation:up <file1> <file2> ... --locale <iso2_slug>', 'upload specific resource files'
|
62
|
+
group.space
|
63
|
+
end
|
56
64
|
end
|
57
65
|
|
58
66
|
def index
|
@@ -2,7 +2,7 @@ require 'readline'
|
|
2
2
|
require 'launchy'
|
3
3
|
|
4
4
|
module Linguist::Command
|
5
|
-
class
|
5
|
+
class Project < Base
|
6
6
|
def login
|
7
7
|
Linguist::Command.run_internal "auth:reauthorize", args.dup
|
8
8
|
end
|
@@ -31,10 +31,9 @@ module Linguist::Command
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def rename
|
34
|
-
newtitle = args.shift.downcase.strip rescue ''
|
35
34
|
oldtitle = project.title
|
36
35
|
|
37
|
-
raise(CommandFailed, "Invalid name
|
36
|
+
newtitle = args[1].downcase.strip rescue raise(CommandFailed, "Invalid new project name")
|
38
37
|
|
39
38
|
project.update(:title => newtitle)
|
40
39
|
display("Renaming project from #{oldtitle} to #{newtitle}")
|
@@ -50,9 +49,7 @@ module Linguist::Command
|
|
50
49
|
end
|
51
50
|
|
52
51
|
def open
|
53
|
-
project
|
54
|
-
url = project.weburl
|
55
|
-
Launchy.open url
|
52
|
+
Launchy.open project.weburl
|
56
53
|
end
|
57
54
|
|
58
55
|
def destroy
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Linguist::Command
|
2
|
+
class Translations < Base
|
3
|
+
def down
|
4
|
+
project #project validation
|
5
|
+
|
6
|
+
directory = File.join(Dir.pwd, extract_directory_from_args || "")
|
7
|
+
raise(CommandFailed, "Error downloading translations. Path #{directory} does not exist") unless File.directory?(directory)
|
8
|
+
|
9
|
+
files_source = extract_all_from_args ? project.resources.keys : args
|
10
|
+
files_source.each do |file_name|
|
11
|
+
begin
|
12
|
+
project.pull_resource(directory, file_name)
|
13
|
+
display("#{file_name} downloaded")
|
14
|
+
rescue
|
15
|
+
display "Error downloading #{file_name}. Response: #{$!.message}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def up
|
21
|
+
project #project validation
|
22
|
+
|
23
|
+
args.each do |file_name|
|
24
|
+
begin
|
25
|
+
path = File.expand_path(file_name, Dir.pwd)
|
26
|
+
project.push_resource(path, extract_locale_from_args)
|
27
|
+
display("#{file_name} uploaded")
|
28
|
+
rescue
|
29
|
+
display "Error uploading #{file_name}. Response: #{$!.response || $!.message}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def rails_environment?
|
37
|
+
true #TODO
|
38
|
+
end
|
39
|
+
|
40
|
+
def rails_locale_dir
|
41
|
+
Dir.pwd + "/conf/locales"
|
42
|
+
end
|
43
|
+
|
44
|
+
def extract_directory_from_args
|
45
|
+
return @directory if defined? @directory
|
46
|
+
@directory = extract_option('--directory', false)
|
47
|
+
raise(CommandFailed, "You must specify a directory after --directory") if @directory == false
|
48
|
+
@directory
|
49
|
+
end
|
50
|
+
|
51
|
+
def extract_locale_from_args
|
52
|
+
return @locale if defined? @locale
|
53
|
+
@locale = extract_option('--locale', false)
|
54
|
+
raise(CommandFailed, "You must specify a locale after --locale") if @locale == false
|
55
|
+
@locale
|
56
|
+
end
|
57
|
+
|
58
|
+
def extract_all_from_args
|
59
|
+
return @all if defined? @all
|
60
|
+
@all = extract_option('--all', true)
|
61
|
+
raise(CommandFailed, "You have not specify anything after --all") unless @all == true or @all.nil?
|
62
|
+
@all
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Linguist
|
2
|
+
module Models
|
3
|
+
class Collaborator
|
4
|
+
attr_accessor :email, :display_name, :roles
|
5
|
+
|
6
|
+
ROLES_NAMES = { "project_admin" => "Project admin", "developer" => "Developer" }
|
7
|
+
|
8
|
+
def initialize(client, link)
|
9
|
+
@client = client
|
10
|
+
@link = link
|
11
|
+
end
|
12
|
+
|
13
|
+
def destroy
|
14
|
+
@client.delete @link
|
15
|
+
end
|
16
|
+
|
17
|
+
def permissions
|
18
|
+
return "None" if self.roles.nil? or self.roles.empty?
|
19
|
+
|
20
|
+
self.roles.find_all { |role| ROLES_NAMES.has_key?(role) }.join(", ")
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module Linguist
|
2
|
+
module Models
|
3
|
+
require 'linguist_ruby/models/resource'
|
4
|
+
require 'linguist_ruby/models/collaborator'
|
5
|
+
|
6
|
+
class Project
|
7
|
+
def self.lazy_attr_accessor(*params)
|
8
|
+
params.each do |sym|
|
9
|
+
define_method(sym) do
|
10
|
+
unless defined? @fetched
|
11
|
+
fetch
|
12
|
+
end
|
13
|
+
self.instance_variable_get("@#{sym}")
|
14
|
+
end
|
15
|
+
define_method("#{sym}=") do |value|
|
16
|
+
self.instance_variable_set("@#{sym}", value)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
lazy_attr_accessor(:title, :link, :weburl, :resources_url, :collaborators_url, :invitations_url, :translations_url, :translations_count, :owner)
|
22
|
+
|
23
|
+
def initialize(client, link)
|
24
|
+
@client = client
|
25
|
+
@link = link
|
26
|
+
end
|
27
|
+
|
28
|
+
def create!(attributes={})
|
29
|
+
self.title = attribtes[:title]
|
30
|
+
end
|
31
|
+
|
32
|
+
def destroy
|
33
|
+
@client.delete self.link
|
34
|
+
end
|
35
|
+
|
36
|
+
def update(attributes={})
|
37
|
+
@client.put self.link, {:project => attributes}
|
38
|
+
end
|
39
|
+
|
40
|
+
def invite_collaborator(email)
|
41
|
+
@client.post(self.invitations_url, :invitation => {:email => email})
|
42
|
+
end
|
43
|
+
|
44
|
+
def resources
|
45
|
+
unless defined? @resources
|
46
|
+
@resources = {}
|
47
|
+
response = @client.get(self.resources_url)
|
48
|
+
resource_hash = JSON.parse(response)
|
49
|
+
members = resource_hash["resources"]["members"]
|
50
|
+
members.each do |member|
|
51
|
+
@resources[member["name"]] = Linguist::Models::Resource.new(@client, member["link"]["href"])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
@resources
|
55
|
+
end
|
56
|
+
|
57
|
+
def collaborators
|
58
|
+
unless defined? @collaborators
|
59
|
+
@collaborators = []
|
60
|
+
response = @client.get(self.collaborators_url)
|
61
|
+
resource_hash = JSON.parse(response)
|
62
|
+
members = resource_hash["collaborators"]["members"]
|
63
|
+
members.each do |member|
|
64
|
+
link = member["link"]["href"] rescue ""
|
65
|
+
collaborator = Linguist::Models::Collaborator.new(@client, link)
|
66
|
+
collaborator.email = member["email"]
|
67
|
+
collaborator.display_name = member["display_name"]
|
68
|
+
collaborator.roles = member["roles"]
|
69
|
+
@collaborators << collaborator
|
70
|
+
end
|
71
|
+
end
|
72
|
+
@collaborators
|
73
|
+
end
|
74
|
+
|
75
|
+
def pull_resource(dir, file_name)
|
76
|
+
raise "Project does not contain that file." unless self.resources.has_key?(file_name)
|
77
|
+
save_to_file(File.join(dir, file_name), self.resources[file_name].content)
|
78
|
+
end
|
79
|
+
|
80
|
+
def push_resource(path, locale)
|
81
|
+
raise "Path #{path} does not exists" unless File.exists?(path)
|
82
|
+
request = { :file => File.new(path, "rb") }
|
83
|
+
request.merge!({ :iso2_slug => locale }) if locale
|
84
|
+
@client.post(self.resources_url, request)
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def fetch
|
90
|
+
@fetched = true
|
91
|
+
response = @client.get @link
|
92
|
+
project_hash = JSON.parse(response)
|
93
|
+
links = project_hash["link"]
|
94
|
+
link = links[0]["href"]
|
95
|
+
weburl = links[1]["href"]
|
96
|
+
translations_url = links[2]["href"]
|
97
|
+
resources_url = links[3]["href"]
|
98
|
+
collaborators_url = links[4]["href"]
|
99
|
+
invitations_url = links[5]["href"]
|
100
|
+
init_attributes :title => project_hash["title"], :link => link, :weburl => weburl,
|
101
|
+
:owner => project_hash["owner_email"], :translations_count => project_hash["translations_count"],
|
102
|
+
:translations_url => translations_url, :resources_url => resources_url,
|
103
|
+
:collaborators_url => collaborators_url, :invitations_url => invitations_url
|
104
|
+
end
|
105
|
+
|
106
|
+
def init_attributes(attributes)
|
107
|
+
attributes.each_pair do |key, value|
|
108
|
+
unless self.instance_variable_get("@#{key}")
|
109
|
+
self.send "#{key}=", value
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def save_to_file(path, content)
|
115
|
+
File.open(path, 'w+') { |f| f.write(content) }
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rails'
|
2
|
+
|
3
|
+
module Linguist
|
4
|
+
class Railtie < ::Rails::Railtie
|
5
|
+
config.after_initialize do
|
6
|
+
Linguist.environments ||= [:development]
|
7
|
+
Linguist.protocol ||= "https"
|
8
|
+
Linguist.host ||= "app.lingui.st"
|
9
|
+
Linguist.username ||= ":username"
|
10
|
+
Linguist.project ||= ":project"
|
11
|
+
Dir[File.join(File.dirname(__FILE__), "../../patches/**/*.rb")].each { |f| require f }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require "stringex"
|
3
|
+
|
4
|
+
module I18n
|
5
|
+
class << self
|
6
|
+
alias :old_translate :translate
|
7
|
+
|
8
|
+
def translate(*args)
|
9
|
+
result = old_translate(args)
|
10
|
+
result = wrap_with_wysiwyt(args.dup.shift, result) if enabled?
|
11
|
+
result
|
12
|
+
end
|
13
|
+
|
14
|
+
alias :t :translate
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def enabled?
|
19
|
+
Linguist.environments.include?(current_env) rescue false
|
20
|
+
end
|
21
|
+
|
22
|
+
def current_env
|
23
|
+
defined?(Rails) ? Rails.env.to_sym : nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def wrap_with_wysiwyt(translation_title, translation_phrase)
|
27
|
+
"<span data-phrase_url=\"#{link_to_translation(translation_title)}\" data-locale=\"#{locale}\" data-master-phrase=\"#{translation_title}\">#{translation_phrase}</span>"
|
28
|
+
end
|
29
|
+
|
30
|
+
def link_to_translation(translation_title)
|
31
|
+
username = option_to_url(Linguist.username)
|
32
|
+
project = option_to_url(Linguist.project)
|
33
|
+
translation_title = translation_title.to_url
|
34
|
+
|
35
|
+
"#{Linguist.protocol}://#{Linguist.host}/#{username}/#{project}/#{translation_title}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def option_to_url(option)
|
39
|
+
if option.nil?
|
40
|
+
""
|
41
|
+
elsif Linguist.default_value?(option)
|
42
|
+
option
|
43
|
+
else
|
44
|
+
option.to_url
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
metadata
CHANGED
@@ -1,121 +1,78 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: linguist_ruby
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
4
5
|
prerelease:
|
5
|
-
version: 0.0.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Linguist
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: fakefs
|
17
|
-
prerelease: false
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
|
-
requirements:
|
21
|
-
- - ~>
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.3.1
|
24
|
-
type: :development
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: rake
|
28
|
-
prerelease: false
|
29
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
-
none: false
|
31
|
-
requirements:
|
32
|
-
- - ">="
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version: "0"
|
35
|
-
type: :development
|
36
|
-
version_requirements: *id002
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: rspec
|
39
|
-
prerelease: false
|
40
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 1.3.0
|
46
|
-
type: :development
|
47
|
-
version_requirements: *id003
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: taps
|
50
|
-
prerelease: false
|
51
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
|
-
requirements:
|
54
|
-
- - ~>
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: 0.3.20
|
57
|
-
type: :development
|
58
|
-
version_requirements: *id004
|
59
|
-
- !ruby/object:Gem::Dependency
|
60
|
-
name: webmock
|
61
|
-
prerelease: false
|
62
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
63
|
-
none: false
|
64
|
-
requirements:
|
65
|
-
- - ~>
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: 1.5.0
|
68
|
-
type: :development
|
69
|
-
version_requirements: *id005
|
70
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-10-16 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
71
15
|
name: rest-client
|
72
|
-
|
73
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2154533780 !ruby/object:Gem::Requirement
|
74
17
|
none: false
|
75
|
-
requirements:
|
76
|
-
- -
|
77
|
-
- !ruby/object:Gem::Version
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
78
21
|
version: 1.4.0
|
79
22
|
- - <
|
80
|
-
- !ruby/object:Gem::Version
|
23
|
+
- !ruby/object:Gem::Version
|
81
24
|
version: 1.7.0
|
82
25
|
type: :runtime
|
83
|
-
version_requirements: *id006
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: launchy
|
86
26
|
prerelease: false
|
87
|
-
|
27
|
+
version_requirements: *2154533780
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: launchy
|
30
|
+
requirement: &2154533060 !ruby/object:Gem::Requirement
|
88
31
|
none: false
|
89
|
-
requirements:
|
32
|
+
requirements:
|
90
33
|
- - ~>
|
91
|
-
- !ruby/object:Gem::Version
|
34
|
+
- !ruby/object:Gem::Version
|
92
35
|
version: 0.3.2
|
93
36
|
type: :runtime
|
94
|
-
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: *2154533060
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: stringex
|
41
|
+
requirement: &2154532600 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.2.1
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: *2154532600
|
95
50
|
description: Client library and command-line tool to translate Rails apps with Linguist.
|
96
51
|
email: support@lingui.st
|
97
|
-
executables:
|
52
|
+
executables:
|
98
53
|
- linguist
|
99
54
|
extensions: []
|
100
|
-
|
101
55
|
extra_rdoc_files: []
|
102
|
-
|
103
|
-
|
104
|
-
- lib/
|
105
|
-
- lib/
|
106
|
-
- lib/
|
107
|
-
- lib/
|
108
|
-
- lib/
|
109
|
-
- lib/
|
110
|
-
- lib/
|
111
|
-
- lib/
|
112
|
-
- lib/
|
113
|
-
- lib/
|
114
|
-
- lib/
|
115
|
-
- lib/
|
116
|
-
- lib/
|
117
|
-
- lib/
|
118
|
-
- lib/
|
56
|
+
files:
|
57
|
+
- lib/linguist_ruby/client.rb
|
58
|
+
- lib/linguist_ruby/command.rb
|
59
|
+
- lib/linguist_ruby/commands/auth.rb
|
60
|
+
- lib/linguist_ruby/commands/base.rb
|
61
|
+
- lib/linguist_ruby/commands/collaborator.rb
|
62
|
+
- lib/linguist_ruby/commands/help.rb
|
63
|
+
- lib/linguist_ruby/commands/project.rb
|
64
|
+
- lib/linguist_ruby/commands/translations.rb
|
65
|
+
- lib/linguist_ruby/commands/version.rb
|
66
|
+
- lib/linguist_ruby/helpers.rb
|
67
|
+
- lib/linguist_ruby/models/collaborator.rb
|
68
|
+
- lib/linguist_ruby/models/project.rb
|
69
|
+
- lib/linguist_ruby/models/projects.rb
|
70
|
+
- lib/linguist_ruby/models/resource.rb
|
71
|
+
- lib/linguist_ruby/models/user.rb
|
72
|
+
- lib/linguist_ruby/rails3/railtie.rb
|
73
|
+
- lib/linguist_ruby/version.rb
|
74
|
+
- lib/linguist_ruby.rb
|
75
|
+
- lib/patches/rails3/i18n/i18n.rb
|
119
76
|
- lib/vendor/okjson.rb
|
120
77
|
- bin/linguist
|
121
78
|
- LICENSE
|
@@ -125,30 +82,27 @@ files:
|
|
125
82
|
- ROADMAP.md
|
126
83
|
homepage: http://lingui.st/
|
127
84
|
licenses: []
|
128
|
-
|
129
85
|
post_install_message:
|
130
86
|
rdoc_options: []
|
131
|
-
|
132
|
-
require_paths:
|
87
|
+
require_paths:
|
133
88
|
- lib
|
134
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
135
90
|
none: false
|
136
|
-
requirements:
|
137
|
-
- -
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
version:
|
140
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
96
|
none: false
|
142
|
-
requirements:
|
143
|
-
- -
|
144
|
-
- !ruby/object:Gem::Version
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
145
100
|
version: 1.3.6
|
146
101
|
requirements: []
|
147
|
-
|
148
102
|
rubyforge_project:
|
149
|
-
rubygems_version: 1.7
|
103
|
+
rubygems_version: 1.8.7
|
150
104
|
signing_key:
|
151
105
|
specification_version: 3
|
152
106
|
summary: Client library and CLI to translate Rails apps with Linguist.
|
153
107
|
test_files: []
|
154
|
-
|
108
|
+
has_rdoc:
|
data/lib/linguist.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module Linguist::Command
|
2
|
-
class Translations < Base
|
3
|
-
|
4
|
-
def down
|
5
|
-
if rails_environment?
|
6
|
-
project.resources["en.yml"].download rails_locale_dir
|
7
|
-
else
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def up
|
12
|
-
if rails_environment?
|
13
|
-
else
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def rails_environment?
|
21
|
-
true #TODO
|
22
|
-
end
|
23
|
-
|
24
|
-
def rails_locale_dir
|
25
|
-
Dir.pwd + "/conf/locales"
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
module Linguist
|
2
|
-
module Models
|
3
|
-
require 'linguist/models/resource'
|
4
|
-
|
5
|
-
class Project
|
6
|
-
def self.lazy_attr_accessor(*params)
|
7
|
-
params.each do |sym|
|
8
|
-
define_method(sym) do
|
9
|
-
unless defined? @fetched
|
10
|
-
fetch
|
11
|
-
end
|
12
|
-
self.instance_variable_get("@#{sym}")
|
13
|
-
end
|
14
|
-
define_method("#{sym}=") do |value|
|
15
|
-
self.instance_variable_set("@#{sym}", value)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
lazy_attr_accessor(:title, :link, :weburl, :resources_url, :translations_url, :translations_count, :owner)
|
21
|
-
|
22
|
-
def initialize(client, link)
|
23
|
-
@client = client
|
24
|
-
@link = link
|
25
|
-
end
|
26
|
-
|
27
|
-
def create!(attributes={ })
|
28
|
-
self.title = attribtes[:title]
|
29
|
-
end
|
30
|
-
|
31
|
-
def destroy
|
32
|
-
@client.delete self.link
|
33
|
-
end
|
34
|
-
|
35
|
-
def update(attributes={ })
|
36
|
-
@client.put self.link, { :project => attributes }
|
37
|
-
end
|
38
|
-
|
39
|
-
def resources
|
40
|
-
unless defined? @resources
|
41
|
-
@resources = { }
|
42
|
-
response = @client.get(self.resources_url)
|
43
|
-
resource_hash = JSON.parse(response)
|
44
|
-
links = resource_hash["link"]
|
45
|
-
links.each do |link|
|
46
|
-
file_name = link["rel"]
|
47
|
-
locale, extension = File.basename(file_name, '.*') , File.extname(file_name)
|
48
|
-
@resources[file_name] = Linguist::Models::Resource.new(@client, locale, extension, link["href"])
|
49
|
-
end
|
50
|
-
end
|
51
|
-
puts "RESOURCES #{@resources}"
|
52
|
-
@resources
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def fetch
|
58
|
-
@fetched = true
|
59
|
-
response = @client.get @link
|
60
|
-
project_hash = JSON.parse(response)
|
61
|
-
links = project_hash["link"]
|
62
|
-
link = links[0]["href"]
|
63
|
-
weburl = links[1]["href"]
|
64
|
-
translations_url = links[2]["href"]
|
65
|
-
resources_url = links[3]["href"]
|
66
|
-
init_attributes :title => project_hash["title"], :link => link, :weburl => weburl,
|
67
|
-
:owner => project_hash["owner_email"], :translations_count => project_hash["translations_count"],
|
68
|
-
:translations_url => translations_url, :resources_url => resources_url
|
69
|
-
end
|
70
|
-
|
71
|
-
def init_attributes(attributes)
|
72
|
-
attributes.each_pair do |key, value|
|
73
|
-
unless self.instance_variable_get("@#{key}")
|
74
|
-
self.send "#{key}=", value
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Linguist
|
2
|
-
module Models
|
3
|
-
class Resource
|
4
|
-
attr_reader :locale, :format, :link
|
5
|
-
|
6
|
-
# @param client [Linguist::Client] passed through client instance
|
7
|
-
# @param locale [String] String that represents a locale in ISO 2 format, e.g. 'en', 'de'
|
8
|
-
# @param format [String] Extension of the file format, e.g. 'en', 'de'
|
9
|
-
# @param link [String] Link to the resource, e.g. 'http://lvh.me:3000/api/v1/projects/project-1/resources/de.properties'
|
10
|
-
def initialize(client, locale, format, link)
|
11
|
-
@client = client
|
12
|
-
@link = link
|
13
|
-
@locale = locale
|
14
|
-
@format = format
|
15
|
-
end
|
16
|
-
|
17
|
-
# Downloads the resource and creates the new resource file. Overrides existing files.
|
18
|
-
# @param dir [String] The directory where to store the file, e.g. '/Users/heli' would create a file '/Users/heli/en.yml'
|
19
|
-
def download(dir)
|
20
|
-
response = @client.get(link)
|
21
|
-
File.open(dir + "/#{locale}#{format}", 'w+') { |f| f.write(response) }
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/lib/linguist/version.rb
DELETED