urturn-cli 0.5.1

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/.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/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in webdoc-cli.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Olivier Amblet
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.md ADDED
@@ -0,0 +1,12 @@
1
+ # Develop and Deploy Webdoc Expression
2
+
3
+ ## Build and install the command line tool
4
+
5
+ You need to install webdoc command-line tool, a wrapper around the webdoc REST API to develop expression. Both are considered experimental.
6
+
7
+ git clone
8
+ cd webdoc-cli
9
+ gem build webdoc-cli.gemspec
10
+ gem install webdoc-cli-x.y.z.gem
11
+
12
+ Have a look at http://dev-wd.webdoc.com/docs#tab_expression to learn more.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
data/bin/urturn ADDED
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'gli'
4
+ require 'webdoc-cli'
5
+
6
+
7
+ include GLI::App
8
+
9
+ program_desc "Command Line to access Webdoc API"
10
+
11
+ flag [:h, :host], :default_value => 'w:d@dev-wd.webdoc.com'
12
+
13
+ pre do |global_options, command, options, args|
14
+ Webdoc::Cli.host = global_options[:host]
15
+ @client = Webdoc::Cli::ExpressionRestClient.new
16
+ end
17
+
18
+ desc "Create a new expression"
19
+ command 'expression:new' do |c|
20
+ c.action do |global_options,options,args|
21
+ name = args[0]
22
+ if name.nil?
23
+ Webdoc::Cli.cmd.say "Usage: webdoc expression:new NAME"
24
+ else
25
+ @client.create name
26
+ end
27
+ end
28
+ end
29
+
30
+ desc "Deploy a new version of your expression"
31
+ command 'expression:deploy' do |c|
32
+ c.action do |global_options,options,args|
33
+ path = (args.count > 0 ? args[0] : '.')
34
+ @client.deploy path
35
+ end
36
+ end
37
+
38
+
39
+ desc "Show an expression list"
40
+ command 'expression:list' do |c|
41
+ c.action do |global_options,options,args|
42
+ @client.list
43
+ end
44
+ end
45
+
46
+ desc "Show an expression details"
47
+ command 'expression:show' do |c|
48
+ c.action do |global_options,options,args|
49
+ name = args[0]
50
+ if name.nil?
51
+ Webdoc::Cli.cmd.say "Usage: webdoc expression:show NAME"
52
+ else
53
+ @client.show name
54
+ end
55
+ end
56
+ end
57
+
58
+ desc "Migrate document belongins to your expressions"
59
+ command 'expression:migrate' do |c|
60
+ c.action do |global_options,options,args|
61
+ name, v0, v1 = args[0..2]
62
+ if v1.nil?
63
+ Webdoc::Cli.cmd.say "Usage: webdoc expression:migrate NAME V0 V1"
64
+ Webdoc::Cli.cmd.say " NAME expression system name"
65
+ Webdoc::Cli.cmd.say " V0 document using this version will be migrated"
66
+ Webdoc::Cli.cmd.say " Accepted format: ~1, ~1.2, 1.0.0, 1.2.1"
67
+ Webdoc::Cli.cmd.say " V1 expression version to use for all documents using V0"
68
+ Webdoc::Cli.cmd.say " Accepted format: 1.2.2"
69
+ Webdoc::Cli.cmd.say "\nExamples:"
70
+ Webdoc::Cli.cmd.say "Migrate all document using expression hello_world between version 1.1.0 and 1.1.7 to version 1.1.8"
71
+ Webdoc::Cli.cmd.say " $ webdoc expression migrate hello_world '~1.1' '1.1.8'"
72
+ Webdoc::Cli.cmd.say "Migrate all document using expression hello_world at version 1.1.6 to version 1.1.8"
73
+ Webdoc::Cli.cmd.say " $ webdoc expression migrate hello_world '1.1.6' '1.1.8'"
74
+ else
75
+ @client.migrate name, v0, v1
76
+ end
77
+ end
78
+ end
79
+
80
+ desc "Remove authentication information"
81
+ command 'disconnect' do |c|
82
+ c.action do |global_options,options,args|
83
+ Webdoc::Cli.logout()
84
+ end
85
+ end
86
+
87
+ exit run(ARGV)
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Describe your expression styles below.
3
+ *
4
+ * /!\ IMPORTANT NOTE
5
+ * Do not use #id selector as your expression markup can be displayed multiple time
6
+ * in the same HTML page. Use .class selectors instead.
7
+ */
8
+
9
+
10
+ div.picture img {
11
+ width: 100%;
12
+ height: auto;
13
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * This file let you describe your javascript library. The convention
3
+ * is to puts all your code in the camelcased version of your expression system name.
4
+ *
5
+ * /!\ Your expression might be loaded multiple time in the
6
+ * same page so you should always limit your DOM queries to
7
+ * expression.getElement().
8
+ */
9
+
10
+ var <%= system_name.gsub(/\-/,'_').camelcase %> = function(expression){
11
+ this.expression = expression;
12
+ this.imageWrapper = expression.getElement().querySelector('div.picture');
13
+ this.nameWrapper = expression.getElement().querySelector('span.name');
14
+
15
+ var self = this;
16
+ // display the image.
17
+ this.expression.items.find('picture', function(imageResource) {
18
+ if(imageResource){
19
+ self.displayImage(imageResource);
20
+ }
21
+ });
22
+
23
+ // display the name.
24
+ this.expression.items.find('name', function(item) {
25
+ if(self.nameWrapper && item){
26
+ self.nameWrapper.innerHTML = item.value;
27
+ }
28
+ });
29
+ };
30
+
31
+ <%= system_name.gsub(/\-/,'_').camelcase %>.prototype.displayImage = function(imageResource) {
32
+ if (!this.img) {
33
+ this.img = document.createElement('img');
34
+ this.imageWrapper.appendChild(this.img);
35
+ var self = this;
36
+ this.img.addEventListener('load', function(event){
37
+ self.expression.container.autoResize();
38
+ });
39
+ }
40
+ this.img.src = imageResource.url;
41
+ };
@@ -0,0 +1,4 @@
1
+ /* style loaded only in editor. */
2
+ button.hidden {
3
+ display: none;
4
+ }
@@ -0,0 +1,50 @@
1
+ // Editor expression script
2
+
3
+ <%= system_name.gsub(/\-/,'_').camelcase %>.prototype.enableEditing = function() {
4
+ this.chooseImageButton = this.expression.getElement().querySelector('button.choose_image');
5
+ this.nameEditor = this.expression.getElement().querySelector('input.name_editor');
6
+
7
+ // open image dialog when user click on the button.
8
+ this.chooseImageButton.addEventListener('click', this.bindChooseImage());
9
+
10
+ // redefine displayImage() to open image dialog when user click on the image.
11
+ var playerDisplayImage = this.displayImage;
12
+ this.displayImage = function(imageResource) {
13
+ playerDisplayImage.call(this, imageResource);
14
+ this.editorDisplayImage();
15
+ }
16
+ if(this.img){
17
+ this.editorDisplayImage();
18
+ }
19
+
20
+ var self = this;
21
+ // display text in editor
22
+ this.expression.items.find('name', function(item){
23
+ if(item){
24
+ self.nameEditor.value = item.value;
25
+ }
26
+ });
27
+
28
+ // save text on post
29
+ this.expression.post(function(doPostCallback){
30
+ self.expression.items.save('name', {:value => self.nameEditor.value}, function(){
31
+ doPostCallback();
32
+ });
33
+ });
34
+ };
35
+
36
+ <%= system_name.gsub(/\-/,'_').camelcase %>.prototype.bindChooseImage = function() {
37
+ var self = this;
38
+ return function(event) {
39
+ self.expression.medias.imageDialog(function(imageResource) {
40
+ // Directly save image upon selection
41
+ self.expression.items.save('picture', imageResource);
42
+ self.displayImage(imageResource);
43
+ });
44
+ };
45
+ };
46
+
47
+ <%= system_name.gsub(/\-/,'_').camelcase %>.prototype.editorDisplayImage = function() {
48
+ this.img.addEventListener('click', this.bindChooseImage());
49
+ this.chooseImageButton.className += ' hidden';
50
+ }
@@ -0,0 +1,16 @@
1
+ <div class="picture">
2
+ <button class="choose_image">Choose a picture</button>
3
+ </div>
4
+ <p class="text">
5
+ Hello, My name is
6
+ <input type="text" class="name_editor" placeholder="Enter your name"/>
7
+ </p>
8
+
9
+ <script type="text/javascript">
10
+ // Bootstrap you expression editor
11
+ WD.Expression.ready(function(expression){
12
+ // Read more in test.js
13
+ var <%= system_name.gsub(/\-/,'_').camelcase(:lower) %>Instance = new <%= system_name.gsub(/\-/,'_').camelcase %>(expression);
14
+ <%= system_name.gsub(/\-/,'_').camelcase(:lower) %>Instance.enableEditing();
15
+ });
16
+ </script>
@@ -0,0 +1,21 @@
1
+ {
2
+ "title":"<%= system_name.titleize %>",
3
+ "system_name":"<%= system_name %>",
4
+ "version":"1.0.0",
5
+ "dependencies": [{
6
+ "type":"stylesheet",
7
+ "path":"<%= system_name %>.css"
8
+ },{
9
+ "type":"stylesheet",
10
+ "path":"<%= system_name %>_editor.css",
11
+ "context":"editor"
12
+ },{
13
+ "type":"javascript",
14
+ "path":"<%= system_name %>.js"
15
+ },{
16
+ "type":"javascript",
17
+ "path":"<%= system_name %>_editor.js",
18
+ "context":"editor"
19
+ }]
20
+
21
+ }
@@ -0,0 +1,10 @@
1
+ <div class="picture"></div>
2
+ <p class="text">Hello, My name is <span class="name"></span></p>
3
+
4
+ <script type="text/javascript">
5
+ // Bootstrap you expression editor
6
+ WD.Expression.ready(function(expression){
7
+ // Read more in test.js
8
+ var <%= system_name.gsub(/\-/,'_').camelcase(:lower) %>Instance = new <%= system_name.camelcase %>(expression);
9
+ });
10
+ </script>
@@ -0,0 +1,71 @@
1
+ module Webdoc::Cli
2
+ class << self
3
+
4
+ def logout
5
+ rc = Netrc.read()
6
+ rc.delete Webdoc::Cli.host
7
+ rc.save
8
+ Webdoc::Cli.cmd.say 'session information removed from .netrc'
9
+ end
10
+
11
+ def login
12
+ rc = Netrc.read
13
+ perform_authentication rc
14
+ end
15
+
16
+ # Use .netrc to manage authentication token.
17
+ #
18
+ # If a token is found, consider the client as authenticated
19
+ # if a 403 error is catched, it means that maybe the token has expired.
20
+ # In this case, give it a second try after a new authentication.
21
+ def authenticate_then(&block)
22
+ rc = Netrc.read()
23
+ user, pass = rc[Webdoc::Cli.host]
24
+ if pass
25
+ begin
26
+ do_action(user, pass, &block)
27
+ return
28
+ rescue RestClient::ExceptionWithResponse => error
29
+ # Let the unauthorized exception go on.
30
+ raise error if error.http_code != 403
31
+ end
32
+ end
33
+ user, pass = perform_authentication(rc)
34
+ do_action(user, pass, &block)
35
+ end
36
+
37
+ private
38
+ def do_action(user, pass, &block)
39
+ headers = {:cookies => {:_webdoc_session => pass}}
40
+ yield headers
41
+ end
42
+
43
+ def perform_authentication(rc)
44
+ authenticated = false
45
+ while !authenticated
46
+ Webdoc::Cli.cmd.say("<%= color('Webdoc Login', BOLD) %>")
47
+ email = Webdoc::Cli.cmd.ask("Email: "){ |q| q.validate = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i}
48
+ pass = Webdoc::Cli.cmd.ask("Password: ") { |q| q.echo = "*" }
49
+
50
+ Webdoc::Cli.cmd.say("Proceed to login")
51
+ begin
52
+ response = RestClient.post 'https://' + Webdoc::Cli.host + '/login.json',
53
+ 'user[email]' => email,
54
+ 'user[password]' => pass
55
+ raise "Unable to find authentication token" if response.cookies['_webdoc_session'].nil?
56
+ authenticated = true
57
+ rescue RestClient::ExceptionWithResponse => error
58
+ # catch only the unauthorized exception.
59
+ raise error if error.http_code != 403
60
+ Webdoc::Cli.cmd.say("<%= color('Invalid email/password', BOLD) %>")
61
+ end
62
+ end
63
+ # Handle succesful login
64
+ Webdoc::Cli.cmd.say("Logged in")
65
+ rc[Webdoc::Cli.host]= email, response.cookies['_webdoc_session']
66
+ rc.save
67
+ return email, response.cookies['_webdoc_session']
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,173 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ require 'rest-client'
4
+ require 'netrc'
5
+ require 'zip/zip'
6
+ require 'highline'
7
+ require 'json'
8
+ require 'active_support/core_ext/string/inflections'
9
+ require 'erb'
10
+ require 'pathname'
11
+
12
+
13
+ module Webdoc
14
+ module Cli
15
+ class ExpressionRestClient
16
+
17
+ def initialize
18
+ @resource = RestClient::Resource.new 'http://' + Webdoc::Cli.host
19
+ end
20
+
21
+ # Bundle and deploy the expression in the current directory
22
+ def deploy(path='.')
23
+ Webdoc::Cli.authenticate_then do |headers|
24
+ Webdoc::Cli.cmd.say "==> create bundle"
25
+ bundle(path) do |file|
26
+ request = RestClient::Request.new(
27
+ :method => :post,
28
+ :url => url('/expressions.json'),
29
+ :cookies => headers[:cookies],
30
+ :payload => {
31
+ :multipart => true,
32
+ :bundle => file
33
+ }
34
+ )
35
+ Webdoc::Cli.cmd.say "==> send bundle to #{Webdoc::Cli.host}"
36
+ response = handle_request_error { request.execute }
37
+ json = JSON.parse(response.strip)
38
+ system_name = json['expression']['system_name']
39
+ Webdoc::Cli.cmd.say "Expression #{@system_name} has been deployed on #{Webdoc::Cli.host}"
40
+ Webdoc::Cli.cmd.say "http://#{Webdoc::Cli.host}/#{username}/#{system_name}"
41
+ end
42
+ end
43
+ end
44
+
45
+ def create(system_name)
46
+ if File.exists?(system_name)
47
+ Webdoc::Cli.cmd.say "Error: already a folder named #{system_name}."
48
+ exit 1
49
+ end
50
+
51
+ binding = template_context system_name
52
+
53
+ Dir.mkdir(system_name)
54
+ root_template = File.join(File.dirname(__FILE__), '..', 'expression_template')
55
+ ['expression.json', 'editor.html', 'player.html', '__template__.js', '__template__.css', '__template___editor.js', '__template___editor.css'].each do |name|
56
+ template = ERB.new File.read(File.join(root_template, name + '.erb'))
57
+ File.open(File.join(system_name, name.gsub('__template__', system_name)), 'w') do |f|
58
+ f.write template.result(binding)
59
+ end
60
+ end
61
+ Webdoc::Cli.cmd.say "Expression #{system_name} has been created: #{File.join(Dir.pwd, system_name)}"
62
+ end
63
+
64
+ # Print the list of expressions manageable by the user.
65
+ def list
66
+ Webdoc::Cli.authenticate_then do |headers|
67
+ response = handle_request_error do
68
+ RestClient.get(url('/expressions.json'), headers)
69
+ end
70
+ list = JSON.parse(response.strip)['expressions']
71
+ if list.empty?
72
+ Webdoc::Cli.cmd.say "You manage no expression on #{Webdoc::Cli.host}"
73
+ else
74
+ Webdoc::Cli.cmd.say "Managed expression on #{Webdoc::Cli.host}:"
75
+ list.each do |exp|
76
+ Webdoc::Cli.cmd.say "- #{exp['system_name']} (#{exp['version']})"
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ # Migrate documents using expression with the given system_name
83
+ # from version v0 to version v1.
84
+ def migrate(system_name, v0, v1)
85
+ Webdoc::Cli.authenticate_then do |headers|
86
+ response = handle_request_error do
87
+ Webdoc::Cli.cmd.say "==> start migration of #{system_name} from #{v0} to #{v1} on #{Webdoc::Cli.host}"
88
+ RestClient.post(url("/#{username}/#{system_name}/migrate/#{v0}/#{v1}.json"), {}, headers)
89
+ end
90
+ message = JSON.parse(response.strip)['message']
91
+ Webdoc::Cli.cmd.say(message)
92
+ end
93
+ end
94
+
95
+ # Print the list of expressions
96
+ def show(system_name)
97
+ Webdoc::Cli.authenticate_then do |headers|
98
+ response = handle_request_error do
99
+ RestClient.get(url("/#{username}/#{system_name}/all.json"), headers)
100
+ end
101
+ list = JSON.parse(response.strip)['expressions']
102
+ list.each do |exp|
103
+ date = DateTime.parse(exp['created_at'])
104
+ date.strftime('%Y/%m/%d %H:%M')
105
+ Webdoc::Cli.cmd.say "- #{exp['system_name']} (#{exp['version']}): #{date.strftime('%Y/%m/%d %H:%M')}"
106
+ end
107
+ end
108
+ end
109
+
110
+ private
111
+ def username
112
+ return @username unless @username.nil?
113
+ Webdoc::Cli.authenticate_then do |headers|
114
+ response = handle_request_error do
115
+ RestClient.get(url("/users/current.json"), headers)
116
+ end
117
+ @username = JSON.parse(response.strip)['user']['username']
118
+ return @username
119
+ end
120
+ end
121
+
122
+ def url(path)
123
+ 'http://' + Webdoc::Cli.host + path
124
+ end
125
+
126
+ def handle_request_error
127
+ begin
128
+ return yield
129
+ rescue RestClient::Exception => error
130
+ Webdoc::Cli.cmd.say "Error (HTML CODE #{error.http_code})"
131
+ case error.http_code
132
+ when 422
133
+ errors = JSON.parse(error.response.strip)['errors']
134
+ errors.each do |msg|
135
+ Webdoc::Cli.cmd.say " - #{msg}"
136
+ end
137
+ else
138
+ Webdoc::Cli.cmd.say error.response
139
+ end
140
+ rescue => ex
141
+ Webdoc::Cli.cmd.say "Unexpected Error: #{ex.inspect}"
142
+ end
143
+ exit 1
144
+ end
145
+
146
+ # Create a bundle of the expression in the current
147
+ # directory and yield the resulting Zip file.
148
+ def bundle(expression_folder)
149
+ f = Tempfile.new('expression_bundle_')
150
+ exp_path = Pathname.new(expression_folder)
151
+ begin
152
+ Zip::ZipOutputStream.open(f.path) do |z|
153
+ Dir.glob(File.join(exp_path, '**/*.*')) do |path|
154
+ if(File.file?(path))
155
+ zip_path = Pathname.new(path).relative_path_from(exp_path)
156
+ z.put_next_entry(zip_path)
157
+ z.print File.read(path)
158
+ end
159
+ end
160
+ end
161
+ yield f
162
+ ensure
163
+ f.close
164
+ f.unlink
165
+ end
166
+ end
167
+
168
+ def template_context(system_name)
169
+ binding
170
+ end
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,5 @@
1
+ module Webdoc
2
+ module Cli
3
+ VERSION = "0.5.1"
4
+ end
5
+ end
data/lib/webdoc-cli.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'highline'
2
+
3
+ require "webdoc-cli/version"
4
+ require "webdoc-cli/authenticate"
5
+ require "webdoc-cli/expression_rest_client"
6
+
7
+ module Webdoc
8
+ module Cli
9
+ class << self
10
+ attr_accessor :host
11
+
12
+ def cmd
13
+ @cmd ||= HighLine.new
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/webdoc-cli/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Webdoc", "Olivier Amblet"]
6
+ gem.email = ["olivier.amblet@webdoc.com"]
7
+ gem.description = %q{Urturn Command Line}
8
+ gem.summary = %q{Access Urturn through command line}
9
+ gem.homepage = "http://www.urturn.com"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "urturn-cli"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Webdoc::Cli::VERSION
17
+
18
+ gem.add_dependency "gli"
19
+ gem.add_dependency "rest-client"
20
+ gem.add_dependency "netrc"
21
+ gem.add_dependency "rake"
22
+ gem.add_dependency "highline"
23
+ gem.add_dependency "rubyzip"
24
+ gem.add_dependency "json"
25
+ gem.add_dependency "activesupport"
26
+ end
metadata ADDED
@@ -0,0 +1,194 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: urturn-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Webdoc
9
+ - Olivier Amblet
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-12-21 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: gli
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: rest-client
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: netrc
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rake
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: highline
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :runtime
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rubyzip
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: json
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: activesupport
129
+ requirement: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ! '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ type: :runtime
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ description: Urturn Command Line
144
+ email:
145
+ - olivier.amblet@webdoc.com
146
+ executables:
147
+ - urturn
148
+ extensions: []
149
+ extra_rdoc_files: []
150
+ files:
151
+ - .gitignore
152
+ - Gemfile
153
+ - LICENSE
154
+ - README.md
155
+ - Rakefile
156
+ - bin/urturn
157
+ - lib/expression_template/__template__.css.erb
158
+ - lib/expression_template/__template__.js.erb
159
+ - lib/expression_template/__template___editor.css.erb
160
+ - lib/expression_template/__template___editor.js.erb
161
+ - lib/expression_template/editor.html.erb
162
+ - lib/expression_template/expression.json.erb
163
+ - lib/expression_template/player.html.erb
164
+ - lib/webdoc-cli.rb
165
+ - lib/webdoc-cli/authenticate.rb
166
+ - lib/webdoc-cli/expression_rest_client.rb
167
+ - lib/webdoc-cli/version.rb
168
+ - urturn-cli.gemspec
169
+ homepage: http://www.urturn.com
170
+ licenses: []
171
+ post_install_message:
172
+ rdoc_options: []
173
+ require_paths:
174
+ - lib
175
+ required_ruby_version: !ruby/object:Gem::Requirement
176
+ none: false
177
+ requirements:
178
+ - - ! '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ required_rubygems_version: !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ requirements: []
188
+ rubyforge_project:
189
+ rubygems_version: 1.8.24
190
+ signing_key:
191
+ specification_version: 3
192
+ summary: Access Urturn through command line
193
+ test_files: []
194
+ has_rdoc: