hackpad-cli 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11393a54a4eee8671b2f1408c718cae2acf0636a
4
- data.tar.gz: c8e34dc2fc56963f34fd9359d56567010571e5e1
3
+ metadata.gz: 8774385bd325fd9f7f74ec8e474ac4fdd046792a
4
+ data.tar.gz: f920f8ef31cb29a8c13a6dc526924f3e511a1008
5
5
  SHA512:
6
- metadata.gz: 3bdad090ea55e18a3919a8b284d73e30578ddb2624b0f1b156f72f9b83c3c7cde85cdd31fe1fe8bd6bd54ce34318c50466a594b2737cdae534477222a255df50
7
- data.tar.gz: 0efabd1139cea5ab5386f57f5d581631b497086c4d60b3623e886822efc61f2505ae71991f5d834fced5755ee8b2226daf30aa5d4d4cb7f8f4decfcd5637dfa5
6
+ metadata.gz: ea50d0b7e670b9f84d2db83602e14e5774b6aa0001fd076b56cd8410d4e41d10ff4a2c5ebaffb2aae26023cdcca6de55edf3dfe9860100331291736b1a2f9f57
7
+ data.tar.gz: 76318cb2d86cc38a35fa2da5b896b3b679fb8e61517709bd49fe6f761fca6106ac8c9c53bd4603df105aa98a09e5fa639e062a738a337d5ea9854cd31b698ebb
@@ -1 +1 @@
1
- 2.1.1
1
+ 2.2.1
@@ -1,6 +1,12 @@
1
1
  Hackpad-cli changelog
2
2
  =====================
3
3
 
4
+ v0.1.3 - wip
5
+ -------------------
6
+
7
+ - add command `add` for adding a new workspace
8
+ - refactor config management and move code to the configstruct gem
9
+
4
10
  v0.1.2 - 2014-05-27
5
11
  -------------------
6
12
 
data/Gemfile CHANGED
@@ -3,3 +3,4 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in hackpad-cli.gemspec
4
4
  gemspec
5
5
 
6
+ #gem 'configstruct', path: '../configstruct'
data/README.md CHANGED
@@ -42,6 +42,7 @@ Usage
42
42
 
43
43
  ```
44
44
  Commands:
45
+ hpcli add # Add a new workspace.
45
46
  hpcli default # change the default workspace.
46
47
  hpcli getnew # Downloads the new pads the are not cached yet (options: -u to show urls).
47
48
  hpcli help [COMMAND] # Describe available commands or one specific command
@@ -54,7 +55,7 @@ Commands:
54
55
  hpcli workspaces # Lists configurated hackpad workspaces.
55
56
 
56
57
  Options:
57
- -c, [--configdir=CONFIGDIR] # Path to the hackpad-cli directory to use.
58
+ -c, [--basedir=BASEDIR] # Path to the hackpad-cli directory to use.
58
59
  # Default: /home/mose/.hackpad-cli/
59
60
  -w, [--workspace=WORKSPACE] # Name of the workspace to use.
60
61
  # Default: default
@@ -76,7 +77,8 @@ Check the [Changelog](CHANGELOG.md) for past evolutions.
76
77
  - <s>display cached date in output</s>
77
78
  - <s>write proper tests</s>
78
79
  - for v0.2.0
79
- - clean the markdown generated by reverse_markdown
80
+ - <s>clean the markdown generated by reverse_markdown</s>
81
+ - <s>flood hackpad support to get some improvements done</s>
80
82
  - add a command for searching on local cache, in titles only or in body
81
83
  - elaborate a better search syntax so we can have and/or and strings
82
84
  - add commands for creating a new pad, linked to $EDITOR
@@ -1,11 +1,10 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'hackpad/cli/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.name = 'hackpad-cli'
8
- spec.version = Hackpad::Cli::VERSION
7
+ spec.version = File.read(File.expand_path('../CHANGELOG.md', __FILE__))[/([0-9]+\.[0-9]+\.[0-9]+)/]
9
8
  spec.authors = ['mose']
10
9
  spec.email = ['mose@mose.com']
11
10
  spec.summary = %q(CLI for hackpad browsing and editing.)
@@ -19,7 +18,8 @@ Gem::Specification.new do |spec|
19
18
  spec.require_paths = ['lib']
20
19
 
21
20
  spec.add_dependency 'thor'
22
- spec.add_dependency 'cliprompt', '~> 0.0.5'
21
+ spec.add_dependency 'configstruct', '~> 0.0.3'
22
+ spec.add_dependency 'cliprompt', '~> 0.1.0'
23
23
  spec.add_dependency 'paint'
24
24
  spec.add_dependency 'oauth'
25
25
  spec.add_dependency 'reverse_markdown'
@@ -3,6 +3,8 @@ require 'net/http'
3
3
  require 'json'
4
4
  require 'reverse_markdown'
5
5
 
6
+ require_relative '../../reverse_markdown/converters/head'
7
+
6
8
  module Hackpad
7
9
  module Cli
8
10
 
@@ -12,13 +14,9 @@ module Hackpad
12
14
  module Api
13
15
  module_function
14
16
 
15
- def prepare(config)
16
- consumer = OAuth::Consumer.new(
17
- config.client_id,
18
- config.secret,
19
- site: config.site
20
- )
21
- @token = OAuth::AccessToken.new consumer
17
+ def prepare(workspace)
18
+ @hackpad ||= OAuth::Consumer.new(workspace.client_id, workspace.secret, site: workspace.site)
19
+ @version = File.read(File.expand_path('../../../../CHANGELOG.md', __FILE__))[/([0-9]+\.[0-9]+\.[0-9]+)/]
22
20
  end
23
21
 
24
22
  def search(term, start = 0)
@@ -35,12 +33,12 @@ module Hackpad
35
33
 
36
34
  def read(id, ext)
37
35
  realext = (ext == 'md') ? 'html' : ext
38
- get "/api/1.0/pad/#{id}/content.#{realext}", false, (ext == 'md')
36
+ get "/api/1.0/pad/#{id}/content/latest.#{realext}", false, (ext == 'md')
39
37
  end
40
38
 
41
39
  def get(url, json = true, to_md = false)
42
- res = @token.get url, 'User-Agent' => "hackpad-cli v#{Hackpad::Cli::VERSION}"
43
- if res.is_a? Net::HTTPSuccess
40
+ res = @hackpad.request :get, url
41
+ if res.is_a? Net::HTTPOK
44
42
  if json
45
43
  JSON.parse(res.body)
46
44
  else
@@ -57,10 +55,11 @@ module Hackpad
57
55
 
58
56
  def cleanup_md(text)
59
57
  back = ReverseMarkdown.convert(text, github_flavored: true).strip
60
- back.sub!(/<head>.*<\/head>\n/m, '')
61
- back.gsub!(/-([^\n]+)\n\n -/m, "-\\1\n -")
62
- back.gsub!(/\n( )*-([^\n]+)\n?\n( )*-([^\n]+)\n?\n/m, "\n\\1-\\2\n\\3-\\4\n")
63
- back.gsub(/\n\n\*\*([^\*]+)\*\*\n\n/, "\n\n### \\1\n\n")
58
+ back.gsub!(/\n-\s*\n/m, "\n") # empty list items
59
+ back.gsub!(/\n\\\*\s*\n/m, "\n") # images are shown as \*
60
+ back.gsub!(/-([^\n]+)\n\n -/m, "-\\1\n -") # avoid extra blank lines in lists
61
+ back.gsub!(/\n( )*-([^\n]+)\n?\n( )*-([^\n]+)\n?\n/m, "\n\\1-\\2\n\\3-\\4\n") # another more generalist for lists
62
+ back.gsub(/\n\n?\*\*([^\*]+)\*\*\n\n?/, "\n\n### \\1\n\n") # transform isolated titles from bold to h3
64
63
  end
65
64
 
66
65
  end
@@ -1,6 +1,7 @@
1
1
  require 'paint'
2
2
 
3
3
  require_relative 'config'
4
+ require_relative 'workspace'
4
5
  require_relative 'api'
5
6
  require_relative 'store'
6
7
  require_relative 'pad'
@@ -15,13 +16,17 @@ module Hackpad
15
16
  def initialize(options, input = STDIN, output = STDOUT)
16
17
  @output = output
17
18
  @input = input
18
- @options = options
19
- @config = Config.new @options, input, output
20
- Store.prepare @config
21
- Api.prepare @config
22
- if @options[:plain] == true || @config.use_colors == false
19
+ @config = Config.new options, @input, @output
20
+ if options[:plain] == true || @config.use_colors == false
23
21
  Paint.mode = 0
24
22
  end
23
+ @workspace = Workspace.new({ basedir: File.join(@config.basedir, @config.workspace), name: @config.workspace }, @input, @output)
24
+ Store.prepare @config, @workspace
25
+ Api.prepare @workspace
26
+ end
27
+
28
+ def add
29
+ @workspace.clone.create
25
30
  end
26
31
 
27
32
  def workspaces
@@ -38,7 +43,7 @@ module Hackpad
38
43
  end
39
44
 
40
45
  def stats
41
- table 'Site', Paint[@config.site, :blue]
46
+ table 'Site', Paint[@workspace.site, :blue]
42
47
  table 'Cached Pads', Store.count_pads
43
48
  table 'Last Refresh', Store.last_refresh || 'not refreshed yet'
44
49
  end
@@ -52,7 +57,7 @@ module Hackpad
52
57
  end
53
58
 
54
59
  def list
55
- @output.puts Padlist.get_list(@options['refresh']).map { |pad|
60
+ @output.puts Padlist.get_list(@config.refresh).map { |pad|
56
61
  padline pad
57
62
  }
58
63
  end
@@ -74,7 +79,7 @@ module Hackpad
74
79
  pad.load 'txt'
75
80
  table 'Id', Paint[id, :bold]
76
81
  table 'Title', Paint[pad.title, :yellow]
77
- table 'URI', "#{@config.site}/#{id}"
82
+ table 'URI', "#{@workspace.site}/#{id}"
78
83
  table 'Chars', "#{pad.chars}"
79
84
  table 'Lines', "#{pad.lines}"
80
85
  table 'Guest Policy', "#{pad.guest_policy}"
@@ -91,7 +96,7 @@ module Hackpad
91
96
  private
92
97
 
93
98
  def padline(pad)
94
- "#{(@config.site + '/') if @options[:urls]}#{pad.id} - #{pad.title}"
99
+ "#{(@workspace.site + '/') if @config.urls}#{pad.id} - #{pad.title}"
95
100
  end
96
101
 
97
102
  def unescape(s)
@@ -107,7 +112,7 @@ module Hackpad
107
112
  end
108
113
 
109
114
  def id_or_url(id)
110
- "#{(@config.site + '/') if @options[:urls]}#{Paint[id, :bold]}"
115
+ "#{(@workspace.site + '/') if @config.urls}#{Paint[id, :bold]}"
111
116
  end
112
117
 
113
118
  end
@@ -1,65 +1,37 @@
1
- require 'ostruct'
2
1
  require 'cliprompt'
2
+ require 'configstruct'
3
3
 
4
4
  module Hackpad
5
5
  module Cli
6
- class Config < OpenStruct
6
+ class Config < ConfigStruct
7
7
 
8
8
  include Cliprompt
9
9
 
10
- def initialize(options = nil, input = STDIN, output = STDOUT)
11
- super(options)
12
- @@input = input
13
- @@output = output
14
- self.configdir ||= File.join(ENV['HOME'], '.hackpad-cli')
10
+ def set_defaults
11
+ super
15
12
  self.refresh ||= false
16
13
  self.urls ||= false
17
- self.output = output
18
- setio input, output
19
- patch_1
20
- addvalues 'config'
21
14
  self.workspace ||= 'default'
22
- self.workspacedir = File.join(configdir, workspace)
23
- addvalues 'workspace'
15
+ setio @input, @output
16
+ patch_1
24
17
  end
25
18
 
26
- def addvalues(type)
27
- dir = send("#{type}dir".to_sym)
28
- file = File.join(dir, 'config.yml')
29
- FileUtils.mkdir_p dir unless Dir.exist? dir
30
- send("setup_#{type}".to_sym, file) unless File.exist? file
31
- YAML.load_file(file).each do |k, v|
32
- new_ostruct_member(k)
33
- send("#{k}=", v)
34
- end
19
+ def setup
20
+ values = {}
21
+ output.puts Paint['Create a new hackpad-cli configuration:', :blue]
22
+ values['use_colors'] = guess 'HPCLI_COLORS', 'Do you want a colored output?', 'Yn'
23
+ values['workspace'] = guess 'HPCLI_WORKSPACE', 'What is the name of the default workspace?', 'default'
24
+ write values
35
25
  end
36
26
 
37
27
  def workspaces
38
- w = Dir.glob(File.join(configdir, '*', 'config.yml')).reduce([]) do |a, path|
28
+ w = Dir.glob(File.join(self.basedir, '*', 'config.yml')).reduce([]) do |a, path|
39
29
  a << OpenStruct.new(name: File.basename(File.dirname(path)), site: YAML.load_file(path)['site'])
40
30
  a
41
31
  end
42
32
  w.sort_by { |s| s.name }
43
33
  end
44
34
 
45
- def setup_config(file)
46
- values = {}
47
- output.puts Paint['Create a new hackpad-cli configuration:', :blue]
48
- values['use_colors'] = guess 'HPCLI_COLORS', 'Do you want a colored output?', 'Yn'
49
- values['workspace'] = guess 'HPCLI_WORKSPACE', 'What is the name of the default workspace?', 'default'
50
- write(file, values)
51
- end
52
-
53
- def setup_workspace(file)
54
- values = {}
55
- output.puts Paint['Workspace configuration.', :blue]
56
- output.puts Paint['Gather your information from https://<workspace>.hackpad.com/ep/account/settings/', :bold]
57
- values['client_id'] = guess 'HPCLI_CLIENTID', 'What is your Client ID?'
58
- values['secret'] = guess 'HPCLI_SECRET', 'What is your Secret Key?'
59
- values['site'] = guess('HPCLI_URL', 'What is the URI of your workspace? (ex. https://xxx.hackapd.com)').gsub(/\/$/, '')
60
- write(file, values)
61
- end
62
-
63
35
  def change_default
64
36
  values = {}
65
37
  values['use_colors'] = use_colors
@@ -67,19 +39,12 @@ module Hackpad
67
39
  choices: workspaces.map(&:name),
68
40
  default: workspace,
69
41
  aslist: true
70
- file = File.join(configdir, 'config.yml')
71
- write(file, values)
42
+ write values
72
43
  end
73
44
 
74
45
  def patch_1
75
- if File.exist? File.join(configdir, "#{workspace}.yml")
76
- FileUtils.mv File.join(configdir, "#{workspace}.yml"), File.join(configdir, workspace, 'config.yml')
77
- end
78
- end
79
-
80
- def write(file, values)
81
- File.open(file, 'w') do |f|
82
- f.write YAML.dump(values)
46
+ if File.exist? File.join(basedir, "#{workspace}.yml")
47
+ FileUtils.mv File.join(basedir, "#{workspace}.yml"), File.join(basedir, workspace, 'config.yml')
83
48
  end
84
49
  end
85
50
 
@@ -1,7 +1,6 @@
1
1
  require 'thor'
2
2
  require 'yaml'
3
3
  require_relative 'client'
4
- require_relative 'version'
5
4
 
6
5
  module Hackpad
7
6
  module Cli
@@ -25,7 +24,7 @@ module Hackpad
25
24
  }
26
25
  ]
27
26
 
28
- class_option :configdir,
27
+ class_option :basedir,
29
28
  aliases: '-c',
30
29
  default: File.join(ENV['HOME'], '.hackpad-cli/'),
31
30
  desc: 'Path to the hackpad-cli directory to use.'
@@ -48,6 +47,11 @@ module Hackpad
48
47
  Hackpad::Cli::Client.new(options).workspaces
49
48
  end
50
49
 
50
+ desc 'add', 'Add a new workspace.'
51
+ def add
52
+ Hackpad::Cli::Client.new(options).add
53
+ end
54
+
51
55
  desc 'default', 'change the default workspace.'
52
56
  def default
53
57
  Hackpad::Cli::Client.new(options).default
@@ -90,7 +94,7 @@ module Hackpad
90
94
 
91
95
  desc 'version', 'Displays the hackpad-cli version.'
92
96
  def version
93
- puts Hackpad::Cli::VERSION
97
+ puts File.read(File.expand_path('../../../../CHANGELOG.md', __FILE__))[/([0-9]+\.[0-9]+\.[0-9]+)/]
94
98
  end
95
99
 
96
100
  end
@@ -9,10 +9,10 @@ module Hackpad
9
9
  module Store
10
10
  module_function
11
11
 
12
- def prepare(config)
12
+ def prepare(config, workspace)
13
13
  @refresh = config.refresh
14
- @configdir = config.configdir
15
- @pads_dir = File.join(config.workspacedir, 'pads')
14
+ @configdir = config.basedir
15
+ @pads_dir = File.join(workspace.basedir, 'pads')
16
16
  @list_cache = File.join(@pads_dir, 'padlist')
17
17
  prepare_dirs @pads_dir
18
18
  end
@@ -0,0 +1,37 @@
1
+ require 'cliprompt'
2
+ require 'configstruct'
3
+
4
+ module Hackpad
5
+ module Cli
6
+ class Workspace < ConfigStruct
7
+
8
+ include Cliprompt
9
+
10
+ def set_defaults
11
+ super
12
+ self.name ||= 'default'
13
+ self.url ||= 'http://hackpad.com'
14
+ setio @input, @output
15
+ end
16
+
17
+ def setup
18
+ values = {}
19
+ puts Paint['Workspace configuration.', :blue]
20
+ puts Paint['Gather your information from https://<workspace>.hackpad.com/ep/account/settings/', :bold]
21
+ values['client_id'] = guess 'HPCLI_CLIENTID', 'What is your Client ID?'
22
+ values['secret'] = guess 'HPCLI_SECRET', 'What is your Secret Key?'
23
+ values['site'] = guess('HPCLI_URL', 'What is the URI of your workspace? (ex. https://xxx.hackpad.com)').gsub(/\/$/, '')
24
+ write values
25
+ end
26
+
27
+ def create
28
+ self.name = ask "What is the name of the new workspace?"
29
+ self.basedir = File.expand_path("../#{self.name}", self.basedir)
30
+ self.basefile = File.join(self.basedir, 'config.yml')
31
+ prepare_dirs
32
+ setup
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ module ReverseMarkdown
2
+ module Converters
3
+ class Head < Base
4
+
5
+ def convert(node)
6
+ ''
7
+ end
8
+
9
+ end
10
+ register :head, Head.new
11
+ end
12
+ end
File without changes
File without changes
@@ -70,7 +70,7 @@ describe Hackpad::Cli::Api do
70
70
  .with(headers: {
71
71
  'Accept' => '*/*',
72
72
  'Authorization' => /OAuth oauth_consumer_key="123"/,
73
- 'User-Agent' => /hackpad-cli v#{Hackpad::Cli::VERSION}/
73
+ 'User-Agent' => /hackpad-cli v/
74
74
  })
75
75
  .to_return(status: 200, body: '{"some": "result"}')
76
76
  expect(Hackpad::Cli::Api.get('/api/1.0/xxx')).to eq('some' => 'result')
@@ -82,7 +82,7 @@ describe Hackpad::Cli::Api do
82
82
  .with(headers: {
83
83
  'Accept' => '*/*',
84
84
  'Authorization' => /OAuth oauth_consumer_key="123"/,
85
- 'User-Agent' => /hackpad-cli v#{Hackpad::Cli::VERSION}/
85
+ 'User-Agent' => /hackpad-cli v/
86
86
  })
87
87
  .to_return(status: 404, body: '{"some": "result"}')
88
88
  expect { Hackpad::Cli::Api.get('/api/1.0/xxx') }
@@ -11,7 +11,7 @@ describe Hackpad::Cli::Client do
11
11
  let(:workspacefile) { File.join(workspacedir, 'config.yml') }
12
12
  let(:configvars) { { 'use_colors' => true, 'workspace' => 'default' } }
13
13
  let(:workspacevars) { { 'client_id' => '123', 'secret' => 'toto', 'site' => 'http://example.com' } }
14
- let(:options) { { configdir: configdir, workspace: 'default' } }
14
+ let(:options) { { basedir: configdir, workspace: 'default' } }
15
15
  let(:format) { "%-20s %s\n" }
16
16
  let(:input) { StringIO.new }
17
17
  let(:output) { StringIO.new }
@@ -49,9 +49,8 @@ describe Hackpad::Cli::Client do
49
49
  after { FileUtils.rm workspacefile2 if File.exist?(workspacefile2) }
50
50
 
51
51
  it do
52
- expect(output).to receive(:printf).with(format, '> default', 'http://example.com')
53
- expect(output).to receive(:printf).with(format, 'default2', 'http://2.example.com')
54
52
  client.workspaces
53
+ expect(output.string).to eq "> default http://example.com\ndefault2 http://2.example.com\n"
55
54
  end
56
55
  end
57
56
 
@@ -66,8 +65,8 @@ describe Hackpad::Cli::Client do
66
65
  after { FileUtils.rm workspacefile2 if File.exist?(workspacefile2) }
67
66
 
68
67
  it do
69
- expect(output).to receive(:print).with("What workspace do you want to use as default from now on? \n> 0 default\n 1 default2\nChoose a number: [0] ")
70
68
  client.default
69
+ expect(output.string).to eq "What workspace do you want to use as default from now on? \n> 0 default\n 1 default2\nChoose a number: [0] "
71
70
  expect(YAML.load_file(configfile)['workspace']).to eq 'default2'
72
71
  end
73
72
  end
@@ -79,10 +78,8 @@ describe Hackpad::Cli::Client do
79
78
  before { Hackpad::Cli::Store.stub(:last_refresh).and_return(timestamp) }
80
79
  let(:client) { Hackpad::Cli::Client.new(options, input, output) }
81
80
  it do
82
- expect(output).to receive(:printf).with(format, 'Site', Paint[workspacevars['site'], :blue])
83
- expect(output).to receive(:printf).with(format, 'Cached Pads', 12)
84
- expect(output).to receive(:printf).with(format, 'Last Refresh', timestamp)
85
81
  client.stats
82
+ expect(output.string).to eq "Site #{Paint[workspacevars['site'], :blue]}\nCached Pads 12\nLast Refresh #{timestamp}\n"
86
83
  end
87
84
  end
88
85
 
@@ -111,9 +108,8 @@ describe Hackpad::Cli::Client do
111
108
  context 'when options sets urls to true,' do
112
109
  let(:client) { Hackpad::Cli::Client.new(options.merge(urls: true), input, output) }
113
110
  it do
114
- expect(output).to receive(:puts).with("#{workspacevars['site']}/#{Paint['xxxxxx', :bold]} - #{Paint['xtitle', :yellow]}")
115
- expect(output).to receive(:puts).with(" context #{Paint['x', :cyan, :bold]} context")
116
111
  client.search 'xxx'
112
+ expect(output.string).to eq "#{workspacevars['site']}/#{Paint['xxxxxx', :bold]} - #{Paint['xtitle', :yellow]}\n context #{Paint['x', :cyan, :bold]} context\n"
117
113
  end
118
114
  end
119
115
  end
@@ -197,7 +193,7 @@ describe Hackpad::Cli::Client do
197
193
  before { pad.stub(:lines).and_return(2) }
198
194
  before { pad.stub(:guest_policy).and_return('open') }
199
195
  before { pad.stub(:moderated).and_return('false') }
200
- before { pad.stub(:cached_at).and_return }
196
+ before { pad.stub(:cached_at).and_return('unknown') }
201
197
  it do
202
198
  expect(output).to receive(:printf).with(format, 'Id', Paint["123", :bold])
203
199
  expect(output).to receive(:printf).with(format, 'Title', Paint['title1', :yellow])
@@ -208,6 +204,7 @@ describe Hackpad::Cli::Client do
208
204
  expect(output).to receive(:printf).with(format, 'Moderated', 'false')
209
205
  expect(output).to receive(:printf).with(format, 'Cached', 'unknown')
210
206
  client.info '123'
207
+
211
208
  end
212
209
  end
213
210
 
@@ -7,50 +7,43 @@ describe Hackpad::Cli::Config do
7
7
 
8
8
  let(:configdir) { File.expand_path('../../../../files', __FILE__) }
9
9
  let(:configfile) { File.join(configdir, 'config.yml') }
10
- let(:workspacedir) { File.join(configdir, 'default') }
11
- let(:workspacefile) { File.join(workspacedir, 'config.yml') }
12
- let(:options) { { configdir: configdir, workspace: 'default' } }
10
+ let(:options) { { basedir: configdir, workspace: 'default' } }
13
11
  let(:input) { StringIO.new }
14
12
  let(:output) { StringIO.new }
15
13
 
16
14
  before { FileUtils.mkdir_p configdir unless Dir.exist?(configdir) }
17
- before { FileUtils.mkdir_p workspacedir unless Dir.exist?(workspacedir) }
18
-
19
15
  after { FileUtils.rm configfile if File.exist?(configfile) }
20
- after { FileUtils.rm workspacefile if File.exist?(workspacefile) }
21
16
 
22
17
  describe '.new' do
23
18
  context 'when there is already config files created,' do
24
19
  let(:configvars) { { 'use_colors' => true, 'workspace' => 'default' } }
25
- let(:workspacevars) { { 'client_id' => '123', 'secret' => 'toto', 'site' => 'http://example.com' } }
26
20
  before { File.open(configfile, 'w') { |f| f.puts YAML.dump(configvars) } }
27
- before { File.open(workspacefile, 'w') { |f| f.puts YAML.dump(workspacevars) } }
28
21
  let(:config) { Hackpad::Cli::Config.new(options) }
29
22
  it {
30
- expect(config.secret).to eq 'toto'
31
- expect(config.site).to eq 'http://example.com'
23
+ expect(config.workspace).to eq 'default'
32
24
  }
33
25
  end
34
26
  context 'when there is no config files created,' do
35
- before { input.stub(:gets).and_return('y', 'default', '123', 'toto','http://example.com') }
27
+ before { input.stub(:gets).and_return('y', 'default') }
36
28
  let(:config) { Hackpad::Cli::Config.new(options, input, output) }
37
29
  it {
38
- expect(config.secret).to eq 'toto'
39
- expect(config.site).to eq 'http://example.com'
30
+ expect(config.workspace).to eq 'default'
40
31
  }
41
32
  end
42
33
  end
43
34
 
44
35
  describe '.patch_1' do
45
36
  let(:oldconfigfile) { File.join(configdir, 'default.yml') }
37
+ let(:workspacefile) { File.join(configdir, 'default', 'config.yml') }
46
38
  let(:oldconfigvars) { { 'client_id' => '123', 'secret' => 'toto', 'site' => 'http://example.com' } }
47
39
  before { File.open(oldconfigfile, 'w') { |f| f.puts YAML.dump(oldconfigvars) } }
48
40
  before { input.stub(:gets).and_return('y', 'default') }
49
41
  after { FileUtils.rm oldconfigfile if File.exist?(oldconfigfile) }
42
+ after { FileUtils.rm workspacefile if File.exist?(workspacefile) }
50
43
  it do
51
44
  Hackpad::Cli::Config.new(options, input, output)
52
- expect(File.exist? oldconfigfile).to be_false
53
- expect(File.exist? configfile).to be_true
45
+ expect(File.exist? oldconfigfile).to be false
46
+ expect(File.exist? workspacefile).to be true
54
47
  end
55
48
  end
56
49
 
@@ -16,7 +16,7 @@ describe Hackpad::Cli::Pad do
16
16
 
17
17
  describe '.cached?' do
18
18
  before { Hackpad::Cli::Store.stub(:exist?).and_return true }
19
- it { expect(pad.cached?).to be_true }
19
+ it { expect(pad.cached?).to be true }
20
20
  end
21
21
 
22
22
  context 'when the pad has no data,' do
@@ -67,7 +67,7 @@ describe Hackpad::Cli::Pad do
67
67
  before { pad.load_from_provider Hackpad::Cli::Store, 'txt' }
68
68
  it { expect(pad.content).to eq "This\nis\nInformation!" }
69
69
  it { expect(pad.guest_policy).to eq 'open' }
70
- it { expect(pad.moderated).to be_false }
70
+ it { expect(pad.moderated).to be false }
71
71
  it { expect(pad.cached_at).to eq 'some time' }
72
72
  end
73
73
  end
@@ -26,6 +26,13 @@ describe Hackpad::Cli::Runner do
26
26
  end
27
27
  end
28
28
 
29
+ it 'calls the add method in client class' do
30
+ Object.stub(:add)
31
+ cli.shell.mute do
32
+ cli.add
33
+ end
34
+ end
35
+
29
36
  it 'calls the workspaces method in client class' do
30
37
  Object.stub(:workspaces)
31
38
  cli.shell.mute do
@@ -55,7 +62,8 @@ describe Hackpad::Cli::Runner do
55
62
  end
56
63
 
57
64
  it 'calls the version method in client class' do
58
- STDOUT.stub(:puts).with(Hackpad::Cli::VERSION)
65
+ version = File.read(File.expand_path('../../../../../CHANGELOG.md', __FILE__))[/([0-9]+\.[0-9]+\.[0-9]+)/]
66
+ STDOUT.stub(:puts).with(version)
59
67
  cli.shell.mute do
60
68
  cli.version
61
69
  end
@@ -3,19 +3,18 @@
3
3
  require 'spec_helper'
4
4
  require 'hackpad/cli/store'
5
5
  require 'hackpad/cli/pad'
6
+ require 'hackpad/cli/config'
7
+ require 'hackpad/cli/workspace'
6
8
 
7
9
  describe Hackpad::Cli::Store do
8
10
 
9
11
  let(:configdir) { File.expand_path('../../../../files', __FILE__) }
10
- let(:options) { OpenStruct.new(
11
- configdir: configdir,
12
- workspace: 'default',
13
- workspacedir: File.join(configdir, 'default')
14
- )
15
- }
12
+ let(:workspacedir) { File.expand_path('../../../../files/default', __FILE__) }
13
+ let(:config) { OpenStruct.new(basedir: configdir, refresh: false, workspace: 'default') }
14
+ let(:workspace) { OpenStruct.new(basedir: workspacedir) }
16
15
 
17
16
  before :each do
18
- subject.prepare options
17
+ subject.prepare config, workspace
19
18
  end
20
19
 
21
20
  describe '.read_list' do
@@ -41,7 +40,7 @@ describe Hackpad::Cli::Store do
41
40
  )
42
41
  }
43
42
  before do
44
- subject.prepare options
43
+ subject.prepare options, workspace
45
44
  FileUtils.touch File.join(configdir, 'default', 'pads', 'txt', 'xxx')
46
45
  end
47
46
  after { FileUtils.rm File.join(configdir, 'default', 'pads', 'txt', 'xxx') }
@@ -65,11 +64,10 @@ describe Hackpad::Cli::Store do
65
64
  describe '.save' do
66
65
  let(:padfile) { File.join(configdir, 'default', 'pads', 'txt', 'xxx') }
67
66
  let(:content) { "This is content\n" }
68
- before { subject.prepare options }
69
67
  let(:pad) { double Hackpad::Cli::Pad }
70
68
  before { pad.stub(:id).and_return 'xxx' }
71
69
  before { pad.stub(:content).and_return content }
72
- after { FileUtils.rm padfile }
70
+ after { FileUtils.rm padfile if File.exist?(padfile) }
73
71
  it do
74
72
  subject.save pad, 'txt'
75
73
  expect(File.read(padfile)).to eq content
@@ -79,8 +77,7 @@ describe Hackpad::Cli::Store do
79
77
  describe '.save_options' do
80
78
  let(:padfile) { File.join(configdir, 'default', 'pads', 'meta', 'xxx') }
81
79
  let(:content) { { thing: '123', other: 'option' } }
82
- before { subject.prepare options }
83
- after { FileUtils.rm padfile }
80
+ after { FileUtils.rm padfile if File.exist?(padfile) }
84
81
  it do
85
82
  subject.save_options 'xxx', content
86
83
  expect(File.read(padfile)).to eq "{\n \"thing\": \"123\",\n \"other\": \"option\"\n}\n"
@@ -90,8 +87,7 @@ describe Hackpad::Cli::Store do
90
87
  describe '.save_list' do
91
88
  let(:padfile) { File.join(configdir, 'default', 'pads', 'padlist') }
92
89
  let(:pads) { [OpenStruct.new(id: '123', cached_at: 'some time', title: 'title1')] }
93
- before { subject.prepare options }
94
- after { FileUtils.rm padfile }
90
+ after { FileUtils.rm padfile if File.exist?(padfile) }
95
91
  it do
96
92
  subject.save_list pads
97
93
  expect(File.read(padfile)).to eq "123 [some time] title1\n"
@@ -101,12 +97,11 @@ describe Hackpad::Cli::Store do
101
97
  describe '.read' do
102
98
  let(:padfile) { File.join(configdir, 'default', 'pads', 'txt', 'xxx') }
103
99
  let(:content) { "This is content\n" }
104
- before { subject.prepare options }
105
100
  let(:pad) { double Hackpad::Cli::Pad }
106
101
  before { pad.stub(:id).and_return 'xxx' }
107
102
  before { pad.stub(:content).and_return content }
108
103
  before { subject.save pad, 'txt' }
109
- after { FileUtils.rm padfile }
104
+ after { FileUtils.rm padfile if File.exist?(padfile) }
110
105
 
111
106
  it { expect(subject.read 'xxx', 'txt').to eq content }
112
107
  end
@@ -114,18 +109,16 @@ describe Hackpad::Cli::Store do
114
109
  describe '.read_option' do
115
110
  let(:padfile) { File.join(configdir, 'default', 'pads', 'meta', 'xxx') }
116
111
  let(:content) { { 'thing' => '123', 'other' => 'option' } }
117
- before { subject.prepare options }
118
112
  before { subject.save_options 'xxx', content }
119
- after { FileUtils.rm padfile }
113
+ after { FileUtils.rm padfile if File.exist?(padfile) }
120
114
  it { expect(subject.read_options 'xxx').to eq content }
121
115
  end
122
116
 
123
117
  describe '.count_pads' do
124
118
  let(:padfile) { File.join(configdir, 'default', 'pads', 'meta', 'xxx') }
125
119
  let(:content) { { 'thing' => '123', 'other' => 'option' } }
126
- before { subject.prepare options }
127
120
  before { subject.save_options 'xxx', content }
128
- after { FileUtils.rm padfile }
121
+ after { FileUtils.rm padfile if File.exist?(padfile) }
129
122
  it { expect(subject.count_pads).to be 1 }
130
123
  end
131
124
 
@@ -133,12 +126,11 @@ describe Hackpad::Cli::Store do
133
126
  let(:timestamp) { Time.new(2012, 10, 31) }
134
127
  let(:padlist) { File.join(configdir, 'default', 'pads', 'padlist') }
135
128
  let(:pads) { [OpenStruct.new(id: '123', cached_at: 'some time', title: 'title1')] }
136
- before { subject.prepare options }
137
129
  before do
138
130
  subject.save_list pads
139
131
  FileUtils.touch padlist, mtime: timestamp
140
132
  end
141
- after { FileUtils.rm padlist }
133
+ after { FileUtils.rm padlist if File.exist?(padlist) }
142
134
  it { expect(subject.last_refresh).to eq timestamp }
143
135
  end
144
136
 
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'hackpad/cli/workspace'
5
+
6
+ describe Hackpad::Cli::Workspace do
7
+
8
+ let(:configdir) { File.expand_path('../../../../files', __FILE__) }
9
+ let(:workspacedir) { File.join(configdir, 'default') }
10
+ let(:workspacedir) { File.join(configdir, 'default') }
11
+ let(:workspacefile) { File.join(workspacedir, 'config.yml') }
12
+ let(:options) { { basedir: workspacedir, basefile: workspacefile } }
13
+ let(:input) { StringIO.new }
14
+ let(:output) { StringIO.new }
15
+
16
+ before { FileUtils.mkdir_p configdir unless Dir.exist?(configdir) }
17
+ before { FileUtils.mkdir_p workspacedir unless Dir.exist?(workspacedir) }
18
+
19
+ after { FileUtils.rm workspacefile if File.exist?(workspacefile) }
20
+
21
+ describe '.new' do
22
+ context 'when there is already config files created,' do
23
+ let(:workspacevars) { { 'client_id' => '123', 'secret' => 'toto', 'site' => 'http://example.com' } }
24
+ before { File.open(workspacefile, 'w') { |f| f.puts YAML.dump(workspacevars) } }
25
+ let(:workspace) { Hackpad::Cli::Workspace.new(options) }
26
+ it {
27
+ expect(workspace.secret).to eq 'toto'
28
+ expect(workspace.site).to eq 'http://example.com'
29
+ }
30
+ end
31
+ context 'when there is no config files created,' do
32
+ before { input.stub(:gets).and_return('123', 'toto', 'http://example.com') }
33
+ let(:workspace) { Hackpad::Cli::Workspace.new(options, input, output) }
34
+ it {
35
+ expect(workspace.secret).to eq 'toto'
36
+ expect(workspace.site).to eq 'http://example.com'
37
+ }
38
+ end
39
+ end
40
+
41
+ describe '.create' do
42
+ let(:workspacevars) { { 'client_id' => '123', 'secret' => 'toto', 'site' => 'http://example.com' } }
43
+ before { File.open(workspacefile, 'w') { |f| f.puts YAML.dump(workspacevars) } }
44
+ let!(:workspace) { Hackpad::Cli::Workspace.new(options, input, output) }
45
+ let(:newone) { 'another' }
46
+ let(:newworkspacefile) { File.join(configdir, newone, 'config.yml') }
47
+ before { input.stub(:gets).and_return(newone, '123', 'toto', 'http://example.com') }
48
+ after { FileUtils.rm newworkspacefile if File.exist?(newworkspacefile) }
49
+ it {
50
+ workspace.create
51
+ expect(File.exist? newworkspacefile).to be true
52
+ }
53
+ end
54
+
55
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hackpad-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - mose
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-27 00:00:00.000000000 Z
11
+ date: 2015-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -24,20 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: configstruct
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.0.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.3
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: cliprompt
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: 0.0.5
47
+ version: 0.1.0
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: 0.0.5
54
+ version: 0.1.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: paint
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -193,7 +207,10 @@ files:
193
207
  - lib/hackpad/cli/padlist.rb
194
208
  - lib/hackpad/cli/runner.rb
195
209
  - lib/hackpad/cli/store.rb
196
- - lib/hackpad/cli/version.rb
210
+ - lib/hackpad/cli/workspace.rb
211
+ - lib/reverse_markdown/converters/head.rb
212
+ - spec/files/test/sample.html
213
+ - spec/files/test/sample.md
197
214
  - spec/lib/hackpad/cli/api_spec.rb
198
215
  - spec/lib/hackpad/cli/client_spec.rb
199
216
  - spec/lib/hackpad/cli/config_spec.rb
@@ -201,6 +218,7 @@ files:
201
218
  - spec/lib/hackpad/cli/padlist_spec.rb
202
219
  - spec/lib/hackpad/cli/runner_spec.rb
203
220
  - spec/lib/hackpad/cli/store_spec.rb
221
+ - spec/lib/hackpad/cli/workspace_spec.rb
204
222
  - spec/spec_helper.rb
205
223
  homepage: https://github.com/mose/hackpad-cli
206
224
  licenses:
@@ -222,11 +240,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
240
  version: '0'
223
241
  requirements: []
224
242
  rubyforge_project:
225
- rubygems_version: 2.2.2
243
+ rubygems_version: 2.4.6
226
244
  signing_key:
227
245
  specification_version: 4
228
246
  summary: CLI for hackpad browsing and editing.
229
247
  test_files:
248
+ - spec/files/test/sample.html
249
+ - spec/files/test/sample.md
230
250
  - spec/lib/hackpad/cli/api_spec.rb
231
251
  - spec/lib/hackpad/cli/client_spec.rb
232
252
  - spec/lib/hackpad/cli/config_spec.rb
@@ -234,4 +254,5 @@ test_files:
234
254
  - spec/lib/hackpad/cli/padlist_spec.rb
235
255
  - spec/lib/hackpad/cli/runner_spec.rb
236
256
  - spec/lib/hackpad/cli/store_spec.rb
257
+ - spec/lib/hackpad/cli/workspace_spec.rb
237
258
  - spec/spec_helper.rb
@@ -1,5 +0,0 @@
1
- module Hackpad
2
- module Cli
3
- VERSION = '0.1.2'
4
- end
5
- end