code2gist 0.0.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/Gemfile ADDED
@@ -0,0 +1 @@
1
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,13 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ code2gist (0.0.1)
5
+
6
+ GEM
7
+ specs:
8
+
9
+ PLATFORMS
10
+ ruby
11
+
12
+ DEPENDENCIES
13
+ code2gist!
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Gonçalo Silva
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # code2gist
2
+
3
+ This library parses text and looks for this pattern:
4
+
5
+ ```filename.extension
6
+ some code
7
+ ```
8
+
9
+ It uploads all matches to http://gist.github.com and returns the link to it. The filename and extension are optional — it'll assume it's an untitled plain text file if you don't specify what it is.
10
+
11
+ ## Usage
12
+
13
+ It's very simple:
14
+
15
+ require 'code2gist'
16
+ Code2Gist.upload(your_text, "example description")
17
+
18
+ ### Options
19
+ It supports a couple of boolean options:
20
+
21
+ - `:embed` (default: `false`)
22
+ - `:html` (default: `false`)
23
+
24
+ Quick example:
25
+
26
+ Code2Gist.upload(your_markdown_text, "another description", :embed => true, :html => true)
27
+
28
+ If you pass `:embed => true`to it, it will replace all code blocks with
29
+ links to the appropriate file at http://gist.github.com. If you also
30
+ pass `:html => true`, it will replace all code blocks with embeded
31
+ gists.
32
+
33
+ This is specially useful if your using markdown/textile and would like
34
+ to have all your code blocks in a gist and embeded in your HTML. For
35
+ example:
36
+
37
+ html = Markdown.new(Code2Gist.upload(text, "Article code snippets", :embed => true, :html => true)).to_html
38
+
39
+ ### I want to be the owner of the gist!
40
+
41
+ It's okay, just specify your username and API token before uploading any
42
+ gists:
43
+
44
+ Code2Gist::Config.github_login = "your_login"
45
+ Code2Gist::Config.github_token = "your_token"
46
+
47
+ ## Real example
48
+
49
+ code = <<-eoc
50
+ This is just a regular `document`
51
+
52
+ It can have code!
53
+
54
+ ```description.rb
55
+ def what
56
+ puts "This is ruby code!"
57
+ `ls`
58
+ end
59
+ ```
60
+
61
+ And small snippets *also* work:
62
+ ```
63
+ Not sure what this is
64
+ ```
65
+
66
+ The end
67
+ eoc
68
+
69
+ Code2Gist.upload(code, "my description) # => https://gist.github.com/1157214
70
+
71
+ Code2Gist.upload(code, "another description", :embed => true) # =>
72
+ # This is just a regular `document`
73
+ #
74
+ # It can have code!
75
+ #
76
+ # https://gist.github.com/1157215?file=description.rb
77
+ #
78
+ # And small snippets *also* work:
79
+ # https://gist.github.com/1157215?file=untitled_1.txt
80
+ #
81
+ # The end
82
+
83
+ Code2Gist.upload(code, "yet another description", :embed => true, :html => true) # =>
84
+ # This is just a regular `document`
85
+ #
86
+ # It can have code!
87
+ #
88
+ # <script src="https://gist.github.com/1157216.js?file=description.rb"></script>
89
+ #
90
+ # And small snippets *also* work:
91
+ # <script src="https://gist.github.com/1157216.js?file=untitled_1.txt"></script>
92
+ #
93
+ # The end
94
+
data/Rakefile ADDED
@@ -0,0 +1,31 @@
1
+ begin
2
+ require "bundler"
3
+ Bundler.setup
4
+ rescue LoadError
5
+ $stderr.puts "You need to have Bundler installed to be able build this gem."
6
+ end
7
+
8
+ gemspec = eval(File.read(Dir["*.gemspec"].first))
9
+
10
+
11
+ desc "Validate the gemspec"
12
+ task :gemspec do
13
+ gemspec.validate
14
+ end
15
+
16
+ desc "Build gem locally"
17
+ task :build => :gemspec do
18
+ system "gem build #{gemspec.name}.gemspec"
19
+ FileUtils.mkdir_p "pkg"
20
+ FileUtils.mv "#{gemspec.name}-#{gemspec.version}.gem", "pkg"
21
+ end
22
+
23
+ desc "Install gem locally"
24
+ task :install => :build do
25
+ system "gem install pkg/#{gemspec.name}-#{gemspec.version}"
26
+ end
27
+
28
+ desc "Clean automatically generated files"
29
+ task :clean do
30
+ FileUtils.rm_rf "pkg"
31
+ end
data/code2gist.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # coding: UTF-8
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "code2gist"
5
+ s.version = "0.0.1"
6
+ s.platform = Gem::Platform::RUBY
7
+ s.authors = ["Gonçalo Silva"]
8
+ s.email = ["goncalossilva@gmail.com"]
9
+ s.homepage = "http://github.com/goncalossilva/code2gist"
10
+ s.summary = "Parse text files (markdown/textile/whatever) for code blocks and gist them"
11
+ s.description = "Parse text files (markdown/textile/whatever) for code blocks and gist them"
12
+ s.rubyforge_project = s.name
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+
16
+ # If you have runtime dependencies, add them here
17
+ # s.add_runtime_dependency "other", "~> 1.2"
18
+
19
+ # If you have development dependencies, add them here
20
+ # s.add_development_dependency "another", "= 0.9"
21
+
22
+ # The list of files to be contained in the gem
23
+ s.files = `git ls-files`.split("\n")
24
+ # s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
25
+ # s.extensions = `git ls-files ext/extconf.rb`.split("\n")
26
+
27
+ s.require_path = 'lib'
28
+
29
+ # For C extensions
30
+ # s.extensions = "ext/extconf.rb"
31
+ end
data/lib/code2gist.rb ADDED
@@ -0,0 +1,83 @@
1
+ require "net/http"
2
+ require "uri"
3
+ require "json"
4
+
5
+ module Code2Gist
6
+ extend self
7
+
8
+ module Config
9
+ def self.github_login
10
+ @@github_login ||= nil
11
+ end
12
+ def self.github_login=(github_login)
13
+ @@github_login = github_login
14
+ end
15
+ def self.github_token
16
+ @@github_token ||= nil
17
+ end
18
+ def self.github_token=(github_token)
19
+ @@github_token = github_token
20
+ end
21
+ end
22
+
23
+ def upload(text, description = nil, opts = {})
24
+ options = {:embed => false, :html => false}.merge(opts)
25
+
26
+ code_regex = /```(\w+\.\w+)?[^\n]*\n(.*?)```/m
27
+ new_text = name_nameless_code_blocks(text)
28
+
29
+ gist_url = get_gist(Hash[*new_text.scan(code_regex).flatten], description)
30
+
31
+ if options[:embed]
32
+ if options[:html]
33
+ new_text.gsub(code_regex, "<script src=\"#{gist_url}.js?file=\\1\"></script>")
34
+ else
35
+ new_text.gsub(code_regex, "#{gist_url}?file=\\1")
36
+ end
37
+ else
38
+ gist_url
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def name_nameless_code_blocks(text)
45
+ nameless_blocks = 0
46
+ new_text = text.gsub(/```(\w+\.\w+)?/).with_index do |match, index|
47
+ if index%2 == 0 && match.size == 3
48
+ nameless_blocks += 1;
49
+ "```untitled_#{nameless_blocks}.txt"
50
+ else
51
+ match
52
+ end
53
+ end
54
+
55
+ new_text
56
+ end
57
+
58
+ def get_gist(data, description)
59
+ post_data = {}
60
+ data.each_with_index do |(filename, content), index|
61
+ post_data.merge!("files[#{filename}]" => content)
62
+ end
63
+
64
+ post_data.merge!(
65
+ "login" => Code2Gist::Config.github_login,
66
+ "token" => Code2Gist::Config.github_token
67
+ ) unless Code2Gist::Config.github_login.nil? || Code2Gist::Config.github_token.nil?
68
+
69
+ post_data.merge!("description" => description)
70
+
71
+ result = Net::HTTP.post_form(URI.parse("http://gist.github.com/api/v1/json/new"), post_data)
72
+ parsed_json = JSON(result.body)
73
+ repo = nil
74
+ parsed_json['gists'].each do |key, val|
75
+ key.each do |k, v|
76
+ if "#{k}" == 'repo'
77
+ repo = "#{v}"
78
+ end
79
+ end
80
+ end
81
+ return "https://gist.github.com/#{repo}"
82
+ end
83
+ end
@@ -0,0 +1,33 @@
1
+ $:.unshift "#{File.dirname(__FILE__)}/../lib/"
2
+ require "test/unit"
3
+ require "code2gist"
4
+
5
+ class Code2GistTest < Test::Unit::TestCase
6
+ def test_empty_gist
7
+ code = <<-eoc
8
+ This is just a regular `document`
9
+
10
+ It can have code!
11
+
12
+ ```description.rb
13
+ def what
14
+ puts "This is ruby code!"
15
+ `ls`
16
+ end
17
+ ```
18
+
19
+ And small snippets *also* work:
20
+ ```
21
+ Not sure what this is
22
+ ```
23
+
24
+ The end
25
+ eoc
26
+
27
+ puts Code2Gist.upload(code, "test description")# =~ /https:\/\/gist\.github\.com\/\d+/
28
+
29
+ puts Code2Gist.upload(code, "another description", :embed => true)# =~ /https:\/\/gist.github.com\/\d+\?file=\w+\.\w+/
30
+
31
+ puts Code2Gist.upload(code, "yet another description", :embed => true, :html => true)# =~ /<script src="https:\/\/gist.github.com\/\d+\.js\?file=\w+\.\w+"><\/script>/
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: code2gist
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Gonçalo Silva
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-08-19 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: Parse text files (markdown/textile/whatever) for code blocks and gist
15
+ them
16
+ email:
17
+ - goncalossilva@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - Gemfile
23
+ - Gemfile.lock
24
+ - LICENSE
25
+ - README.md
26
+ - Rakefile
27
+ - code2gist.gemspec
28
+ - lib/code2gist.rb
29
+ - test/code2gist_test.rb
30
+ homepage: http://github.com/goncalossilva/code2gist
31
+ licenses: []
32
+ post_install_message:
33
+ rdoc_options: []
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.6
48
+ requirements: []
49
+ rubyforge_project: code2gist
50
+ rubygems_version: 1.8.6
51
+ signing_key:
52
+ specification_version: 3
53
+ summary: Parse text files (markdown/textile/whatever) for code blocks and gist them
54
+ test_files: []