linguist_ruby 0.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/CHANGELOG.md +0 -0
- data/LICENSE +20 -0
- data/README.md +0 -0
- data/REST.md +0 -0
- data/ROADMAP.md +0 -0
- data/bin/linguist +14 -0
- data/lib/linguist/client.rb +120 -0
- data/lib/linguist/command.rb +98 -0
- data/lib/linguist/commands/app.rb +72 -0
- data/lib/linguist/commands/auth.rb +146 -0
- data/lib/linguist/commands/base.rb +118 -0
- data/lib/linguist/commands/help.rb +90 -0
- data/lib/linguist/commands/translations.rb +30 -0
- data/lib/linguist/commands/version.rb +7 -0
- data/lib/linguist/helpers.rb +121 -0
- data/lib/linguist/models/project.rb +81 -0
- data/lib/linguist/models/projects.rb +34 -0
- data/lib/linguist/models/resource.rb +26 -0
- data/lib/linguist/models/user.rb +3 -0
- data/lib/linguist/version.rb +3 -0
- data/lib/linguist.rb +3 -0
- data/lib/vendor/okjson.rb +556 -0
- metadata +154 -0
@@ -0,0 +1,30 @@
|
|
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
|
@@ -0,0 +1,121 @@
|
|
1
|
+
module Linguist
|
2
|
+
module Helpers
|
3
|
+
def home_directory
|
4
|
+
running_on_windows? ? ENV['USERPROFILE'] : ENV['HOME']
|
5
|
+
end
|
6
|
+
|
7
|
+
def running_on_windows?
|
8
|
+
RUBY_PLATFORM =~ /mswin32|mingw32/
|
9
|
+
end
|
10
|
+
|
11
|
+
def running_on_a_mac?
|
12
|
+
RUBY_PLATFORM =~ /-darwin\d/
|
13
|
+
end
|
14
|
+
|
15
|
+
def display(msg, newline=true)
|
16
|
+
if newline
|
17
|
+
puts(msg)
|
18
|
+
else
|
19
|
+
print(msg)
|
20
|
+
STDOUT.flush
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def redisplay(line, line_break = false)
|
25
|
+
display("\r\e[0K#{line}", line_break)
|
26
|
+
end
|
27
|
+
|
28
|
+
def deprecate(version)
|
29
|
+
display "!!! DEPRECATION WARNING: This command will be removed in version #{version}"
|
30
|
+
display ""
|
31
|
+
end
|
32
|
+
|
33
|
+
def error(msg)
|
34
|
+
STDERR.puts(msg)
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
|
38
|
+
def confirm(message="Are you sure you wish to continue? (y/n)?")
|
39
|
+
display("#{message} ", false)
|
40
|
+
ask.downcase == 'y'
|
41
|
+
end
|
42
|
+
|
43
|
+
def confirm_command(app = app)
|
44
|
+
# if extract_option('--force')
|
45
|
+
# display("Warning: The --force switch is deprecated, and will be removed in a future release. Use --confirm #{app} instead.")
|
46
|
+
# return true
|
47
|
+
# end
|
48
|
+
|
49
|
+
raise(Linguist::Command::CommandFailed, "No app specified.\nRun this command from app folder or set it adding --app <app name>") unless app
|
50
|
+
|
51
|
+
confirmed_app = extract_option('--confirm', false)
|
52
|
+
if confirmed_app
|
53
|
+
unless confirmed_app == app
|
54
|
+
raise(Linguist::Command::CommandFailed, "Confirmed app #{confirmed_app} did not match the selected app #{app}.")
|
55
|
+
end
|
56
|
+
return true
|
57
|
+
else
|
58
|
+
display ""
|
59
|
+
display " ! WARNING: Potentially Destructive Action"
|
60
|
+
display " ! This command will affect the app: #{app}"
|
61
|
+
display " ! To proceed, type \"#{app}\" or re-run this command with --confirm #{app}"
|
62
|
+
display ""
|
63
|
+
display "> ", false
|
64
|
+
if ask.downcase != app
|
65
|
+
display " ! Input did not match #{app}. Aborted."
|
66
|
+
false
|
67
|
+
else
|
68
|
+
true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def format_date(date)
|
74
|
+
date = Time.parse(date) if date.is_a?(String)
|
75
|
+
date.strftime("%Y-%m-%d %H:%M %Z")
|
76
|
+
end
|
77
|
+
|
78
|
+
def ask
|
79
|
+
gets.strip
|
80
|
+
end
|
81
|
+
|
82
|
+
def shell(cmd)
|
83
|
+
FileUtils.cd(Dir.pwd) {|d| return `#{cmd}`}
|
84
|
+
end
|
85
|
+
|
86
|
+
def run_command(command, args=[])
|
87
|
+
Linguist::Command.run_internal(command, args)
|
88
|
+
end
|
89
|
+
|
90
|
+
def retry_on_exception(*exceptions)
|
91
|
+
retry_count = 0
|
92
|
+
begin
|
93
|
+
yield
|
94
|
+
rescue *exceptions => ex
|
95
|
+
raise ex if retry_count >= 3
|
96
|
+
sleep 3
|
97
|
+
retry_count += 1
|
98
|
+
retry
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def has_git?
|
103
|
+
%x{ git --version }
|
104
|
+
$?.success?
|
105
|
+
end
|
106
|
+
|
107
|
+
def git(args)
|
108
|
+
return "" unless has_git?
|
109
|
+
flattened_args = [args].flatten.compact.join(" ")
|
110
|
+
%x{ git #{flattened_args} 2>&1 }.strip
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
unless String.method_defined?(:shellescape)
|
116
|
+
class String
|
117
|
+
def shellescape
|
118
|
+
empty? ? "''" : gsub(/([^A-Za-z0-9_\-.,:\/@\n])/n, '\\\\\\1').gsub(/\n/, "'\n'")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,81 @@
|
|
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
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Linguist
|
2
|
+
module Models
|
3
|
+
require 'linguist/models/project'
|
4
|
+
|
5
|
+
class Projects
|
6
|
+
|
7
|
+
PROJECT_URL = '/projects'
|
8
|
+
|
9
|
+
def initialize(client)
|
10
|
+
@client = client
|
11
|
+
end
|
12
|
+
|
13
|
+
def create(title)
|
14
|
+
@client.post(PROJECT_URL, :project => {:title => title})
|
15
|
+
end
|
16
|
+
|
17
|
+
def all
|
18
|
+
return @projects if defined? @projects
|
19
|
+
@projects = {}
|
20
|
+
response = JSON.parse @client.get(PROJECT_URL).to_s
|
21
|
+
response["projects"]["members"].each do |member|
|
22
|
+
project = Linguist::Models::Project.new(@client, member["link"][0]["href"])
|
23
|
+
@projects[member["title"]] = project
|
24
|
+
end
|
25
|
+
@projects
|
26
|
+
end
|
27
|
+
|
28
|
+
def [](project_title)
|
29
|
+
return all[project_title]
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
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.rb
ADDED