voog-kit 0.1.8

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8e6be6c5d6e0b104cd4adefae47899ece91bad8b
4
+ data.tar.gz: 08cc5e8d94edff48ea1ce71bcec8b38ef004fca3
5
+ SHA512:
6
+ metadata.gz: 313f9abe7994f98dc7056742bb9f918f5144550c7fc25f61619e6a76fce810db231ffa221da6f7134517d53ea81edb56fcb259216914403d1cc2ecae34001de4
7
+ data.tar.gz: fd80df3755d5e201a4df59ce73f5290ee63b822ac831b7d5e19809b357411ff6c54f528f894ed40a70d0b4abb7fed94fb15bce50b6a87bfe7c0a2dd95d511130
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format documentation
3
+ --fail-fast
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in voog-kit.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Priit Haamer
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,142 @@
1
+ # Voog Developer Toolkit
2
+
3
+ The Voog Designer Toolkit is a simple Ruby script that simplifies the editing
4
+ of [Voog site](http://www.voog.com) templates. It acts as a push-pull mechanism that allows you to
5
+ fetch all layout files, work on them locally and upload them without having to
6
+ use the browser-based code editor.
7
+
8
+ ## Installation
9
+
10
+ Install the Voog toolkit gem:
11
+
12
+ ```bash
13
+ $ gem install voog-kit
14
+ ```
15
+
16
+ This installs the main tool, `kit`, which is added to your system's $PATH, which
17
+ means it can be run from anywhere in your system.
18
+
19
+ If you want to explicitly use latest version of the [Voog API client](https://github.com/Edicy/voog.rb):
20
+
21
+ ```bash
22
+ $ git pull https://github.com/Edicy/voog.rb voog-api
23
+ $ cd voog-api
24
+ $ bundle install
25
+ $ rake install
26
+ ```
27
+
28
+ ## Basic commands
29
+
30
+ * `init` - Initializes the local folder structure and files for a site
31
+ * `manifest` - Generates a `manifest.json` file from the site's layout and asset files
32
+ * `check` - Cross-checks the generated manifest to your local files to see if anything is missing
33
+ * `pull` - Fetches the layout and layout asset files for the given site
34
+ * `push` - Synchronizes your local changes with Voog
35
+ * `watch` - Watches for file changes in the current directory
36
+ * `help` - Shows a list of commands or help for one command
37
+
38
+ Most commands need to know your site's URL and you personal API token to properly authorize all
39
+ requests. For this you can either provide them with `--token/-t` and `--host/-h`
40
+ flags, e.g `kit pull -t afcf30182aecfc8155d390d7d4552d14 -h mysite.voog.com`. If there's a '.voog' file
41
+ present in the current folder, it takes the options from there.
42
+
43
+ There's also a `--site/-s` argument that is used to choose a configuration block from the `.voog` file.
44
+
45
+ Example `.voog` file:
46
+
47
+ ```
48
+ [site1]
49
+ host=mysite.voog.com
50
+ api_token=afcf30182aecfc8155d390d7d4552d14
51
+ [site2]
52
+ host=site2.customdomain.co
53
+ api_token=5d390d7d4552d14afcf30182aecfc815
54
+ ```
55
+
56
+ To choose the second block, you can simply use `kit pull -s site2` or `kit pull --site=site2`.
57
+ If the site is not provided, **kit** will use the first block defined in the file.
58
+ When you provide the host, token and block name, it is then written to the configuration file, overwriting
59
+ any identically named blocks or creating a new one, if necessary.
60
+
61
+ If the configuration file isn't present and you provide the token, hostname and site name manually when invoking a
62
+ command, the file is then generated and the options are stored within so you don't have to provide them
63
+ later.
64
+
65
+ ### init
66
+
67
+ This command either initializes an empty folder structure via `kit init empty`, clones the file and folder
68
+ structure of the Pripyat design (essentially a design boilerplate) via `kit init new` or uses the provided
69
+ hostname and API token to download existing layout files from the given site via just `kit init`.
70
+
71
+ ### manifest
72
+
73
+ The manifest file is probably the most important file in the layout file structure. It holds metadata for each
74
+ and every file which ensures that all layout names and asset types are correct when pushing or pulling files.
75
+ `kit manifest` on its own generates a manifest from all current local files. As this is done purely from file
76
+ names, some generated data might be incorrect and, as such, may need manual correction.
77
+
78
+ If you're generating a
79
+ manifest for a site that already has layout files, it would be better to use the `--remote` flag to use remote
80
+ data instead. This takes the layout titles and asset content types that are already saved in Voog and mirrors
81
+ them in the manifest.
82
+
83
+ ### pull
84
+
85
+ `kit pull` downloads all files from the site provided via the hostname and api_token options (or from the .voog
86
+ file). This overwrites all existing identically named local files.
87
+
88
+ By giving filenames or layout/component titles as arguments to `kit pull`, it instead downloads only those (and,
89
+ again, overwrites current local files). For example, `kit pull shadow.png MainMenu` would download the file *images/shadow.png*
90
+ and the *MainMenu* component.
91
+
92
+ ### push
93
+
94
+ `kit push` is the counterpart to `pull`. This takes the provided files or folders and uploads them to the provided
95
+ site, overwriting existing files. Although `pull` searches by filename, `push` arguments need to be local file paths.
96
+ For example, `kit push images/shadow.png layouts/mainmenu.tpl` works, `kit push shadow.png MainMenu` does not.
97
+
98
+ ### watch
99
+
100
+ This command starts a watcher that monitors the current folder and its subfolders and triggers `kit push` every time
101
+ a file changes. This is most useful for styling your site as all style changes are instantly uploaded and visible in
102
+ the browser.
103
+
104
+ `watch` also looks for newly created files and file removals, updates the manifest accordingly and triggers `kit push`.
105
+
106
+ ### help
107
+
108
+ This command shows helpful information about the tool or its subcommands. Invoking `kit help` shows a list of possible
109
+ options and commands with a brief description. `kit help <command>` shows information about that command.
110
+
111
+ ### Sample local folder structure
112
+
113
+ ```
114
+ ./
115
+ assets/
116
+ custom_font.woff
117
+ components/
118
+ mainmenu.tpl
119
+ sidebar.tpl
120
+ footer.tpl
121
+ images/
122
+ background.jpg
123
+ javascripts/
124
+ custom_script.js
125
+ spinner.js
126
+ layouts/
127
+ front_page.tpl
128
+ blog.tpl
129
+ products.tpl
130
+ stylesheets/
131
+ style.css
132
+ .voog
133
+ manifest.json
134
+ ```
135
+
136
+ ## Contributing
137
+
138
+ 1. Fork it
139
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
140
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
141
+ 4. Push to the branch (`git push origin my-new-feature`)
142
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/kit ADDED
@@ -0,0 +1,212 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # TODO: Not needed after bundled as gem
4
+ require 'guard'
5
+ require 'gli'
6
+
7
+ $LOAD_PATH << File.expand_path('../lib', File.dirname(__FILE__))
8
+ require 'json'
9
+
10
+ require 'voog/dtk'
11
+ require 'voog/dtk/guard'
12
+ require 'voog/dtk/filemanager'
13
+ require 'voog/dtk/notifier'
14
+ require 'voog_api'
15
+
16
+ include GLI::App
17
+
18
+ sort_help :manually
19
+
20
+ program_desc 'A tool that manages uploading and downloading Voog layout files'
21
+
22
+ debug_args = [:debug, { negatable: false, default_value: false, desc: 'Show additional information on exceptions' }]
23
+ verbose_args = [:verbose, { negatable: false, default_value: false, desc: 'Show additional information while running' }]
24
+ silent_args = [:silent, { default_value: false, negatable: false, desc: 'Hide all information text while running' }]
25
+ hostname_args = [:h, :host, :hostname, { desc: 'Provide a hostname', arg_name: :HOST }]
26
+ api_token_args = [:t, :token, :api_token, { desc: 'Provide an API token', arg_name: :API_TOKEN }]
27
+ site_args = [:s, :site, { arg_name: :SITE, default_value: nil, desc: 'Specify which site block to use when parsing the .voog file' }]
28
+
29
+ flag *hostname_args
30
+ flag *api_token_args
31
+ flag *site_args
32
+
33
+ switch *debug_args
34
+ switch *verbose_args
35
+ switch *silent_args
36
+ version Voog::Dtk::VERSION
37
+
38
+ desc 'Initializes the local folder structure and files for a site'
39
+ long_desc "The init command takes a hostname and an api token
40
+ as arguments, fetches the structure of the site and
41
+ recreates it locally in the same folder the command
42
+ was evoked in.\n
43
+ If the hostname and/or api-token aren't provided via command-line
44
+ arguments, the tool looks for a .voog file in the current working
45
+ directory that has those. See the readme for more information
46
+ (http://github.com/Edicy/voog-kit)"
47
+ command :init do |c|
48
+ c.switch *debug_args
49
+ c.switch *verbose_args
50
+ c.switch *silent_args
51
+ c.flag *hostname_args
52
+ c.flag *api_token_args
53
+ c.flag *site_args
54
+ c.action do |global_options, options, args|
55
+ @filemanager.create_folders
56
+ @filemanager.create_files
57
+ end
58
+
59
+ c.command :empty do |e|
60
+ e.action do |e|
61
+ Voog::Dtk.write_config('','',false)
62
+ @filemanager.create_folders
63
+ end
64
+ end
65
+
66
+ c.command :new do |n|
67
+ n.action do |n|
68
+ @filemanager.fetch_boilerplate
69
+ end
70
+ end
71
+ end
72
+
73
+ desc 'Looks for missing files and folders'
74
+ command :check do |c|
75
+ c.switch *debug_args
76
+ c.switch *verbose_args
77
+ c.switch *silent_args
78
+ c.flag *hostname_args
79
+ c.flag *api_token_args
80
+ c.flag *site_args
81
+ c.action do |global_options, options, args|
82
+ @filemanager.check
83
+ end
84
+ end
85
+
86
+ desc 'Fetches the layout and layout asset files for the given site'
87
+ long_desc 'If no arguments are provided, the \'pull\' command fetches all
88
+ layout files and layout assets and (re-)generates a manifest file.
89
+ If filenames are provided, it fetches only those and updates the
90
+ manifest with only those files. The provided names can be either
91
+ filenames or layout/component titles.'
92
+ command :pull do |c|
93
+ c.switch *debug_args
94
+ c.switch *verbose_args
95
+ c.switch *silent_args
96
+ c.flag *hostname_args
97
+ c.flag *api_token_args
98
+ c.flag *site_args
99
+ c.action do |global_options, options, args|
100
+ unless args.empty? # if filenames are given, pull specified files and generate new manifest
101
+ @filemanager.pull_files(args)
102
+ else # otherwise pull everything and generate new manifest
103
+ @filemanager.create_folders
104
+ @filemanager.create_files
105
+ @filemanager.generate_remote_manifest
106
+ end
107
+ end
108
+ end
109
+
110
+ desc 'Updates remote files with local changes'
111
+ long_desc "The 'push' command takes the space-separated list of filenames and
112
+ uploads them, if possible, to Voog. When uploading layout files (layouts
113
+ or components), the command looks for the manifest.json file to find which
114
+ files correspond to which remote layouts."
115
+ command :push do |c|
116
+ c.switch *debug_args
117
+ c.switch *verbose_args
118
+ c.switch *silent_args
119
+ c.flag *hostname_args
120
+ c.flag *api_token_args
121
+ c.flag *site_args
122
+ c.action do |global_options, options, args|
123
+ @filemanager.upload_files args
124
+ end
125
+ end
126
+
127
+ desc "Generates a manifest.json file from the site's layout and asset files."
128
+ long_desc "This looks through the current directory's subdirectories and files
129
+ within them to compile a 'manifest.json' file. This is used for keeping
130
+ metadata about layout files that can't easily be attached to files
131
+ themselves. When creating the manifest, you might have to manually
132
+ edit it to correspond to possible remote differences. When invoking the
133
+ command with the --remote flag, the manifest is instead generated from
134
+ remote files which, again, might not correspond to your local file structure."
135
+ command :manifest do |c|
136
+ c.switch *debug_args
137
+ c.switch *verbose_args
138
+ c.switch *silent_args
139
+ c.flag *hostname_args
140
+ c.flag *api_token_args
141
+ c.flag *site_args
142
+ c.switch(
143
+ [:r, :remote],
144
+ default_value: false,
145
+ negatable: false,
146
+ desc: 'generate manifest from remote files'
147
+ )
148
+ c.action do |global_options, options, args|
149
+ if options.fetch(:remote, @config[:remote])
150
+ @filemanager.generate_remote_manifest
151
+ else
152
+ @filemanager.generate_local_manifest
153
+ end
154
+ end
155
+ end
156
+
157
+ desc 'Watches for file changes and pushes them automatically'
158
+ command :watch do |c|
159
+ c.switch *debug_args
160
+ c.switch *verbose_args
161
+ c.switch *silent_args
162
+ c.flag *hostname_args
163
+ c.flag *api_token_args
164
+ c.flag *site_args
165
+ c.action do |global_options, options, args|
166
+ Voog::Dtk::Guuard.new(@filemanager).run
167
+ sleep 0.5 while ::Guard.running
168
+ end
169
+ end
170
+
171
+ pre do |global, command, options, args|
172
+ @config_block = global.fetch(:site, nil) || options.fetch(:site, nil)
173
+ @debug = global.fetch(:debug, false) || options.fetch(:debug, false)
174
+
175
+ silent = global.fetch(:silent, false) || options.fetch(:silent, false)
176
+ verbose = global.fetch(:verbose, false) || options.fetch(:verbose, false)
177
+
178
+ @notifier = Voog::Dtk::Notifier.new($stderr, silent)
179
+
180
+ host = global.fetch(:host, nil) || options.fetch(:host, nil)
181
+ api_token = global.fetch(:token, nil) || options.fetch(:token, nil)
182
+
183
+ if host && api_token && @config_block
184
+ Voog::Dtk.write_config(host, api_token, @config_block)
185
+ end
186
+
187
+ @config = Voog::Dtk.read_config @config_block
188
+
189
+ if Voog::Dtk::config_exists? || Voog::Dtk::global_config_exists?
190
+ unless [:new, :empty, :check].include? command.name
191
+ fail 'Hostname not found from arguments or from configuration file'.red unless host || @config[:host]
192
+ fail 'API token not found from arguments or from configuration file'.red unless api_token || @config[:api_token]
193
+ end
194
+ else
195
+ unless [:new, :empty, :check].include? command.name
196
+ fail 'Configuration file not found!'.red unless host && api_token
197
+ end
198
+ end
199
+
200
+ host ||= @config[:host]
201
+ api_token ||= @config[:api_token]
202
+
203
+ client = Voog::Client.new(host, api_token)
204
+ @filemanager = Voog::Dtk::FileManager.new(client, verbose, silent)
205
+ end
206
+
207
+ on_error do |exception|
208
+ Voog::Dtk.handle_exception(exception, @debug, @notifier)
209
+ false
210
+ end
211
+
212
+ exit run(ARGV)