localeapp 0.5.2 → 0.6.0

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 CHANGED
@@ -1,3 +1,9 @@
1
+ # Version 0.6.0
2
+
3
+ * Support passing -k or --api-key option to commands
4
+ * Remove deprecated disabled_* configuration options
5
+ * Fix performance bug when :default specified in I18n.t call
6
+
1
7
  # Version 0.5.2
2
8
 
3
9
  * Fix bug with pulling translations changing file permissions
@@ -80,10 +86,3 @@
80
86
  * Removed some unnecessary default options from config files generated with
81
87
  `localeapp install`
82
88
  * Fixed `localeapp push` with no arguments
83
-
84
- ## NOTICE
85
-
86
- If you've added disabled_polling_environments,
87
- disabled_reloading_environments or disabled_sending_environments to your
88
- initializer you should change these to polling_environments,
89
- reloading_environments and sending_environments and configure as per the README
@@ -2,8 +2,8 @@ source "http://rubygems.org"
2
2
 
3
3
  group :development do
4
4
  gem "rspec", ">= 2.4.0"
5
- gem "bundler", "~> 1.1.2"
5
+ gem "bundler"
6
6
  gem "jeweler", "> 1.6.4"
7
7
  gem 'i18n-spec'
8
8
  gem 'localeapp'
9
- end
9
+ end
data/bin/localeapp CHANGED
@@ -14,13 +14,6 @@ if ENV['FAKE_WEB_DURING_CUCUMBER_RUN'] && fake_data_as_json = ENV['FAKE_WEB_FAKE
14
14
  end
15
15
  end
16
16
 
17
- def initialize_config
18
- unless Localeapp.initialize_config
19
- puts "Could not load config file"
20
- exit 1
21
- end
22
- end
23
-
24
17
  require 'gli'
25
18
  gli2 = GLI::VERSION >= '2.0.0'
26
19
 
@@ -30,9 +23,22 @@ else
30
23
  include GLI
31
24
  end
32
25
 
26
+ pre do |global_options, command, options, args|
27
+ if Localeapp.has_config_file? || !global_options[:k].nil?
28
+ true
29
+ else
30
+ puts "Could not load config file and no key specified"
31
+ exit 1
32
+ end
33
+ end
34
+
35
+ desc "API Key (for when there is no configuration file)"
36
+ flag [:k, 'api-key']
37
+
33
38
  version Localeapp::VERSION
34
39
 
35
40
  desc "Creates new configuration files and confirms key works"
41
+ skips_pre
36
42
  arg_name "<api_key>"
37
43
  command :install do |c|
38
44
  c.desc "install configuration files in .localeapp/"
@@ -61,8 +67,7 @@ command :add do |c|
61
67
  if key.nil? || args.size.zero?
62
68
  exit_now! "localeapp add requires a key name and at least one translation", 1
63
69
  else
64
- initialize_config
65
- Localeapp::CLI::Add.new.execute(key, *args)
70
+ Localeapp::CLI::Add.new(global_options).execute(key, *args)
66
71
  end
67
72
  end
68
73
  end
@@ -70,8 +75,7 @@ end
70
75
  desc "Pulls all translations from localeapp.com"
71
76
  command :pull do |c|
72
77
  c.action do |global_options, options, args|
73
- initialize_config
74
- Localeapp::CLI::Pull.new.execute
78
+ Localeapp::CLI::Pull.new(global_options).execute
75
79
  end
76
80
  end
77
81
 
@@ -83,8 +87,7 @@ command :push do |c|
83
87
  exit_now! "localeapp push requires an file or directory to push", 1
84
88
  else
85
89
  path = args.first
86
- initialize_config
87
- pusher = Localeapp::CLI::Push.new
90
+ pusher = Localeapp::CLI::Push.new(global_options)
88
91
  pusher.execute(path)
89
92
  end
90
93
  end
@@ -93,8 +96,7 @@ end
93
96
  desc "Gets any changes since the last poll and updates the yml"
94
97
  command :update do |c|
95
98
  c.action do |global_options, options, args|
96
- initialize_config
97
- Localeapp::CLI::Update.new.execute
99
+ Localeapp::CLI::Update.new(global_options).execute
98
100
  end
99
101
  end
100
102
 
@@ -109,42 +111,7 @@ command :daemon do |c|
109
111
  c.switch [:b, 'background']
110
112
 
111
113
  c.action do |global_options, options, args|
112
- initialize_config
113
-
114
- interval = options[:interval].to_i
115
-
116
- if interval <= 0
117
- exit_now! "interval must be a positive integer greater than 0", 1
118
- end
119
-
120
- command = Proc.new do
121
- loop do
122
- Localeapp::CLI::Update.new.execute
123
- sleep interval
124
- end
125
- end
126
- if options[:background]
127
-
128
- if File.exists? Localeapp.configuration.daemon_pid_file
129
- begin
130
- daemon_pid = File.read(Localeapp.configuration.daemon_pid_file)
131
- Process.kill("QUIT", daemon_pid.to_i)
132
- rescue Errno::ESRCH
133
- File.delete(Localeapp.configuration.daemon_pid_file)
134
- end
135
- end
136
-
137
- STDOUT.reopen(File.open(Localeapp.configuration.daemon_log_file, 'a'))
138
- pid = fork do
139
- Signal.trap('HUP', 'IGNORE')
140
- command.call
141
- end
142
- Process.detach(pid)
143
-
144
- File.open(Localeapp.configuration.daemon_pid_file, 'w') {|f| f << pid}
145
- else
146
- command.call
147
- end
114
+ Localeapp::CLI::Daemon.new(global_options).execute(options)
148
115
  end
149
116
  end
150
117
 
@@ -0,0 +1,46 @@
1
+ Feature: Adding a translation from the command line
2
+
3
+ Scenario: Running add
4
+ In order to add a key and translation content
5
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
6
+ And an initializer file
7
+ When I run `localeapp add foo.baz en:"test en content" es:"test es content"`
8
+ Then the output should contain:
9
+ """
10
+ Localeapp Add
11
+
12
+ Sending key: foo.baz
13
+ Success!
14
+ """
15
+
16
+ Scenario: Running add with no arguments
17
+ In order to add a key and translation content
18
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
19
+ And an initializer file
20
+ When I run `localeapp add`
21
+ Then the output should contain:
22
+ """
23
+ localeapp add requires a key name and at least one translation
24
+ """
25
+
26
+ Scenario: Running add with just a key name
27
+ In order to add a key and translation content
28
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
29
+ And an initializer file
30
+ When I run `localeapp add foo.bar`
31
+ Then the output should contain:
32
+ """
33
+ localeapp add requires a key name and at least one translation
34
+ """
35
+
36
+ Scenario: Running add with no initializer file, passing the key on the command line
37
+ In order to add a key and translation content
38
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
39
+ When I run `localeapp -k MYAPIKEY add foo.baz en:"test en content"`
40
+ Then the output should contain:
41
+ """
42
+ Localeapp Add
43
+
44
+ Sending key: foo.baz
45
+ Success!
46
+ """
@@ -0,0 +1,8 @@
1
+ Feature: localeapp executable
2
+ Scenario: Running a command that doesn't exist
3
+ In order to warn of a bad command
4
+ When I run `localeapp foo`
5
+ Then the output should contain:
6
+ """
7
+ error: Unknown command 'foo'
8
+ """
@@ -0,0 +1,9 @@
1
+ Feature: Getting help
2
+
3
+ Scenario: Viewing help
4
+ In order to see what options I have
5
+ When I run `localeapp help`
6
+ Then the output should contain:
7
+ """
8
+ localeapp [global options] command [command options]
9
+ """
@@ -0,0 +1,70 @@
1
+ Feature: Installation
2
+
3
+ Scenario: Running Rails install
4
+ In order to configure my project and check my api key is correct
5
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
6
+ And I run `localeapp install MYAPIKEY`
7
+ Then the output should contain:
8
+ """
9
+ Localeapp Install
10
+
11
+ Checking API key: MYAPIKEY
12
+ Success!
13
+ Project: Test Project
14
+ Default Locale: en (English)
15
+ """
16
+ And help should not be displayed
17
+ And a file named "config/initializers/localeapp.rb" should exist
18
+ And the exit status should be 0
19
+
20
+ Scenario: Running standalone install
21
+ In order to configure my non rails project and check my api key is correct
22
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
23
+ And I run `localeapp install --standalone MYAPIKEY`
24
+ Then the output should contain:
25
+ """
26
+ Localeapp Install
27
+
28
+ Checking API key: MYAPIKEY
29
+ Success!
30
+ Project: Test Project
31
+ Default Locale: en (English)
32
+ """
33
+ And help should not be displayed
34
+ And a file named ".localeapp/config.rb" should exist
35
+ And the exit status should be 0
36
+
37
+ Scenario: Running github install
38
+ In order to configure my public github project and check my api key is correct
39
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
40
+ And I run `localeapp install --github MYAPIKEY`
41
+ Then the output should contain:
42
+ """
43
+ Localeapp Install
44
+
45
+ Checking API key: MYAPIKEY
46
+ Success!
47
+ Project: Test Project
48
+ Default Locale: en (English)
49
+ """
50
+ And help should not be displayed
51
+ And a file named ".localeapp/config.rb" should exist
52
+ And a file named ".gitignore" should exist
53
+ And a file named "README.md" should exist
54
+ And the exit status should be 0
55
+
56
+
57
+ Scenario: Running install with bad api key
58
+ In order to configure my project and check my api key is correct
59
+ When I have a valid project on localeapp.com but an incorrect api key "BADAPIKEY"
60
+ And I run `localeapp install BADAPIKEY`
61
+ Then the output should contain:
62
+ """
63
+ Localeapp Install
64
+
65
+ Checking API key: BADAPIKEY
66
+ ERROR: Project not found
67
+ """
68
+ And help should not be displayed
69
+ And a file named "config/initializers/localeapp.rb" should not exist
70
+ And the exit status should not be 0
@@ -0,0 +1,46 @@
1
+ Feature: Pulling all translation
2
+
3
+ Scenario: Running pull
4
+ In order to retrieve my translations
5
+ Given I have a translations on localeapp.com for the project with api key "MYAPIKEY"
6
+ And an initializer file
7
+ And a directory named "config/locales"
8
+ When I run `localeapp pull`
9
+ Then the output should contain:
10
+ """
11
+ Localeapp Pull
12
+
13
+ Fetching translations:
14
+ Success!
15
+ Updating backend:
16
+ Success!
17
+ """
18
+ And help should not be displayed
19
+ And a file named "config/locales/en.yml" should exist
20
+
21
+ Scenario: Running pull without having a locales dir
22
+ In order to retreive my translations
23
+ Given I have a translations on localeapp.com for the project with api key "MYAPIKEY"
24
+ And an initializer file
25
+ When I run `localeapp pull`
26
+ Then the output should contain:
27
+ """
28
+ Could not write locale file, please make sure that config/locales exists and is writeable
29
+ """
30
+
31
+ Scenario: Running pull with no initializer file, passing the key on the command line
32
+ In order to retrieve my translations
33
+ Given I have a translations on localeapp.com for the project with api key "MYAPIKEY"
34
+ And a directory named "config/locales"
35
+ When I run `localeapp -k MYAPIKEY pull`
36
+ Then the output should contain:
37
+ """
38
+ Localeapp Pull
39
+
40
+ Fetching translations:
41
+ Success!
42
+ Updating backend:
43
+ Success!
44
+ """
45
+ And help should not be displayed
46
+ And a file named "config/locales/en.yml" should exist
@@ -0,0 +1,57 @@
1
+ Feature: Pushing existing translation to localeapp
2
+
3
+ Scenario: Running push on a file
4
+ In order to send my translations
5
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
6
+ And an initializer file
7
+ And an empty file named "config/locales/en.yml"
8
+ When I run `localeapp push config/locales/en.yml`
9
+ Then the output should contain:
10
+ """
11
+ Localeapp Push
12
+
13
+ Pushing file en.yml:
14
+ Success!
15
+
16
+ config/locales/en.yml queued for processing.
17
+ """
18
+ And help should not be displayed
19
+
20
+ Scenario: Running push on a directory
21
+ In order to send my translations
22
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
23
+ And an initializer file
24
+ And an empty file named "config/locales/en.yml"
25
+ And an empty file named "config/locales/es.yml"
26
+ When I run `localeapp push config/locales`
27
+ Then the output should contain:
28
+ """
29
+ Localeapp Push
30
+
31
+ Pushing file en.yml:
32
+ Success!
33
+
34
+ config/locales/en.yml queued for processing.
35
+
36
+ Pushing file es.yml:
37
+ Success!
38
+
39
+ config/locales/es.yml queued for processing.
40
+ """
41
+ And help should not be displayed
42
+
43
+ Scenario: Running push on a file with no initializer file, passing the key on the command line
44
+ In order to send my translations
45
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
46
+ And an empty file named "config/locales/en.yml"
47
+ When I run `localeapp -k MYAPIKEY push config/locales/en.yml`
48
+ Then the output should contain:
49
+ """
50
+ Localeapp Push
51
+
52
+ Pushing file en.yml:
53
+ Success!
54
+
55
+ config/locales/en.yml queued for processing.
56
+ """
57
+ And help should not be displayed
@@ -0,0 +1,44 @@
1
+ Feature: Getting new translations
2
+
3
+ Scenario: Running update
4
+ In order to receive the translations that have been updated since the last check
5
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
6
+ And an initializer file
7
+ And a file named "log/localeapp.yml" with:
8
+ """
9
+ ---
10
+ :updated_at: 120
11
+ :polled_at: 130
12
+ """
13
+ And new translations for the api key "MYAPIKEY" since "120" with time "140"
14
+ And a directory named "config/locales"
15
+ When I run `localeapp update`
16
+ Then the output should contain:
17
+ """
18
+ Localeapp update: checking for translations since 120
19
+ Found and updated new translations
20
+ """
21
+ And help should not be displayed
22
+ And a file named "config/locales/en.yml" should exist
23
+ # check the content here
24
+ # and the localeapp.yml file
25
+
26
+ Scenario: Running update with no initializer file, passing the key on the command line
27
+ In order to receive the translations that have been updated since the last check
28
+ When I have a valid project on localeapp.com with api key "MYAPIKEY"
29
+ And a file named "log/localeapp.yml" with:
30
+ """
31
+ ---
32
+ :updated_at: 120
33
+ :polled_at: 130
34
+ """
35
+ And new translations for the api key "MYAPIKEY" since "120" with time "140"
36
+ And a directory named "config/locales"
37
+ When I run `localeapp -k MYAPIKEY update`
38
+ Then the output should contain:
39
+ """
40
+ Localeapp update: checking for translations since 120
41
+ Found and updated new translations
42
+ """
43
+ And help should not be displayed
44
+ And a file named "config/locales/en.yml" should exist
@@ -1,10 +1,6 @@
1
1
  module Localeapp
2
2
  module CLI
3
- class Add
4
- def initialize(output = $stdout)
5
- @output = output
6
- end
7
-
3
+ class Add < Command
8
4
  def execute(key, *translations)
9
5
  @output.puts "Localeapp Add"
10
6
  @output.puts ""
@@ -0,0 +1,34 @@
1
+ module Localeapp
2
+ module CLI
3
+ class Command
4
+ def initialize(args = {})
5
+ initialize_config(args)
6
+ @output = args[:output] || $stdout
7
+ end
8
+
9
+ # requires the Localeapp configuration
10
+ def initialize_config(args = {})
11
+ Localeapp.configure # load defaults
12
+ load_config_file
13
+ set_command_line_arguments(args)
14
+ end
15
+
16
+ def set_command_line_arguments(args = {})
17
+ sanitized_args = {}
18
+ if args[:k]
19
+ sanitized_args[:api_key] = args[:k]
20
+ end
21
+ sanitized_args.each do |setting, value|
22
+ Localeapp.configuration.send("#{setting}=", value)
23
+ end
24
+ end
25
+
26
+ def load_config_file
27
+ Localeapp.default_config_file_paths.each do |path|
28
+ next unless File.exists? path
29
+ require path
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,54 @@
1
+ module Localeapp
2
+ module CLI
3
+ class Daemon < Command
4
+ def execute(options)
5
+ interval = options[:interval].to_i
6
+
7
+ if interval <= 0
8
+ exit_now! "interval must be a positive integer greater than 0", 1
9
+ end
10
+
11
+ if options[:background]
12
+ run_in_background(interval)
13
+ else
14
+ update_loop(interval)
15
+ end
16
+ end
17
+
18
+ def update_loop(interval)
19
+ loop do
20
+ do_update
21
+ sleep interval
22
+ end
23
+ end
24
+
25
+ def do_update
26
+ Localeapp::CLI::Update.new.execute
27
+ end
28
+
29
+ def run_in_background(interval)
30
+ kill_existing
31
+
32
+ STDOUT.reopen(File.open(Localeapp.configuration.daemon_log_file, 'a'))
33
+ pid = fork do
34
+ Signal.trap('HUP', 'IGNORE')
35
+ update_loop(interval)
36
+ end
37
+ Process.detach(pid)
38
+
39
+ File.open(Localeapp.configuration.daemon_pid_file, 'w') {|f| f << pid}
40
+ end
41
+
42
+ def kill_existing
43
+ if File.exists? Localeapp.configuration.daemon_pid_file
44
+ begin
45
+ daemon_pid = File.read(Localeapp.configuration.daemon_pid_file)
46
+ Process.kill("QUIT", daemon_pid.to_i)
47
+ rescue Errno::ESRCH
48
+ File.delete(Localeapp.configuration.daemon_pid_file)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,42 +1,43 @@
1
1
  module Localeapp
2
2
  module CLI
3
- class Install
3
+ class Install < Command
4
4
  attr_accessor :config_type
5
5
 
6
- def initialize
6
+ def initialize(args = {})
7
+ super
7
8
  @config_type = :rails
8
9
  end
9
10
 
10
- def execute(key, output = $stdout)
11
- output.puts "Localeapp Install"
12
- output.puts ""
13
- output.puts "Checking API key: #{key}"
11
+ def execute(key)
12
+ @output.puts "Localeapp Install"
13
+ @output.puts ""
14
+ @output.puts "Checking API key: #{key}"
14
15
  if key.nil?
15
- output.puts "ERROR: You must supply an API key"
16
+ @output.puts "ERROR: You must supply an API key"
16
17
  return
17
18
  end
18
19
  valid_key, project_data = check_key(key)
19
20
  if valid_key
20
- output.puts "Success!"
21
- output.puts "Project: #{project_data['name']}"
21
+ @output.puts "Success!"
22
+ @output.puts "Project: #{project_data['name']}"
22
23
  localeapp_default_code = project_data['default_locale']['code']
23
- output.puts "Default Locale: #{localeapp_default_code} (#{project_data['default_locale']['name']})"
24
+ @output.puts "Default Locale: #{localeapp_default_code} (#{project_data['default_locale']['name']})"
24
25
 
25
26
  if config_type == :rails
26
27
  if I18n.default_locale.to_s != localeapp_default_code
27
- output.puts "WARNING: I18n.default_locale is #{I18n.default_locale}, change in config/environment.rb (Rails 2) or config/application.rb (Rails 3)"
28
+ @output.puts "WARNING: I18n.default_locale is #{I18n.default_locale}, change in config/environment.rb (Rails 2) or config/application.rb (Rails 3)"
28
29
  end
29
30
  config_file_path = "config/initializers/localeapp.rb"
30
31
  data_directory = "config/locales"
31
32
  else
32
33
  if config_type == :standalone
33
- output.puts "NOTICE: you probably want to add .localeapp to your .gitignore file"
34
+ @output.puts "NOTICE: you probably want to add .localeapp to your .gitignore file"
34
35
  end
35
36
  config_file_path = ".localeapp/config.rb"
36
37
  data_directory = "locales"
37
38
  end
38
39
 
39
- output.puts "Writing configuration file to #{config_file_path}"
40
+ @output.puts "Writing configuration file to #{config_file_path}"
40
41
  if config_type == :github
41
42
  write_github_configuration_file config_file_path, project_data
42
43
  else
@@ -44,11 +45,11 @@ module Localeapp
44
45
  end
45
46
 
46
47
  unless File.directory?(data_directory)
47
- output.puts "WARNING: please create the #{data_directory} directory. Your translation data will be stored there."
48
+ @output.puts "WARNING: please create the #{data_directory} directory. Your translation data will be stored there."
48
49
  end
49
50
  true
50
51
  else
51
- output.puts "ERROR: Project not found"
52
+ @output.puts "ERROR: Project not found"
52
53
  false
53
54
  end
54
55
  end
@@ -1,12 +1,8 @@
1
1
  module Localeapp
2
2
  module CLI
3
- class Pull
3
+ class Pull < Command
4
4
  include ::Localeapp::ApiCall
5
5
 
6
- def initialize(output = $stdout)
7
- @output = output
8
- end
9
-
10
6
  def execute
11
7
  @output.puts "Localeapp Pull"
12
8
  @output.puts ""
@@ -1,12 +1,8 @@
1
1
  module Localeapp
2
2
  module CLI
3
- class Push
3
+ class Push < Command
4
4
  include ::Localeapp::ApiCall
5
5
 
6
- def initialize(output = $stdout)
7
- @output = output
8
- end
9
-
10
6
  def execute(path = nil)
11
7
  @output.puts "Localeapp Push"
12
8
  if path_is_directory?(path)
@@ -1,10 +1,6 @@
1
1
  module Localeapp
2
2
  module CLI
3
- class Update
4
- def initialize(output = $stdout)
5
- @output = output
6
- end
7
-
3
+ class Update < Command
8
4
  def execute
9
5
  poller = Localeapp::Poller.new
10
6
  @output.puts("Localeapp update: checking for translations since #{poller.updated_at}")