clearbooks 0.16.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS.md +31 -0
  3. data/CHANGELOG.md +0 -0
  4. data/COPYING.md +12 -0
  5. data/FAQ.md +8 -0
  6. data/Gemfile +105 -0
  7. data/LICENSE.md +14 -0
  8. data/MAINTAINERS.md +40 -0
  9. data/README.md +549 -0
  10. data/Rakefile +94 -0
  11. data/Thorfile +80 -0
  12. data/bin/clearbooks +28 -0
  13. data/clearbooks.gemspec +119 -0
  14. data/examples/demo.rb +8 -0
  15. data/lib/clearbooks.rb +92 -0
  16. data/lib/clearbooks/core_ext.rb +8 -0
  17. data/lib/clearbooks/core_ext/array.rb +51 -0
  18. data/lib/clearbooks/core_ext/hash.rb +47 -0
  19. data/lib/clearbooks/core_ext/io_binary_read.rb +20 -0
  20. data/lib/clearbooks/core_ext/string.rb +21 -0
  21. data/lib/clearbooks/error.rb +8 -0
  22. data/lib/clearbooks/error/errors.rb +228 -0
  23. data/lib/clearbooks/interface/rake/cucumber.rb +36 -0
  24. data/lib/clearbooks/interface/rake/default.rb +28 -0
  25. data/lib/clearbooks/interface/rake/documentation.rb +45 -0
  26. data/lib/clearbooks/interface/rake/guard.rb +13 -0
  27. data/lib/clearbooks/interface/rake/helpers.rb +27 -0
  28. data/lib/clearbooks/interface/rake/library.rb +126 -0
  29. data/lib/clearbooks/interface/rake/metric.rb +15 -0
  30. data/lib/clearbooks/interface/rake/rspec.rb +31 -0
  31. data/lib/clearbooks/interface/thor/info.thor +292 -0
  32. data/lib/clearbooks/interface/thor/mixin/config_choice.rb +27 -0
  33. data/lib/clearbooks/interface/thor/mixin/configuration.rb +28 -0
  34. data/lib/clearbooks/interface/thor/mixin/default.rb +30 -0
  35. data/lib/clearbooks/interface/thor/mixin/default_config.rb +31 -0
  36. data/lib/clearbooks/interface/thor/mixin/guess.rb +57 -0
  37. data/lib/clearbooks/interface/thor/mixin/shell.rb +225 -0
  38. data/lib/clearbooks/interface/thor/version.thor +34 -0
  39. data/lib/clearbooks/library/client.rb +257 -0
  40. data/lib/clearbooks/library/configuration.rb +34 -0
  41. data/lib/clearbooks/model/account_code.rb +65 -0
  42. data/lib/clearbooks/model/base.rb +67 -0
  43. data/lib/clearbooks/model/entity.rb +225 -0
  44. data/lib/clearbooks/model/invoice.rb +163 -0
  45. data/lib/clearbooks/model/item.rb +78 -0
  46. data/lib/clearbooks/model/journal.rb +74 -0
  47. data/lib/clearbooks/model/ledger.rb +52 -0
  48. data/lib/clearbooks/model/payment.rb +113 -0
  49. data/lib/clearbooks/model/project.rb +58 -0
  50. data/lib/clearbooks/version.rb +12 -0
  51. data/spec/clearbooks/clearbooks_spec.rb +27 -0
  52. data/spec/clearbooks/model/account_code_spec.rb +52 -0
  53. data/spec/clearbooks/model/entity_spec.rb +107 -0
  54. data/spec/clearbooks/model/invoice_spec.rb +109 -0
  55. data/spec/clearbooks/model/journal_spec.rb +77 -0
  56. data/spec/clearbooks/model/payment_spec.rb +103 -0
  57. data/spec/clearbooks/model/project_spec.rb +72 -0
  58. data/spec/fixtures/response/allocate_payment.xml +12 -0
  59. data/spec/fixtures/response/create_entity.xml +12 -0
  60. data/spec/fixtures/response/create_invoice.xml +11 -0
  61. data/spec/fixtures/response/create_journal.xml +12 -0
  62. data/spec/fixtures/response/create_payment.xml +12 -0
  63. data/spec/fixtures/response/create_project.xml +12 -0
  64. data/spec/fixtures/response/delete_entity.xml +12 -0
  65. data/spec/fixtures/response/delete_journal.xml +12 -0
  66. data/spec/fixtures/response/list_account_codes.xml +168 -0
  67. data/spec/fixtures/response/list_entities.xml +45 -0
  68. data/spec/fixtures/response/list_invoices.xml +56 -0
  69. data/spec/fixtures/response/list_projects.xml +16 -0
  70. data/spec/fixtures/response/no_api_key_fault.xml +8 -0
  71. data/spec/fixtures/response/well_formed_request.xml +10 -0
  72. data/spec/fixtures/response/wrong_api_key_fault.xml +8 -0
  73. data/spec/spec_helper.rb +26 -0
  74. metadata +212 -0
data/Rakefile ADDED
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # System
4
+ require 'bundler'
5
+ require 'bundler/gem_tasks'
6
+
7
+ require 'shellwords'
8
+ require 'fileutils'
9
+ require 'yaml'
10
+
11
+ require 'date'
12
+ require 'ostruct'
13
+
14
+ require 'ronn'
15
+ require 'rdiscount'
16
+
17
+ require 'benchmark'
18
+ require 'wicked_pdf'
19
+
20
+ require 'clearbooks/version'
21
+
22
+
23
+ ### Project Customization for Thor and Rake
24
+
25
+ project = YAML.load_file( '.project.yaml' )
26
+ project.each_pair { |name, value| self.instance_variable_set( "@#{name.to_s}", value ) }
27
+
28
+
29
+ ### General
30
+
31
+ desc "Generate proper README file from templates" # {{{
32
+ task :readme do |t|
33
+ source = "README.md.template"
34
+ target = "README.md"
35
+
36
+ content = File.readlines( source ).collect!{ |line| line.rstrip }
37
+ version = Clearbooks::VERSION
38
+
39
+ content[ content.index( "$Version$" ) ] = "Version " + version if( content.include?( "$Version$" ) )
40
+ File.write( target, content.join("\n") )
41
+ puts "(II) #{target.to_s} generated from #{source.to_s}"
42
+ end # }}}
43
+
44
+ desc "Generate Yardoc documentation for this project" # {{{
45
+ task :yardoc do |t|
46
+
47
+ # Define new tags for yardoc to detect
48
+ tags = {}
49
+ tags[ "module" ] = "Module"
50
+ tags[ "class" ] = "Class"
51
+ tags[ "fn" ] = "Function"
52
+ tags[ "brief" ] = "Description"
53
+
54
+ # Hide tags we don't want in yardoc output
55
+ hidden = %w[module class fn]
56
+
57
+ # Construct tag string for CLI command
58
+ tags_line = ""
59
+ tags.each_pair { |n,v| tags_line += " --tag #{n.to_s}:\"#{v.to_s}\"" }
60
+ hidden.each { |h| tags_line += " --hide-tag #{h.to_s}" }
61
+
62
+ puts "(II) Generating multi-file yardoc output written to doc/yardoc"
63
+ system "yard --private --protected --markup-provider=redcarpet --markup=markdown #{tags_line.to_s} -o doc/yardoc lib/**/**/*.rb - LICENSE MAINTAINERS"
64
+
65
+ puts "(II) Generating one-file yardoc output written to doc/yardoc_pdf"
66
+ system "yard --private --protected --markup-provider=redcarpet --markup=markdown --one-file #{tags_line.to_s} -o doc/yardoc_pdf lib/**/**/*.rb - LICENSE MAINTAINERS"
67
+
68
+ puts "(II) HTML to PDF written to doc/yardoc_pdf"
69
+ pdf = WickedPdf.new.pdf_from_string( File.read( "doc/yardoc_pdf/index.html" ) )
70
+ File.open 'doc/yardoc_pdf/index.pdf', 'wb' do |file|
71
+ file << pdf
72
+ end
73
+
74
+ end # }}}
75
+
76
+ desc "Generate Yard Graphs for this project" # {{{
77
+ task :yardgraph do |t|
78
+ basedir = "doc/yard-graph"
79
+ FileUtils.mkdir_p( basedir )
80
+ system "yard graph --dependencies --empty-mixins --full > #{basedir.to_s}/graph.dot"
81
+ system "dot -Tpng #{basedir.to_s}/graph.dot > #{basedir.to_s}/graph.png"
82
+ end # }}}
83
+
84
+ ### Actions
85
+
86
+
87
+ ### Helper Functions
88
+
89
+
90
+ ### Load all Rake file tasks
91
+ Dir.glob( "{,lib/}#{@gem_name}/interface/rake/**/*.{rake,rb}" ) { |name| load name }
92
+
93
+
94
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
data/Thorfile ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Make sure load path contains local + global
4
+ $LOAD_PATH << '.'
5
+ $LOAD_PATH << 'lib'
6
+
7
+
8
+ # System includes
9
+ require 'bundler'
10
+
11
+ require 'fileutils'
12
+
13
+
14
+ # Make Thor scripts debug-able, e.g. ruby -r debug -- Thorfile
15
+ require 'thor' unless defined? Thor::Runner
16
+ require 'thor/rake_compat'
17
+
18
+
19
+ require 'clearbooks/version'
20
+
21
+ # @class class Default < Thor
22
+ # @brief Default Tasks for Thor, with thight Rake integration
23
+ class Default < Thor
24
+
25
+ include Thor::RakeCompat
26
+
27
+ Bundler::GemHelper.install_tasks
28
+
29
+ ## Rake Task bindings
30
+
31
+ # @fn def build # {{{
32
+ # @brief Build clearbooks gem
33
+ #
34
+ desc "build", "Build clearbooks-#{Clearbooks::VERSION}.gem into the pkg directory"
35
+ def build
36
+ Rake::Task["build"].execute
37
+ end # }}}
38
+
39
+ # @fn def clean # {{{
40
+ # @brief Clean clearbooks gem generated ressources
41
+ #
42
+ desc "clean", "Clean clearbooks-#{Clearbooks::VERSION}.gem generated files from current directories"
43
+ def clean
44
+ Rake::Task["clean"].execute
45
+ end # }}}
46
+
47
+ # @fn def install {{{
48
+ # @brief Build and install clearbooks gem into system gems
49
+ desc "install", "Build and install clearbooks-#{Clearbooks::VERSION}.gem into system gems"
50
+ def install
51
+ Rake::Task["install"].execute
52
+ end # }}}
53
+
54
+ # @fn def release {{{
55
+ # @brief Build, Tag and push built gem into internal repository
56
+ desc "release", "Create tag v#{Clearbooks::VERSION} and build and push clearbooks-#{Clearbooks::VERSION}.gem to internal gems repository"
57
+ def release
58
+ not ImplementedError # we can push to rubygems since its closed!
59
+ # Rake::Task["release"].execute
60
+ end # }}}
61
+
62
+ # @fn def spec {{{
63
+ # @brief Run RSpec unit tests
64
+ desc "spec", "Run RSpec code examples"
65
+ def spec
66
+ exec "rspec spec"
67
+ end # }}}
68
+
69
+ end # of class Default
70
+
71
+ # Project Customization for Thor and Rake
72
+ project = YAML.load_file( '.project.yaml' )
73
+ project.each_pair { |name, value| self.instance_variable_set( "@#{name.to_s}", value ) }
74
+
75
+ # Load all Thor/Rake file tasks
76
+ Dir.glob( "{,lib/}#{@gem_name}/interface/thor/**/*.{thor,rb}" ) { |name| Thor::Util.load_thorfile name }
77
+ Dir.glob( "{,lib/}#{@gem_name}/interface/rake/**/*.{rake,rb}" ) { |name| load name }
78
+
79
+
80
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
data/bin/clearbooks ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.expand_path('../../lib/', __FILE__)
4
+
5
+ # System includes
6
+ require 'bundler'
7
+ require 'pry'
8
+ require 'thor' unless defined? Thor::Runner
9
+
10
+ # Custom includes
11
+ require_relative '../lib/clearbooks'
12
+
13
+
14
+ # @class Clearbooks executable
15
+ # @brief Main entry point for commandline execution
16
+ class Default < Thor
17
+
18
+ default_task :console
19
+ desc 'console', 'Launch Clearbooks console'
20
+ def console
21
+ Clearbooks.pry
22
+ end
23
+
24
+ end # of class Default
25
+
26
+ Default.start( ARGV )
27
+
28
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,119 @@
1
+ # File: clearbooks.gemspec
2
+ # coding: utf-8
3
+
4
+
5
+ # Make sure lib is in Load path
6
+ lib = File.expand_path( '../lib/', __FILE__ )
7
+ $LOAD_PATH.unshift lib unless $LOAD_PATH.include?( lib )
8
+
9
+ # System includes
10
+ require 'date'
11
+
12
+ # Custom includes
13
+ require 'clearbooks/version'
14
+
15
+ Gem::Specification.new do |spec|
16
+
17
+ spec.name = 'clearbooks'
18
+
19
+ spec.description = %q(Unofficial Clear Books PLC (https://www.clearbooks.co.uk) gem handling all interactions of their SOAP API via native Ruby interface)
20
+ spec.summary = spec.description
21
+
22
+ spec.authors = [ 'Bjoern Rennhak', 'Oleg Kukareka' ]
23
+ spec.email = [ 'bjoern@greylon.com', 'oleg@kukareka.com' ]
24
+
25
+ spec.homepage = 'http://github.com/greylon/clearbooks'
26
+
27
+ spec.licenses = %w[MIT]
28
+
29
+ spec.date = DateTime.now.to_s.split( 'T' ).first
30
+ spec.version = Clearbooks::VERSION
31
+ spec.platform = Gem::Platform::RUBY
32
+
33
+ spec.metadata = {
34
+ 'issue_tracker' => 'http://github.com/greylon/clearbooks/issues'
35
+ }
36
+
37
+ spec.bindir = 'bin'
38
+ spec.executables = %w[clearbooks]
39
+
40
+ spec.require_paths = %w[lib]
41
+
42
+ spec.files = %w[
43
+ AUTHORS.md
44
+ CHANGELOG.md
45
+ COPYING.md
46
+ FAQ.md
47
+ LICENSE.md
48
+ MAINTAINERS.md
49
+ Gemfile
50
+ README.md
51
+ Rakefile
52
+ Thorfile
53
+ clearbooks.gemspec
54
+ ]
55
+
56
+ spec.files += Dir.glob( 'bin/**/*' )
57
+
58
+ spec.files += Dir.glob( 'lib/**/*.rb' )
59
+ spec.files += Dir.glob( 'lib/**/*.thor' )
60
+
61
+ spec.files += Dir.glob( 'spec/**/*' )
62
+
63
+ spec.files += Dir.glob( 'data/**/*' )
64
+
65
+ spec.files += Dir.glob( 'documentation/**/*' )
66
+
67
+ spec.files += Dir.glob( 'examples/**/*' )
68
+
69
+ spec.files += Dir.glob( 'base/**/*' )
70
+
71
+ spec.test_files += Dir.glob( 'test/**/*' )
72
+ spec.test_files += Dir.glob( 'spec/**/*' )
73
+ spec.test_files += Dir.glob( 'features/**/*' )
74
+
75
+ ## Dependencies
76
+
77
+ # Ruby VM
78
+ spec.required_ruby_version = '>= 1.9'
79
+
80
+ # General
81
+ spec.add_runtime_dependency 'thor', '~> 0.19'
82
+
83
+ # Middlewares
84
+ spec.add_runtime_dependency 'savon', '~> 2.11'
85
+
86
+ spec.add_runtime_dependency 'andand', '~> 1.3'
87
+
88
+ spec.add_runtime_dependency 'pry', '~> 0.10'
89
+
90
+
91
+ # Post Install
92
+ spec.post_install_message = <<-EOS
93
+
94
+ ____ _ _____ _ ____ ____ ___ ___ _ ______
95
+ / ___| | | ____| / \ | _ \| __ ) / _ \ / _ \| |/ / ___|
96
+ | | | | | _| / _ \ | |_) | _ \| | | | | | | ' /\___ \
97
+ | |___| |___| |___ / ___ \| _ <| |_) | |_| | |_| | . \ ___) |
98
+ \____|_____|_____/_/ \_\_| \_\____/ \___/ \___/|_|\_\____/
99
+
100
+
101
+ (c) #{spec.date.to_s}, All rights reserved
102
+ Bjoern Rennhak, Greylon Ltd.
103
+
104
+ Don't forget to get Clearbooks API key from http://clearbooks.co.uk
105
+ and save it in ~/.clearbooks/config.yml:
106
+
107
+ $ echo "api_key: {your_api_key}" >> ~/.clearbooks/config.yml
108
+
109
+ You can also provide the API key in ENV['CLEARBOOKS_API_KEY']:
110
+
111
+ $ CLEARBOOKS_API_KEY=your_api_key clearbooks
112
+
113
+ Thanks for installing unofficial Clearbooks Gem !
114
+ EOS
115
+
116
+ end # of Gem::Specification.new do |s|
117
+
118
+
119
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
data/examples/demo.rb ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Custom include
4
+ require_relative 'clearbooks'
5
+
6
+ # FIXME:
7
+ #
8
+ # For now please check the README.md file or see the output of YARD.
data/lib/clearbooks.rb ADDED
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ # Standard library includes
5
+ require 'bundler'
6
+ require 'thor'
7
+ require 'rake'
8
+
9
+ # Custom library includes
10
+ require_relative 'clearbooks/core_ext'
11
+ require_relative 'clearbooks/error'
12
+
13
+
14
+ # @module module Clearbooks
15
+ # @brief Clearbooks modules and classes namespace
16
+ module Clearbooks
17
+
18
+ DEFAULT_CONFIG = '.clearbooks/config.yml'.freeze
19
+
20
+ autoload :Client, 'clearbooks/library/client'
21
+ autoload :Configuration, 'clearbooks/library/configuration'
22
+
23
+ autoload :Base, 'clearbooks/model/base'
24
+ autoload :Invoice, 'clearbooks/model/invoice'
25
+ autoload :Item, 'clearbooks/model/item'
26
+ autoload :Entity, 'clearbooks/model/entity'
27
+ autoload :Project, 'clearbooks/model/project'
28
+ autoload :AccountCode, 'clearbooks/model/account_code'
29
+ autoload :Journal, 'clearbooks/model/journal'
30
+ autoload :Ledger, 'clearbooks/model/ledger'
31
+ autoload :Payment, 'clearbooks/model/payment'
32
+
33
+ class << self
34
+
35
+ # @fn def client {{{
36
+ # @brief Clearbooks client instance. You can use static methods in Clearbooks module instead of referring to the client instance.
37
+ #
38
+ # @example Clearbooks.list_invoices
39
+ # # or
40
+ # Clearbooks.client.list_invoices
41
+ def client
42
+ @client ||= Client.new
43
+ end # }}}
44
+
45
+ # @fn def config {{{
46
+ # @brief Clearbooks configuration
47
+ #
48
+ # @return [Configuration] Returns Configuration object
49
+ def config
50
+ @config ||= Configuration.new
51
+ end # }}}
52
+
53
+ # @fn def configure {{{
54
+ # @brief Use a block syntax to configure the gem
55
+ #
56
+ # @return [Hash] Returns Configuration object
57
+ #
58
+ # @example Clearbooks.configure do |config|
59
+ # config.api_key = 'api_key'
60
+ # config.log = true
61
+ # config.logger = Logger.new(STDOUT)
62
+ # end
63
+ def configure
64
+ yield config
65
+ end # }}}
66
+
67
+ # @fn def method_missing method, *args, &block {{{
68
+ # @brief Duck typing response for Clearbooks missing methods behavior
69
+ #
70
+ # @param [String] method Some unknown method call on Clearbooks class
71
+ # @param [Array] args Some given function arguments with given method call
72
+ # @param [Explicit Block] block Some given block argument with the function and arguments
73
+ #
74
+ def method_missing method, *args, &block
75
+ client.send method, *args, &block
76
+ end # }}}
77
+
78
+ # @fn def respond_to? *args {{{
79
+ # @brief Duck typing response for Clearbooks method queries
80
+ #
81
+ # @param [Array] args Function and function parameter argument list
82
+ #
83
+ def respond_to? *args
84
+ super || client.respond_to?(*args)
85
+ end # }}}
86
+
87
+ end # of class << self
88
+
89
+ end # of module Clearbooks
90
+
91
+
92
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ Dir[ "#{File.dirname(__FILE__)}/core_ext/*.rb" ].sort.each do |path|
5
+ require_relative "core_ext/#{File.basename( path, '.rb' )}"
6
+ end
7
+
8
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ # @class class Array
5
+ # @brief
6
+ class Array
7
+
8
+ class << self
9
+
10
+ # @fn def delete_unless &block {{{
11
+ # @brief Inverted #delete_if function for convenience
12
+ #
13
+ def delete_unless &block
14
+ delete_if{ |element| not block.call( element ) }
15
+ end # }}}
16
+
17
+ # @fn def %(len) {{{
18
+ # @brief Chunk array into convienent sub-chunks
19
+ #
20
+ # @credit http://drnicwilliams.com/2007/03/22/meta-magic-in-ruby-presentation/
21
+ # direct original source at http://redhanded.hobix.com/bits/matchingIntoMultipleAssignment.html
22
+ #
23
+ # now e.g. this is possible
24
+ #
25
+ # ["foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", "foo9", "foo10"]
26
+ # [ ["foo0", "foo1", "foo2"], ["foo3", "foo4", "foo5"], ["foo6", "foo7", "foo8"], ["foo9", "foo10"]]
27
+ #
28
+ def %(len)
29
+ inject([]) do |array, x|
30
+ array << [] if [*array.last].nitems % len == 0
31
+ array.last << x
32
+ array
33
+ end
34
+ end # }}}
35
+
36
+ # @fn def sum {{{
37
+ def sum
38
+ inject( nil ) { |sum,x| sum ? sum+x : x }
39
+ end # }}}
40
+
41
+ # @fn def mean {{{
42
+ # @brief
43
+ def mean
44
+ sum / size
45
+ end # }}}
46
+
47
+ end # of class << self
48
+ end # of class Array
49
+
50
+
51
+ # vim:ts=2:tw=100:wm=100