gast 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eeec572eb871ef31ca23050fea49e461ede8ada4
4
- data.tar.gz: 49b8eef7b16e2eca899312247849e9eb75a38dad
3
+ metadata.gz: 6d28db257ac5b3ca94999e73923159eb1103d44f
4
+ data.tar.gz: b333fa902740c3fedc0f690f2f4d27d3aa560fb1
5
5
  SHA512:
6
- metadata.gz: bd55502f4bcebddb356eac5e5e83bf8264885df993af1307d7b28cc2834fe60656272e29d0682b6d384f68f0f848923d63caa578f1d651bf65a43a4156792998
7
- data.tar.gz: b59aae1a8a878bdc00d823a5e961bf00d488f55c469fdbced068fa95f190394841005ab8129873a8e718d4bcef4f0c799a962f833356b47f32a93f4886c9fabc
6
+ metadata.gz: fd83c840284896c541cd0ead58e0ab41b35a7ac517ea1fa4f8c814216187fe5e49a35ab067f593489a5392f284e1a5069b35d6f27ddb475e1710ed675d4fe139
7
+ data.tar.gz: d45e7f45e793873742db3ef4ac255aebea6abbc619ac14a7dbad0cf3d8e7eda401e190b78cc8c759d20d4f3813b4327e2649cb14b060bc801ebe261b43cb8760
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gast (0.0.9)
4
+ gast (0.0.10)
5
5
  bundler (~> 1.6)
6
6
  git
7
7
  haml
@@ -87,7 +87,7 @@ GEM
87
87
  pry-remote (0.1.8)
88
88
  pry (~> 0.9)
89
89
  slop (~> 3.0)
90
- puma (2.11.0)
90
+ puma (2.11.1)
91
91
  rack (>= 1.1, < 2.0)
92
92
  rack (1.6.0)
93
93
  rack-protection (1.5.3)
@@ -119,8 +119,8 @@ GEM
119
119
  ruby-progressbar (~> 1.4)
120
120
  ruby-progressbar (1.7.1)
121
121
  safe_yaml (1.0.4)
122
- sass (3.4.10)
123
- sequel (4.18.0)
122
+ sass (3.4.13)
123
+ sequel (4.19.0)
124
124
  shellany (0.0.1)
125
125
  sinatra (1.4.5)
126
126
  rack (~> 1.4)
data/lib/gast/base.rb CHANGED
@@ -46,15 +46,16 @@ module Gast
46
46
  namespace '/posts' do
47
47
  before %r{/\w+/(\w+)} do |id|
48
48
  unless /[a-zA-Z0-9]{30}/ =~ id.to_s
49
- halt haml(:error, locals: {
49
+ halt haml(:error, locals: {
50
50
  message: 'error is format of id'
51
51
  })
52
52
  end
53
53
  end
54
54
 
55
55
  before '/new' do
56
- @content = params[:content].to_s
56
+ @content = params[:content].to_s
57
57
  @language = params[:language].to_s
58
+ @title = params[:title].to_s
58
59
 
59
60
  if @content.length == 0
60
61
  halt haml(:error, locals: {
@@ -62,7 +63,7 @@ module Gast
62
63
  })
63
64
  end
64
65
 
65
- result = Gast::Memo.create(@content, @language)
66
+ result = Gast::Memo.create(@content, @language, @title)
66
67
  @content_id = result.content_id
67
68
  end
68
69
 
@@ -73,14 +74,16 @@ module Gast
73
74
  before '/*/:content_id' do
74
75
  if %w[view log edit update].include? request.path_info.split('/')[2]
75
76
  @content_id = params[:content_id].to_s
76
- @content = params[:content].to_s
77
- @language = params[:language].to_s
77
+ @content = params[:content].to_s
78
+ @language = params[:language].to_s
79
+ @title = params[:title].to_s
78
80
  end
79
81
  end
80
82
 
81
83
  before '/view/:content_id' do
82
- @item = Gast::Memo.item(@content_id)
84
+ @item = Gast::Memo.item(@content_id)
83
85
  @language = Gast::Memo.language(@content_id)
86
+ @title = Gast::Memo.title(@content_id)
84
87
  end
85
88
 
86
89
  before '/log/:content_id' do
@@ -88,12 +91,14 @@ module Gast
88
91
  end
89
92
 
90
93
  before '/edit/:content_id' do
91
- @item = Gast::Memo.item(@content_id)
94
+ @item = Gast::Memo.item(@content_id)
95
+ @language = Gast::Memo.language(@content_id)
96
+ @title = Gast::Memo.title(@content_id)
92
97
  end
93
98
 
94
99
  before '/update/:content_id' do
95
- if Gast::Memo.changed?(@content_id, @content)
96
- Gast::Memo.update(@content_id, @content, @language)
100
+ if Gast::Memo.changed?(@content_id, @content, @language, @title)
101
+ Gast::Memo.update(@content_id, @content, @language, @title)
97
102
  end
98
103
  end
99
104
  end
data/lib/gast/helper.rb CHANGED
@@ -13,7 +13,7 @@ module Gast
13
13
  def get_content(id)
14
14
  File.read(File.expand_path(Gast::PATH + "/#{id}/content"))
15
15
  end
16
-
16
+
17
17
  def get_content_dir(id)
18
18
  File.expand_path(Gast::PATH + "/#{id}")
19
19
  end
@@ -21,5 +21,10 @@ module Gast
21
21
  def get_language(id)
22
22
  File.read(File.expand_path(Gast::PATH + "/#{id}/language"))
23
23
  end
24
+
25
+ def get_title(id)
26
+ path = File.expand_path(Gast::PATH + "/#{id}/title")
27
+ File.exists?(path) ? File.read(path) : nil
28
+ end
24
29
  end
25
30
  end
data/lib/gast/memo.rb CHANGED
@@ -5,61 +5,66 @@ module Gast
5
5
  extend Helper
6
6
 
7
7
  class Response
8
- attr_reader :content_id, :language, :content
8
+ attr_reader :content_id, :language, :content, :title
9
9
 
10
- def initialize(content_id, language, content)
10
+ def initialize(content_id, language, content, title)
11
11
  @content_id = content_id
12
- @language = language
13
- @content = content
12
+ @language = language
13
+ @content = content
14
+ @title = title
14
15
  end
15
16
  end
16
17
 
17
18
  class Request
18
- attr_reader :content_id, :language, :content
19
+ attr_reader :content_id, :language, :content, :title
19
20
 
20
- def initialize(content_id, language, content)
21
+ def initialize(content_id, language, content, title)
21
22
  @content_id = content_id
22
- @language = language
23
- @content = content
23
+ @language = language
24
+ @content = content
25
+ @title = title
24
26
  end
25
27
  end
26
28
 
27
- def response(content_id, language, content)
28
- Response.new(content_id, language, content)
29
+ def response(content_id, language, content, title)
30
+ Response.new(content_id, language, content, title)
29
31
  end
30
32
  module_function :response
31
33
 
32
- def request(content_id, language, content)
33
- Request.new(content_id, language, content)
34
+ def request(content_id, language, content, title)
35
+ Request.new(content_id, language, content, title)
34
36
  end
35
37
  module_function :request
36
38
 
37
- def repository(content, language, content_id = nil)
39
+ def repository(content, language, content_id = nil, title)
38
40
  repo = Repository.new
39
41
  repo.dir_name = content_id
40
42
  repo.create
41
43
  repo.content = unescape_html { content }
42
44
  repo.language = unescape_html { language }
45
+ repo.title = unescape_html { title }
43
46
  repo.write
44
47
  repo.commit!
45
48
 
46
49
  repo.dir_name
47
50
  end
48
51
 
49
- def create(content, language = DEFAULT_HIGHLIGHT)
50
- content_id = repository(content, language)
51
- response(content_id, language, content)
52
+ def create(content, language = DEFAULT_HIGHLIGHT, title = nil)
53
+ content_id = repository(content, language, nil, title)
54
+ response(content_id, language, content, title)
52
55
  end
53
56
  module_function :create
54
57
 
55
- def update(content_id, content, language = DEFAULT_HIGHLIGHT)
56
- content_id = repository(content, language, content_id)
57
- response(content_id, language, content)
58
+ def update(content_id, content, language = DEFAULT_HIGHLIGHT, title = nil)
59
+ content_id = repository(content, language, content_id, title)
60
+ response(content_id, language, content, title)
58
61
  end
59
62
  module_function :update
60
63
 
61
- def changed?(content_id, content)
62
- content.to_s.chomp != item(content_id).chomp
64
+ def changed?(content_id, content, language, title)
65
+ content.to_s.chomp != item(content_id).chomp ||
66
+ language.to_s.chomp != language(content_id).chomp ||
67
+ title.to_s.chomp != title(content_id).chomp
63
68
  end
64
69
  module_function :changed?
65
70
 
@@ -72,6 +77,7 @@ module Gast
72
77
  Dir.glob(File.expand_path(Gast::PATH + '/**')).map do |dir|
73
78
  {
74
79
  content_id: dir.split('/').last,
80
+ title: File.exist?(dir + '/title') ? File.open(dir + '/title').read : nil,
75
81
  updated_at: File.stat(dir + '/content').mtime
76
82
  }
77
83
  end
@@ -92,6 +98,10 @@ module Gast
92
98
  def language(id)
93
99
  escape_html { get_language(id) }
94
100
  end
101
+
102
+ def title(id)
103
+ escape_html { get_title(id) }
104
+ end
95
105
  module_function :language
96
106
 
97
107
  extend Memo
@@ -3,7 +3,7 @@ require 'gast'
3
3
  module Gast
4
4
  class Repository
5
5
  attr_reader :path
6
- attr_writer :content, :language
6
+ attr_writer :content, :language, :title
7
7
  attr_accessor :dir_name
8
8
 
9
9
  def initialize; end
@@ -18,6 +18,7 @@ module Gast
18
18
  def write
19
19
  write_content
20
20
  write_language
21
+ write_title
21
22
  end
22
23
 
23
24
  def log
@@ -64,6 +65,15 @@ module Gast
64
65
  end
65
66
  end
66
67
 
68
+ def write_title
69
+ path = File.expand_path(@path + '/title')
70
+ open(path, 'w', 0644) do |io|
71
+ io.flock(File::LOCK_EX)
72
+ io.write(@title)
73
+ io.flock(File::LOCK_UN)
74
+ end
75
+ end
76
+
67
77
  def new_name_of_repository
68
78
  if @dir_name.nil?
69
79
  @dir_name = Digest::SHA512.new.update(rand.to_s).to_s[0..30]
@@ -1,7 +1,8 @@
1
1
  .form-group
2
2
  = haml :languages
3
+ = haml :title
3
4
  = preserve do
4
5
  %textarea{ class: "form-control", style: "margin-top: 10px; height: 30em;", name: "content", wrap: "hard" }
5
- = @item
6
+ = @item
6
7
  %button{ type: "submit", class: "btn btn-primary" }
7
8
  Submit
@@ -1,4 +1,4 @@
1
1
  %select{ name: "language" }
2
2
  - @languages.map do |language|
3
- %option{ value: "#{language}" }
4
- = language
3
+ %option{ value: "#{language}", :selected => @language == language }
4
+ = language
@@ -2,9 +2,11 @@
2
2
  Items
3
3
  %table{ class: "table table-striped" }
4
4
  %thead
5
- %tr
5
+ %tr
6
6
  %th
7
7
  Content ID
8
+ %th
9
+ Title
8
10
  %th
9
11
  Updated At
10
12
  %tbody
@@ -13,5 +15,7 @@
13
15
  %td
14
16
  %a{ href: url("/posts/view/#{list[:content_id]}") }
15
17
  = list[:content_id]
18
+ %td
19
+ = CGI.escapeHTML(list[:title])
16
20
  %td
17
21
  = list[:updated_at]
@@ -0,0 +1 @@
1
+ %input{name: "title", placeholder: "Title...", value:(!@title || @title == '') ? '' : @title, maxlength:40, size:40, style:"margin-left:30px;padding-left:10px;"}
@@ -1,8 +1,12 @@
1
1
  %h1
2
2
  = @content_id
3
3
  %form{ role: "form", action: "/posts/edit/#{@content_id}", method: "GET" }
4
- %button{ type: "submit", class: "btn btn-primary" }
5
- Update
4
+ %div.col-xs-2
5
+ %button{ type: "submit", class: "btn btn-primary" }
6
+ Update
7
+ %div.col-xs-10
8
+ %h3{ style:"margin-top: 3px;" }
9
+ = (@title == "") ? "&nbsp" : @title
6
10
 
7
11
  %div{ style: "margin-top: 20px;" }
8
12
  = preserve do
data/lib/gast/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Gast
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
@@ -5,6 +5,7 @@ describe Gast::App do
5
5
  let(:hello_world) { 'Hello World' }
6
6
  let(:welcome_to_underground) { 'Welcome to underground' }
7
7
  let(:inline_html) { "<script>alert('Hello world!');</script>" }
8
+ let(:inline_html_title) {"<b>hoge</b>"}
8
9
  let(:sample_of_code_ruby) { get_fixture('sample_of_code.rb') }
9
10
  let(:view_path) { %r{.+/posts/view/[a-z0-9]+} }
10
11
 
@@ -100,6 +101,21 @@ describe Gast::App do
100
101
  expect(last_response.body).to include(CGI.escapeHTML(inline_html))
101
102
  end
102
103
 
104
+ it 'should be title is escaped by HTML' do
105
+ post('/posts/new', content: inline_html, title:inline_html_title)
106
+
107
+ expect(latest_title).to eq inline_html_title
108
+
109
+ get "/posts/view/#{dir_name_of_latest_repository}"
110
+
111
+ expect(last_response).to be_ok
112
+ expect(last_response.body).to include(CGI.escapeHTML(inline_html_title))
113
+
114
+ get '/posts/list'
115
+ expect(last_response).to be_ok
116
+ expect(last_response.body).to include('&lt;b&gt;hoge&lt;/b&gt;')
117
+ end
118
+
103
119
  it 'should be post language type the code highlight' do
104
120
  post('/posts/new', content: sample_of_code_ruby, language: 'ruby')
105
121
 
@@ -24,4 +24,11 @@ describe 'the index page', type: :feature do
24
24
  find('//textarea').set 'Hello world'
25
25
  find('//textarea').text eq 'Hello world'
26
26
  end
27
+
28
+ it 'should be able to write text on the title input' do
29
+ visit '/'
30
+
31
+ find('//input').set 'My Title'
32
+ find('//input').text eq 'My Title'
33
+ end
27
34
  end
@@ -5,10 +5,12 @@ describe Gast::Repository do
5
5
  let(:git) { Git.init(repo.path) }
6
6
  let(:user_content) { 'Hello World' }
7
7
  let(:selected_language) { 'ruby' }
8
+ let(:title) { 'My awesome title' }
8
9
 
9
10
  before(:each) do
10
11
  repo.content = user_content
11
12
  repo.language = selected_language
13
+ repo.title = title
12
14
  repo.create
13
15
  repo.write
14
16
  repo.commit!
@@ -28,6 +30,10 @@ describe Gast::Repository do
28
30
  expect(latest_language_of_content).to eq selected_language
29
31
  end
30
32
 
33
+ it 'should be title is My awesome title' do
34
+ expect(latest_title).to eq title
35
+ end
36
+
31
37
  it 'should be save of commit message is correct' do
32
38
  Timecop.freeze
33
39
  expect(git.log.first.message).to eq "commit: #{DateTime.now}"
data/spec/spec_helper.rb CHANGED
@@ -71,6 +71,10 @@ def latest_language_of_content
71
71
  File.read(latest_repository + '/language')
72
72
  end
73
73
 
74
+ def latest_title
75
+ File.read(latest_repository + '/title')
76
+ end
77
+
74
78
  def cleanup_in_the_dir
75
79
  FileUtils.rm_r(Dir.glob(Gast::PATH + '/**'), secure: true)
76
80
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gast
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - futoase
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-27 00:00:00.000000000 Z
11
+ date: 2015-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -261,6 +261,7 @@ files:
261
261
  - lib/gast/templates/navbar.haml
262
262
  - lib/gast/templates/not_found.haml
263
263
  - lib/gast/templates/save.haml
264
+ - lib/gast/templates/title.haml
264
265
  - lib/gast/templates/view.haml
265
266
  - lib/gast/version.rb
266
267
  - spec/controller_spec.rb