<< Masa.20101109-setup-eshop | 2010 | Masa.20101105-create-patinfo-ebook >>
Files necessary to run a converter example (from yaml data to epub file)
Test 1. Converter script (converter_for_firefox.rb)
#!/usr/bin/env ruby19
$: << File.expand_path('../lib', File.dirname(__FILE__))
require 'ebps'
require 'ebps/util/mail'
def identify_module namespace, name
  module_name = name.gsub /(^|_)./ do |match| match.upcase.delete '_' end
  namespace.const_get module_name
end
begin
  log = []
  # Read modules
  import_from = EBPS.config.import_from
  export_to = EBPS.config.export_to
  require "ebps/conversion/#{import_from}"
  require "ebps/conversion/#{export_to}"
  importer = identify_module EBPS::Conversion, import_from
  exporter = identify_module EBPS::Conversion, export_to
  # Import process
  model = []
  source_path = EBPS.config.source
  inputs = ""
  if File.ftype(source_path) == 'directory'
    inputs << "Input files for conversion:"
    Dir.foreach(source_path) do |name|
      path = File.join source_path, name
      if File.ftype(path) == 'file'
        inputs << "\n" << path
        File.open(path) do |fh|
          model.concat importer.import(fh, path)
        end
      end
    end
  else
    inputs << "Input file for conversion: " << source_path
    source = File.open(source_path)
    model = importer.import source, source_path
  end
  log.push inputs
  # Export process
  target = EBPS.config.target
  exporter.export model, target
  log.push sprintf("The Ebook %s was generated and stored in %s",
                   File.basename(target), File.dirname(target))
rescue StandardError => err
  log.push err
ensure
  EBPS::Util::Mail.notify log
end
2. Configuration file (config.yml)
--- smtp_server: smtp_server smtp_user: username@domain smtp_pass: 'password' report_to: - email_address source: ./data.yml target: ./sample.epub import_from: import_module_sample export_to: epub language: de title: Firmenliste Schweiz
3. Data file (data.yml)
--- !ywesee,2010/CompanyInfo
oid: 123456789
descriptions: !ywesee,2010/SimpleLanguage::Descriptions
  de: !ywesee,2010/CompanyInfo2010
    name: ywesee GmbH
    short_description: !ywesee,2010/Text::Chapter
      heading: ywesee - intellectual capital connected
      sections: []
    general_information: !ywesee,2010/Text::Chapter
      heading: About ywesee GmbH
      sections:
      - !ywesee,2010/Text::Section
        subheading: ""
        paragraphs:
        - !ywesee,2010/Text::Paragraph
          formats:
          - !ywesee,2010/Text::Format
            values:
            - :italic
            start: 0
            end: 9
          - !ywesee,2010/Text::Format
            values: []
            start: 10
            end: -1
          text: "ywesee GmbH is an OpenSource Software company with a bias for OpenStandards and a dedicated focus on the HealthCare industry."
          preformatted: false
        - !ywesee,2010/Text::Paragraph
          formats:
          - !ywesee,2010/Text::Format
            values:
            - :italic
            start: 0
            end: 11
          - !ywesee,2010/Text::Format
            values: []
            start: 12
            end: -1
          text: "Web site: http://www.ywesee.com"
          preformatted: false
    address_form: !ywesee,2010/Text::Chapter
      heading: Kontakt zu ywesee
      sections:
      - !ywesee,2010/Text::Section
        subheading: "Address"
        paragraphs:
        - !ywesee,2010/Text::Paragraph
          formats:
          - !ywesee,2010/Text::Format
            values: []
            start: 0
            end: -1
          text: "Winterthurerstrasse 52, 8006 Zürich, Schweiz."
          preformatted: false
4. Import module (import_module_sample.rb)
require 'ebps/text/document'
require 'yaml'
module EBPS
  YAML.add_domain_type 'ywesee,2010', 'CompanyInfo' do |type, val|
    if descr = val.delete('descriptions')
      doc = descr[EBPS.config.language]
      doc.metadata.update val
      doc
    end
  end
  YAML.add_domain_type 'ywesee,2010', 'CompanyInfo2010' do |type, val|
    chapters = %w{short_description general_information address_form}
    Conversion::ImportModuleSample.assemble_document chapters, val
  end
  YAML.add_domain_type 'ywesee,2010', 'Text::Chapter' do |type, val|
    chp = Text::Chapter.new
    chp.heading << val['heading']
    Conversion::ImportModuleSample.encode chp.heading
    chp.paragraphs.concat val['sections'].flatten.compact
    chp
  end
  YAML.add_domain_type 'ywesee,2010', 'Text::Section' do |type, val|
    paragraphs = []
    if (txt = val['subheading']) && !txt.empty?
      sh = Text::Subheading.new
      sh << txt
      Conversion::ImportModuleSample.encode sh.text
      paragraphs << sh
    end
    paragraphs.concat val['paragraphs']
    paragraphs
  end
  YAML.add_domain_type 'ywesee,2010', 'Text::Paragraph' do |type, val|
    par = Text::Paragraph.new
    par << val['text']
    Conversion::ImportModuleSample.encode par.text
    par.formats.replace val['formats']
    if val['preformatted']
      par.formats.each do |fmt|
        fmt.values << 'pre'
      end
    end
    par
  end
  YAML.add_domain_type 'ywesee,2010', 'Text::Format' do |type, val|
    fmt = Text::Format.new
    fmt.values = val['values']
    fmt.start = val['start']
    fmt.end = val['end']
    fmt
  end
  YAML.add_domain_type 'ywesee,2010', 'SimpleLanguage::Descriptions' do |type, val|
    val
  end
  module Conversion
    module ImportModuleSample
      def self.import string_or_io, path=nil
        collection = {}
        YAML.each_document string_or_io do |doc|
          if doc
            collection.store Digest::MD5.hexdigest(doc.to_s), doc
          end
        end
        ## apparently we have some nil-values here (?)
        collection.values.compact
      end
      def self.assemble_document chapters, yaml_value
        doc = Text::Document.new
        doc.title = Conversion::ImportModuleSample.encode(yaml_value['name'])
        chapters.each do |name|
          if chapter = yaml_value[name]
            doc.add_chapter chapter
          end
        end
        doc
      end
      def self.encode txt
        txt.force_encoding 'UTF-8'
        txt
      end
    end
  end
end
5. Export module (lib/ebps/convertion/epub.rb)
Run
masa@masa ~/ywesee/ebps/example $ ruby1.9 ./converter_for_firefox.rb config="./config.yml"
Result

Commit
Emails
References
Install and test log
masa@masa ~/ywesee/bbmb $ sudo ruby setup.rb 
Passwort: 
- - CONFIGURE - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
/usr/lib64/ruby/1.8/yaml/rubytypes.rb:147:in `is_binary_data?': undefined method `>' for nil:NilClass (NoMethodError)
        from /usr/lib64/ruby/1.8/yaml/rubytypes.rb:166:in `to_yaml'
        from /usr/lib64/ruby/1.8/yaml.rb:391:in `call'
        from /usr/lib64/ruby/1.8/yaml.rb:391:in `emit'
        from /usr/lib64/ruby/1.8/yaml.rb:391:in `quick_emit'
        from /usr/lib64/ruby/1.8/yaml/rubytypes.rb:165:in `to_yaml'
        from /usr/lib64/ruby/1.8/yaml/rubytypes.rb:41:in `node_export'
        from /usr/lib64/ruby/1.8/yaml/rubytypes.rb:41:in `add'
        from /usr/lib64/ruby/1.8/yaml/rubytypes.rb:41:in `to_yaml'
         ... 12 levels...
        from setup.rb:1245:in `__send__'
        from setup.rb:1245:in `run'
        from setup.rb:1193:in `run'
        from setup.rb:1345
Notes
masa@masa ~/ywesee/bbmb $ sudo ruby1.9 setup.rb 
- - CONFIGURE - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Configuration saved.
- - INSTALL - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
* bin -> /usr/bin
* lib -> /usr/lib64/ruby/site_ruby/1.9.1
masa@masa ~/ywesee/bbmb $ ls
bin  InstalledFiles  lib  LICENSE  SetupConfig  setup.rb  test
masa@masa ~/ywesee/bbmb $ ruby1.9 test/suite.rb 
test/suite.rb:10:in `require': no such file to load -- test/model/test_customer.rb (LoadError)
        from test/suite.rb:10:in `block in <main>'
        from /usr/lib64/ruby/1.9.1/find.rb:41:in `block in find'
        from /usr/lib64/ruby/1.9.1/find.rb:40:in `catch'
        from /usr/lib64/ruby/1.9.1/find.rb:40:in `find'
        from test/suite.rb:8:in `<main>'
Notes
masa@masa ~/ywesee/xmlconv $ sudo ruby1.9 setup.rb 
- - CONFIGURE - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Configuration saved.
- - INSTALL - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
* bin -> /usr/bin
* lib -> /usr/lib64/ruby/site_ruby/1.9.1
* data -> /usr/share
masa@masa ~/ywesee/xmlconv $ ruby1.9 test/suite.rb 
/home/masa/ywesee/xmlconv/test/mock.rb:19:in `require': no such file to load -- runit/error (LoadError)
        from /home/masa/ywesee/xmlconv/test/mock.rb:19:in `<top (required)>'
        from /home/masa/ywesee/xmlconv/test/test_i2/document.rb:9:in `require'
        from /home/masa/ywesee/xmlconv/test/test_i2/document.rb:9:in `<top (required)>'
        from test/suite.rb:12:in `require'
        from test/suite.rb:12:in `block (2 levels) in <main>'
        from test/suite.rb:10:in `foreach'
        from test/suite.rb:10:in `block in <main>'
        from test/suite.rb:7:in `foreach'
        from test/suite.rb:7:in `<main>'
Notes
masa@masa ~/ywesee/xmlconv $ cd ../xmlconv2/
masa@masa ~/ywesee/xmlconv2 $ sudo ruby1.9 setup.rb 
- - CONFIGURE - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Configuration saved.
- - INSTALL - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
* bin -> /usr/bin
* data -> /usr/share
masa@masa ~/ywesee/xmlconv2 $ ruby1.9 test/suite.rb 
/home/masa/ywesee/xmlconv2/test/mock.rb:19:in `require': no such file to load -- runit/error (LoadError)
        from /home/masa/ywesee/xmlconv2/test/mock.rb:19:in `<top (required)>'
        from /home/masa/ywesee/xmlconv2/test/test_conversion/bdd_geh.rb:11:in `require'
        from /home/masa/ywesee/xmlconv2/test/test_conversion/bdd_geh.rb:11:in `<top (required)>'
        from test/suite.rb:12:in `require'
        from test/suite.rb:12:in `block (2 levels) in <main>'
        from test/suite.rb:10:in `foreach'
        from test/suite.rb:10:in `block in <main>'
        from test/suite.rb:7:in `foreach'
        from test/suite.rb:7:in `<main>'
Notes
Log
masa@masa ~/ywesee/bbmb $ ruby1.9 bin/bbmbd 
bin/bbmbd:3: warning: variable $KCODE is no longer effective; ignored
/usr/lib64/ruby/site_ruby/1.9.1/bbmb/html/util/known_user.rb:4:in `require': no such file to load -- sbsm/user (LoadError)
        from /usr/lib64/ruby/site_ruby/1.9.1/bbmb/html/util/known_user.rb:4:in `<top (required)>'
        from /usr/lib64/ruby/site_ruby/1.9.1/bbmb/util/server.rb:5:in `require'
        from /usr/lib64/ruby/site_ruby/1.9.1/bbmb/util/server.rb:5:in `<top (required)>'
        from bin/bbmbd:10:in `require'
        from bin/bbmbd:10:in `<main>'
Install sbsm
masa@masa ~/ywesee/ruby19/sbsm $ sudo ruby1.9 setup.rb - - CONFIGURE - - - - - - - - - - - - - - - - - - - - - - - - - - - - Configuration saved. - - INSTALL - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * lib -> /usr/lib64/ruby/site_ruby/1.9.1 * data -> /usr/share
Run bbmbd again
masa@masa ~/ywesee/ruby19/bbmb $ ruby1.9 bin/bbmbd bin/bbmbd:3: warning: variable $KCODE is no longer effective; ignored /usr/lib64/ruby/gems/1.9.1/gems/character-encodings-0.4.1/lib/encoding/character/utf-8.rb:5:in `require': no such file to load -- encoding/character/utf-8/utf8 (LoadError)
Install character-encodings => failed
masa@masa ~/ywesee/ruby19/bbmb $ sudo ruby1.9 /usr/bin/gem install character-encodings
Building native extensions.  This could take a while...
ERROR:  Error installing character-encodings:
        ERROR: Failed to build gem native extension.
/usr/bin/ruby1.9 extconf.rb
extconf.rb:4: invalid multibyte char (US-ASCII)
extconf.rb:4: invalid multibyte char (US-ASCII)
extconf.rb:4: syntax error, unexpected $end, expecting keyword_end
  checking_for "‘#{opt}’ option to compiler" do
                  ^
Gem files will remain installed in /usr/lib64/ruby/gems/1.9.1/gems/character-encodings-0.4.1 for inspection.
Results logged to /usr/lib64/ruby/gems/1.9.1/gems/character-encodings-0.4.1/ext/encoding/character/utf-8/gem_make.out
masa@masa ~/ywesee/bbmb $ bin/bbmbd 
/usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- json/objects (LoadError)
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from /home/masa/ywesee/bbmb/lib/bbmb/html/view/json.rb:5
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from /home/masa/ywesee/bbmb/lib/bbmb/html/state/json.rb:4
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from /home/masa/ywesee/bbmb/lib/bbmb/html/state/current_order.rb:6
         ... 11 levels...
        from /home/masa/ywesee/bbmb/lib/bbmb/util/server.rb:6
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from bin/bbmbd:10
Check libraries
masa@masa ~/ywesee/bbmb $ gem search json *** LOCAL GEMS *** json (1.4.3) json_pure (1.4.3)
Install ruby-json
masa@masa ~/ywesee/bbmb $ sudo gem install ruby-json
Successfully installed ruby-json-1.1.2
1 gem installed
Installing ri documentation for ruby-json-1.1.2...
ERROR:  While executing gem ... (NoMethodError)
    undefined method `>' for nil:NilClass
Run again
masa@masa ~/ywesee/bbmb $ gem search json 
*** LOCAL GEMS ***
json (1.4.3)
json_pure (1.4.3)
ruby-json (1.1.2)
masa@masa ~/ywesee/bbmb $ bin/bbmbd 
/usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- bbmb/util/csv_importer (LoadError)
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from bin/bbmbd:16
        from bin/bbmbd:15:in `each'
        from bin/bbmbd:15
Check csv_importer
masa@masa ~/ywesee/bbmb/lib/bbmb/util $ ls invoicer.rb mail.rb multilingual.rb numbers.rb password_generator.rb polling_manager.rb server.rb target_dir.rb transfer_dat.rb updater.rb
Notes
Copy csv_importer.rb and run
masa@masa ~/ywesee/bbmb $ cp ~/ywesee/sandoz.bbmb.ch/lib/bbmb/util/csv_importer.rb lib/bbmb/util/
masa@masa ~/ywesee/bbmb $ bin/bbmbd 
/usr/lib64/ruby/site_ruby/1.8/DBD/Pg/Pg.rb:118:in `initialize': FATAL:  database "bbmb" does not exist (DBI::OperationalError)
        from /usr/lib64/ruby/site_ruby/1.8/DBD/Pg/Pg.rb:62:in `new'
        from /usr/lib64/ruby/site_ruby/1.8/DBD/Pg/Pg.rb:62:in `connect'
        from /usr/lib64/ruby/site_ruby/1.8/dbi.rb:448:in `connect'
        from /usr/lib64/ruby/site_ruby/1.8/dbi.rb:221:in `connect'
        from /usr/lib64/ruby/site_ruby/1.8/odba/connection_pool.rb:60:in `_connect'
        from /usr/lib64/ruby/site_ruby/1.8/odba/connection_pool.rb:59:in `times'
        from /usr/lib64/ruby/site_ruby/1.8/odba/connection_pool.rb:59:in `_connect'
        from /usr/lib64/ruby/site_ruby/1.8/odba/connection_pool.rb:56:in `connect'
        from /usr/lib64/ruby/site_ruby/1.8/odba/connection_pool.rb:56:in `synchronize'
        from /usr/lib64/ruby/site_ruby/1.8/odba/connection_pool.rb:56:in `connect'
        from /usr/lib64/ruby/site_ruby/1.8/odba/connection_pool.rb:19:in `initialize'
        from /home/masa/ywesee/bbmb/lib/bbmb/persistence/odba.rb:38:in `new'
        from /home/masa/ywesee/bbmb/lib/bbmb/persistence/odba.rb:38
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
        from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from bin/bbmbd:18
Notes
masa@masa ~/ywesee/bbmb $ createuser sandxx -P Geben Sie das Passwort der neuen Rolle ein: Geben Sie es noch einmal ein: Soll die neue Rolle ein Superuser sein? (j/n) j masa@masa ~/ywesee/bbmb $ sudo -u postgres createdb -E UTF8 -T template0 sandxx_bbmb masa@masa ~/ywesee/bbmb $ cd src/ masa@masa ~/ywesee/bbmb/src $ scp xxx@$WHITIE:/var/.../postgresql_database-sandxx_bbmb-backup.gz . masa@masa ~/ywesee/bbmb/src $ zcat postgresql_database-sandxx_bbmb-backup.gz | psql -U sandxx sandxx_bbmb
Change default configuration parameters
lib/bbmb/config.rb
...
#    'db_name'                         => 'bbmb',
#    'db_user'                         => 'bbmb',
#    'db_auth'                         => 'bbmb',
    'db_name'                         => 'sandxx_bbmb',
    'db_user'                         => 'sandxx',
    'db_auth'                         => 'sandxx',
...
#    'mail_order_to'                   => 'orders.test@bbmb.ch',
    'mail_order_to'                   => 'mhatakeyama@ywesee.com',
...
    #'smtp_server'                     => 'mail.bbmb.ch',
    'smtp_server'                     => 'smtp.gmail.com',
    #'smtp_user'                       => nil,
    'smtp_user'                       => 'mhatakeyama@ywesee.com',
...
Test run
masa@masa ~/ywesee/bbmb $ bin/bbmbd ERROR: relation "object" already exists ERROR: relation "prefetchable_index" already exists ERROR: relation "extent_index" already exists ERROR: relation "object_connection" already exists ERROR: relation "target_id_index" already exists ERROR: relation "collection" already exists ERROR: relation "target_id_bbmb_model_product_pcode" already exists ERROR: relation "target_id_bbmb_model_customer_customer_id" already exists ERROR: relation "target_id_bbmb_model_product_description" already exists ERROR: relation "target_id_bbmb_model_product_article_number" already exists ERROR: relation "target_id_bbmb_model_product_catalogue1" already exists ERROR: relation "target_id_bbmb_model_product_catalogue2" already exists ERROR: relation "target_id_bbmb_model_customer_ean13" already exists ERROR: relation "target_id_bbmb_model_product_ean13" already exists ERROR: relation "target_id_bbmb_model_customer_email" already exists /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31: command not found: cg-object-id I, [2010-11-08T16:37:55.968987 #1459] INFO -- start: starting bbmb-server on druby://localhost:12000
Notes
Next