zmeygo_sync 0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in trclient.gemspec
4
+ gem 'rest-client', :git => 'git://github.com/archiloque/rest-client.git'
data/README.rdoc ADDED
@@ -0,0 +1,115 @@
1
+ = Zmeygo Syncronizer
2
+
3
+ Zmeygo syncronizer is a convinient tool to interface with zmeygo.com service. Zmeygo
4
+ service helps you to manage internationalization data of your rails applications.
5
+
6
+ == Install
7
+
8
+ Add to Gemfile of your rails project
9
+
10
+ gem 'zmeygo'
11
+
12
+ After that run
13
+
14
+ bundle install
15
+
16
+ This will generate ./script/zmeygo_sync and ./config/zmeygo_sync.yml
17
+
18
+ == Usage
19
+
20
+ === Configuration
21
+
22
+ Every time you will run zg command it will check for configutation file
23
+ .zmeygo/config.yml in your home folder. To generate a template for config file
24
+ run command
25
+
26
+ zg init
27
+
28
+ Then go and edit ~/.zmeygo/config.yml. In config file add correct values for
29
+
30
+ * api_token - you can see your api_token in your user profile in zmeygo.com
31
+
32
+ * default_project - One user will have associated more the one project. Zmeygo client right now can work only with one of them - default project. When you will run zg command to push keys on the server, they will be pushed automatically to default project. Right now there is no other way to specify other project.
33
+
34
+ * locale_dir - this is place where zg client will download all pulled locale files from the server
35
+ Below is an example of ~/.zmego/config.yml file:
36
+
37
+ → cat ~/.zmeygo/config.yml
38
+ # Configuration file for zmeygo
39
+ #
40
+
41
+ defaults: &defaults
42
+ server: http://zmeygo.com
43
+ api_token: 4e02abc123ef7e3528001231
44
+ default_project: my_proj
45
+ locale_dir: /home/john/rails_projects/my_proj/config/locales
46
+
47
+ development:
48
+ <<: *defaults
49
+
50
+ production:
51
+ <<: *defaults
52
+
53
+ === Check server connection
54
+
55
+ In order to check server connectivity run command
56
+
57
+ zg ping
58
+
59
+ If you don't have connection to the server, then most probably you are behind
60
+ proxy (like me in the office). Setup environment variable $http_proxy or/and
61
+ $https_proxy and smart zg will detect and use it. If that didn't work like ISP
62
+ support says **check if you have plugged internet cable** :D
63
+
64
+ It will display OK if you can connect to server. Now you are ready for real
65
+ action!
66
+
67
+ === Pull data from server
68
+
69
+ One of two greatest thing that zmeygo client was designed for is to pull data from
70
+ server. Command:
71
+
72
+ zg pull
73
+
74
+ This command will download locales files of default project (specified in config
75
+ file) to location locale_dir also specified in configuration file. This command
76
+ is a shortcut for downloading manually locale files. There will be downloaded
77
+ one file per locale. Existing locale files will be overriden.
78
+
79
+ === Push data to server
80
+
81
+ Second of the greatest thing that zmeygo client was designed for is to push data
82
+ to the server. The command:
83
+
84
+ zg push
85
+
86
+ Will push all locally cached i18n key to the server. To list locally cached keys
87
+ use command:
88
+
89
+ zg list cache
90
+
91
+ I18n keys are stored in cached by zmeygo gem included in Rails application. Next
92
+ section describes this in detail.
93
+
94
+ === Use zmeygo gem from Rails application
95
+
96
+ To make possible pushing of i18n keys to the zmeygo server, include zmeygo gem
97
+ into your rails project with gem 'zmeygo' in Gemfile. Then in your development
98
+ environment put
99
+
100
+ Zmeygo.configure
101
+
102
+ which will load configurations from ~/.zmeygo/config.yml file. Zmeygo gem adds
103
+ custom exception handler to I18n gem, thus every missing translation exeption
104
+ thrown by I18n will insert missing key into zmeygo local cache. This means that
105
+ you just add as usual I18n.t call to the view, then while you are browsing your
106
+ application views, missing keys will be collected by zmeygo locally. Here and
107
+ there, run somewhere in command line:
108
+
109
+ zg push
110
+
111
+ This will push all cached key to zmeygo server. And voila, you can translate
112
+ your keys to whatever locale you choose on the server.
113
+
114
+ Send all your questions to: eugen@zmeygo.com
115
+
data/README.ro.rdoc ADDED
File without changes
data/README.ru.rdoc ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/TODO ADDED
@@ -0,0 +1,6 @@
1
+ Write tests to test 3 basic things this gem will do
2
+ 1. Hook into I18n.translate
3
+ 2. Gather cache
4
+ 3. Send cache (push method)
5
+ 4. Receive locale data (pull method)
6
+
@@ -0,0 +1,13 @@
1
+ # Configuration file for zmeygo
2
+ #
3
+
4
+ defaults: &defaults
5
+ api_token: <your account api_token here>
6
+ project: my_project_name
7
+
8
+ development:
9
+ <<: *defaults
10
+
11
+ production:
12
+ <<: *defaults
13
+
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment'))
4
+ require 'zmeygo/command'
5
+ Zmeygo::Command.new(ARGV).daemonize
@@ -0,0 +1,13 @@
1
+ require 'rails/generators'
2
+
3
+ class ZmeygoSyncGenerator < Rails::Generators::Base
4
+
5
+ self.source_paths << File.join(File.dirname(__FILE__), 'templates')
6
+
7
+ def create_script_file
8
+ template 'script', 'script/zmeygo_sync'
9
+ template 'config.yml', 'config/zmeygo_sync.yml'
10
+ chmod 'script/zmeygo_sync', 0755
11
+ chmod 'config/zmeygo_sync.yml', 0755
12
+ end
13
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ require 'fileutils'
3
+ require 'rest_client'
4
+ require 'json'
5
+ require 'i18n'
6
+ require 'active_support'
7
+ require 'active_support/core_ext/hash'
8
+ require 'yaml'
9
+ require 'logger'
10
+
11
+ require File.join(File.dirname(__FILE__),'/version')
12
+ require File.join(File.dirname(__FILE__),'/constant')
13
+ require File.join(File.dirname(__FILE__),'/configuration')
14
+ require File.join(File.dirname(__FILE__),'/client')
15
+ require File.join(File.dirname(__FILE__),'/command')
16
+ require File.join(File.dirname(__FILE__),'/cache')
17
+
18
+ module ZmeygoSync
19
+ class << self
20
+ attr_accessor :client
21
+ attr_accessor :config
22
+ attr_accessor :cache
23
+ attr_accessor :logger
24
+
25
+ def method_missing(method, *args)
26
+ self.cache.respond_to?(method)? cache.send(method, *args) : super
27
+ end
28
+
29
+ def configure
30
+ self.config ||= Configuration.new
31
+ if block_given?
32
+ yield(config)
33
+ end
34
+ self.cache = Cache.new
35
+ self.logger = Logger.new(File.join(Rails.root, 'log', 'zmeygo_sync.log'))
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,68 @@
1
+ # encoding: UTF-8
2
+
3
+ module ZmeygoSync
4
+ # Cache is responsable to gather missing keys from I18n.t/I18n.translate
5
+ # calls and once in a while send them to server.
6
+ # Server where keys will be sent is configured in config file Zmeygo.config['server']
7
+ class Cache
8
+ def initialize
9
+ @config = Zmeygo.config
10
+ @missing_keys = {}
11
+ @cache_file_path = "#{Rails.root}/tmp/zmeygo_sync_cache"
12
+ end
13
+
14
+ def get_cache_proj
15
+ proj = validate_config!
16
+ proj
17
+ end
18
+
19
+ def get_cache
20
+ proj = validate_config!
21
+ @missing_keys[proj]
22
+ end
23
+
24
+ def empty?
25
+ File.zero?(@cache_file_path)
26
+ end
27
+
28
+ def add_to_cache(key)
29
+ proj = validate_config!
30
+ @missing_keys[proj] ||= {}
31
+ @missing_keys[proj][key] = true
32
+ File.open(@cache_file_path,'w') do |f|
33
+ f.write(Marshal.dump(@missing_keys))
34
+ end
35
+ end
36
+
37
+ def load_cache
38
+ hash = {}
39
+ File.open(@cache_file_path,'r') do |f|
40
+ data = f.read
41
+ begin
42
+ hash = Marshal.load(data)
43
+ rescue => e
44
+ puts e
45
+ return
46
+ end
47
+ end
48
+ hash
49
+ end
50
+
51
+ def clear_cache
52
+ proj = validate_config!
53
+ @missing_keys[proj].clear
54
+ File.truncate(@cache_file_path,0)
55
+ end
56
+
57
+ def validate_config!
58
+ proj = @config['project']
59
+ if proj.blank?
60
+ raise "Please provide default project name in"
61
+ end
62
+ @missing_keys[proj] ||= {}
63
+ proj
64
+ end
65
+
66
+ end # Cache
67
+ end # Zmeygo
68
+
@@ -0,0 +1,208 @@
1
+ # encoding: utf-8
2
+ require 'ya2yaml'
3
+
4
+ module ZmeygoSyncSync
5
+ class Client
6
+
7
+ attr_accessor :config, :options
8
+
9
+ def initialize(options={})
10
+ self.options = options
11
+ self.config = ZmeygoSyncSync.config
12
+ end
13
+
14
+ def push
15
+ if ZmeygoSync.cache.empty?
16
+ puts "No cache" if options[:verbose]
17
+ return
18
+ end
19
+ url = "http://ZmeygoSync.com/api/pushmissing?api_token=#{config['api_token']}"
20
+ keys = []
21
+ hash = ZmeygoSync.load_cache
22
+ puts "cache=#{hash}" if options[:verbose]
23
+ ZmeygoSync.clear_cache
24
+ begin
25
+ puts "POST #{url}" if options[:verbose]
26
+ response = RestClient.post(url,:data => hash)
27
+ rescue
28
+ puts "Direct http request #{url} failed!" if options[:verbose]
29
+ if RestClient.proxy.nil?
30
+ puts "Now retrying through proxy..." if options[:verbose]
31
+ if ENV['http_proxy']
32
+ puts "Environment variable http_proxy found." if options[:verbose]
33
+ RestClient.proxy = ENV['http_proxy']
34
+ retry
35
+ end
36
+ end
37
+ puts "http request #{url} failed!"
38
+ exit
39
+ end
40
+ if response.code == 200
41
+ reply = JSON.parse(response.body)
42
+ elsif response.code == 401
43
+ puts "Invalid api_token given."
44
+ elsif response.code == 500
45
+ puts "Ooops! Internal server error."
46
+ end
47
+ end
48
+
49
+ def ping
50
+ puts "pinging server #{config[:server]} ..." if options[:verbose]
51
+ http_connect('ping') do |reply|
52
+ reply['message']
53
+ end
54
+ end
55
+
56
+ def list_config
57
+ puts "Server: #{config[:server]}"
58
+ puts "Default project: #{config[:default_project]}"
59
+ end
60
+
61
+ def list
62
+ case options[:list]
63
+ when "projects"
64
+ return list_projects
65
+ when "locales"
66
+ return list_locales
67
+ when "config"
68
+ return list_config
69
+ when 'cache'
70
+ return list_cache
71
+ else
72
+ return "list what? projects or locales or cache?"
73
+ end
74
+ end
75
+
76
+ def list_cache
77
+ hash = {}
78
+ total = 0
79
+ file = "#{Rails.root}/tmp/ZmeygoSync_sync_cache"
80
+ if File.zero?(file)
81
+ puts "No cache" if options[:verbose]
82
+ return
83
+ end
84
+ File.open(file,'r') do |f|
85
+ begin
86
+ data = f.read
87
+ hash = Marshal.load(data)
88
+ rescue => e
89
+ puts e
90
+ puts "No cache"
91
+ return
92
+ end
93
+ end
94
+ if hash.empty?
95
+ puts "No cache"
96
+ else
97
+ hash.each_pair do |proj,v|
98
+ puts "===== #{proj} ====="
99
+ v.each_pair do |key,options|
100
+ puts "#{key} => #{options}"
101
+ total += 1
102
+ end
103
+ end
104
+ end
105
+ "==== Total #{total} keys ===="
106
+ end
107
+
108
+ def list_projects
109
+ http_connect('available_projects') do |reply|
110
+ if reply['message'] == 'OK'
111
+ return reply['data']
112
+ else
113
+ return reply['message']
114
+ end
115
+ end
116
+ end
117
+
118
+ def list_locales
119
+ project = config['project']
120
+
121
+ if project.nil?
122
+ return "Please provide project name for which I should list locales. Use -p option."
123
+ end
124
+ http_connect("available_locales/#{project}") do |reply|
125
+ if reply['message'] == 'OK'
126
+ return reply['data']
127
+ else
128
+ puts "#{reply['message']}"
129
+ return reply['message']
130
+ end
131
+ end
132
+ end
133
+
134
+ def translate
135
+ project,locale,key = options[:project],options[:locale],options[:key]
136
+ project ||= config.default_project
137
+
138
+ http_connect("tr/#{project}/#{locale}/#{key}") do |reply|
139
+ if reply['message'] == 'OK'
140
+ return reply['data']
141
+ else
142
+ return reply['message']
143
+ end
144
+ end
145
+ end
146
+
147
+ def pull
148
+ project = config['project']
149
+ if project.nil?
150
+ puts "Please provide project name from where to pull i18n keys from. Either use -p option or specify default project in config file."
151
+ return
152
+ end
153
+ # pull all available locales
154
+ locales = list_locales
155
+ # for each available locale requst i18n data
156
+ locales.split(',').each do |loc|
157
+ pull_translations(project,loc)
158
+ end
159
+ end
160
+
161
+ def http_connect(path)
162
+ url = "#{config['server'] || 'http://ZmeygoSync.com'}/api/#{path}?api_token=#{config['api_token']}"
163
+ begin
164
+ puts "GET #{url}" if options[:verbose]
165
+ response = RestClient.get(url)
166
+ rescue
167
+ puts "Direct http request #{url} failed!" if options[:verbose]
168
+ if RestClient.proxy.nil?
169
+ puts "Now retrying through proxy..." if options[:verbose]
170
+ if ENV['http_proxy']
171
+ puts "Environment variable http_proxy found." if options[:verbose]
172
+ RestClient.proxy = ENV['http_proxy']
173
+ retry
174
+ end
175
+ end
176
+ puts "http request #{url} failed!"
177
+ exit
178
+ end
179
+ if response.code == 200
180
+ reply = JSON.parse(response.body)
181
+ yield(reply)
182
+ elsif response.code == 401
183
+ puts "Invalid api_token given."
184
+ elsif response.code == 500
185
+ puts "Ooops! Internal server error."
186
+ end
187
+ end
188
+ private
189
+ def pull_translations(project,locale_code)
190
+ request_line = "tr/#{project}/#{locale_code}"
191
+ http_connect(request_line) do |reply|
192
+ if reply['message'] == 'OK'
193
+ hash_result = reply['data']
194
+ folder = File.expand_path(File.join(Rails.root,'config','locales'))
195
+ unless File.exists?(folder)
196
+ FileUtils.mkdir_p(folder)
197
+ end
198
+ File.open(folder + "/#{locale_code}.yml", 'w') do |f|
199
+ ZmeygoSync.logger.info "saving file #{locale_code}.yml..."
200
+ f.write(hash_result.ya2yaml)
201
+ end
202
+ else
203
+ puts "Message: #{reply['message']}"
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+ require 'daemons'
3
+ require 'optparse'
4
+
5
+ module ZmeygoSyncSync
6
+ class Command
7
+
8
+ attr_accessor :options, :client
9
+
10
+ def initialize(args ={})
11
+ @options = {
12
+ :verbose => false,
13
+ :pid_dir => "#{Rails.root}/tmp/pids",
14
+ :sleep_delay => 10,
15
+ :debug => false # when debug is false - it will daomonize, otherwise - it won't
16
+ }
17
+
18
+ @monitor = false
19
+
20
+ opts = OptionParser.new do |opts|
21
+ opts.banner = "Usage: #{File.basename($0)} [options] start|stop|restart|run"
22
+
23
+ opts.on('-h', '--help', 'Show this message') do
24
+ puts opts
25
+ exit 1
26
+ end
27
+ opts.on('-s','--sleep-delay N', "Amount of time to sleep when no jobs are found") do |n|
28
+ @options[:sleep_delay] = n.to_i
29
+ end
30
+ opts.on('-v','--verbose', "verbosity") do
31
+ @options[:verbose] = true
32
+ end
33
+ opts.on('-d','--debug', "debug mode, don't daemonize") do
34
+ @options[:debug] = true
35
+ end
36
+ end
37
+ @args = opts.parse!(args)
38
+
39
+ ZmeygoSync.configure
40
+
41
+ self.options = @options
42
+ self.client = ZmeygoSync::Client.new(@options)
43
+
44
+ end
45
+
46
+ def run
47
+ unless defined?(Rails)
48
+ raise "This is not rails app???"
49
+ end
50
+ loop do
51
+ self.client.push
52
+ self.client.pull
53
+ sleep(@options[:sleep_delay])
54
+ end
55
+ rescue => e
56
+ Rails.logger.fatal e
57
+ STDERR.puts e.message
58
+ exit 1
59
+ end
60
+
61
+ def daemonize
62
+ if @options[:debug]
63
+ run
64
+ else
65
+ Daemons.run_proc('zmeygo_sync') { run }
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ #
3
+ module ZmeygoSync
4
+ require 'yaml'
5
+ require 'fileutils'
6
+
7
+ class Configuration
8
+ attr_accessor :server, :api_token, :locale_dir, :project
9
+
10
+ def initialize
11
+ conf_file = File.join(Rails.root,'config','zmeygo.yml')
12
+ conf_all = YAML.load_file(File.expand_path(conf_file))
13
+ conf = conf_all[Rails.env]
14
+ conf['server'] = 'http://zmeygo.com'
15
+ self.api_token = conf['api_token']
16
+ self.project = conf['project']
17
+ end
18
+
19
+ def [](key)
20
+ if self.respond_to?(key)
21
+ send(key)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+ #
3
+ module ZmeygoSync
4
+ class Constant
5
+ DEFAULT_CONFIG_FILE = "#{Rails.root}/config/zmeygo.yml"
6
+ CACHE_FILE = "#{Rails.root}/tmp/zmeygo_sync_cache"
7
+ end
8
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ module ZmeygoSync
4
+ class I18nBackend
5
+
6
+ attr_accessor :client
7
+
8
+ def initialize(options={})
9
+ @collection = {}
10
+ @options = options
11
+ Zmeygo.configure
12
+ self.client = Zmeygo::Client.new(options)
13
+ end
14
+
15
+ def translate(locale, key, options = {})
16
+ client.translate(nil,locale,key)
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,3 @@
1
+ module ZmeygoSync
2
+ VERSION = "0.2"
3
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ require File.join(File.dirname(__FILE__),'/zmeygo_sync/base')
3
+
4
+ module I18n
5
+ class << self
6
+ def custom_exception_handler(*args)
7
+ args.shift
8
+ locale = args.shift
9
+ key = args.shift
10
+ ZmeygoSync.add_to_cache(key)
11
+ # return an aproximation of translation
12
+ # This is last part of dot separated key, with _ replaced with space,
13
+ # capitalized and inserted between square brakets. I found this to be best
14
+ # aproximation of future translation.
15
+ arr = key.to_s.split('.')
16
+ last = if arr.respond_to?(:last)
17
+ arr.last
18
+ else
19
+ arr
20
+ end
21
+ "["+last.tr('_',' ').capitalize+"]"
22
+ end
23
+ end
24
+ I18n.exception_handler = :custom_exception_handler
25
+ end
26
+
27
+
@@ -0,0 +1,34 @@
1
+ require File.join(File.dirname(__FILE__),'/test_helper')
2
+ require File.join(File.dirname(__FILE__),'../lib/zmeygo')
3
+
4
+ class ExtI18nTest < Test::Unit::TestCase
5
+ # check if i18n.t method indeed populates Zmeygo.missing_keys
6
+ def setup
7
+
8
+ end
9
+ def test_assert_i18n_translate
10
+ Zmeygo.clear_cache
11
+ assert_equal 0, Zmeygo.get_cache.size
12
+ I18n.t :key1
13
+ I18n.t :key2
14
+ assert_equal 2, Zmeygo.get_cache.size
15
+ assert Zmeygo.get_cache.include?(:key1)
16
+ assert Zmeygo.get_cache.include?(:key2)
17
+ end
18
+
19
+ # c
20
+ def test_if_i18n_correctly_populates_cache
21
+ Zmeygo.clear_cache
22
+ assert_equal 0, Zmeygo.get_cache.size
23
+ I18n.t :some_key
24
+ I18n.t :other_key
25
+ I18n.t 'text.signin'
26
+ cache = Zmeygo.get_cache.clone
27
+ proj = Zmeygo.get_cache_proj
28
+ assert_equal Zmeygo.config['default_project'],proj
29
+ assert cache.include?(:some_key)
30
+ assert cache.include?(:other_key)
31
+ assert cache.include?('text.signin')
32
+ assert cache.size == 3
33
+ end
34
+ end
@@ -0,0 +1 @@
1
+ require 'test/unit'
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ require 'zmeygo_sync/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "zmeygo_sync"
8
+ s.version = ZmeygoSync::VERSION
9
+ s.platform = Gem::Platform::RUBY
10
+ s.authors = ["Eugen Ciur"]
11
+ s.email = ["eugen@zmeygo.com"]
12
+ s.homepage = "http://zmeygo.com"
13
+ s.summary = "Zmeygo service syncronizer"
14
+ s.description = "Syncs local i18n data with Zmeygo service"
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.require_paths = ["lib"]
18
+ s.has_rdoc = true
19
+ s.require_path = 'lib'
20
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zmeygo_sync
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: "0.2"
6
+ platform: ruby
7
+ authors:
8
+ - Eugen Ciur
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-10-17 00:00:00 +03:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: Syncs local i18n data with Zmeygo service
18
+ email:
19
+ - eugen@zmeygo.com
20
+ executables: []
21
+
22
+ extensions: []
23
+
24
+ extra_rdoc_files: []
25
+
26
+ files:
27
+ - .gitignore
28
+ - Gemfile
29
+ - README.rdoc
30
+ - README.ro.rdoc
31
+ - README.ru.rdoc
32
+ - Rakefile
33
+ - TODO
34
+ - lib/generators/zmeygo_sync/templates/config.yml
35
+ - lib/generators/zmeygo_sync/templates/script
36
+ - lib/generators/zmeygo_sync/zmeygo_sync_generator.rb
37
+ - lib/zmeygo_sync.rb
38
+ - lib/zmeygo_sync/base.rb
39
+ - lib/zmeygo_sync/cache.rb
40
+ - lib/zmeygo_sync/client.rb
41
+ - lib/zmeygo_sync/command.rb
42
+ - lib/zmeygo_sync/configuration.rb
43
+ - lib/zmeygo_sync/constant.rb
44
+ - lib/zmeygo_sync/i18n_backend.rb
45
+ - lib/zmeygo_sync/version.rb
46
+ - test/ext_i18n_test.rb
47
+ - test/test_helper.rb
48
+ - zmeygo_sync.gemspec
49
+ has_rdoc: true
50
+ homepage: http://zmeygo.com
51
+ licenses: []
52
+
53
+ post_install_message:
54
+ rdoc_options: []
55
+
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: "0"
70
+ requirements: []
71
+
72
+ rubyforge_project:
73
+ rubygems_version: 1.5.2
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: Zmeygo service syncronizer
77
+ test_files: []
78
+